summaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-04-23 00:08:04 +0200
committerMike Pall <mike>2013-04-23 00:10:01 +0200
commit2cdf90f0683e4da3afc8554d17859260fdc6b4dc (patch)
tree7709bdec5c3e562067e792d14b1e3f46df96849d /src/lj_opt_fold.c
parent1ae3e5204b8cbd8b643a5a3ab747211be8fe6fba (diff)
downloadluajit-2cdf90f0683e4da3afc8554d17859260fdc6b4dc.tar.gz
luajit-2cdf90f0683e4da3afc8554d17859260fdc6b4dc.tar.bz2
luajit-2cdf90f0683e4da3afc8554d17859260fdc6b4dc.zip
Always emit TOSTR for non-string CAT operands. Fuse in backend.
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index fc91a75e..e3194f76 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -541,13 +541,13 @@ LJFOLDF(bufput_append)
541LJFOLD(BUFPUT any any) 541LJFOLD(BUFPUT any any)
542LJFOLDF(bufput_kgc) 542LJFOLDF(bufput_kgc)
543{ 543{
544 if (fright->o == IR_KGC) { 544 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) {
545 GCstr *s2 = ir_kstr(fright); 545 GCstr *s2 = ir_kstr(fright);
546 MSize len2 = s2->len; 546 MSize len2 = s2->len;
547 if (len2 == 0) { /* Empty string? */ 547 if (len2 == 0) { /* Empty string? */
548 return LEFTFOLD; 548 return LEFTFOLD;
549 } else { 549 } else {
550 if (fleft->o == IR_BUFPUT && IR(fleft->op2)->o == IR_KGC && 550 if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) &&
551 !irt_isphi(fleft->t)) { 551 !irt_isphi(fleft->t)) {
552 /* Join two constant string puts in a row. */ 552 /* Join two constant string puts in a row. */
553 GCstr *s1 = ir_kstr(IR(fleft->op2)); 553 GCstr *s1 = ir_kstr(IR(fleft->op2));
@@ -570,20 +570,16 @@ LJFOLD(BUFSTR any any)
570LJFOLDF(bufstr_kfold_cse) 570LJFOLDF(bufstr_kfold_cse)
571{ 571{
572 lua_assert(fright->o == IR_BUFHDR || fright->o == IR_BUFPUT); 572 lua_assert(fright->o == IR_BUFHDR || fright->o == IR_BUFPUT);
573 if (fright->o == IR_BUFHDR) { /* No put operations? */ 573 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
574 if (!(fright->op2 & IRBUFHDR_APPEND)) /* Empty buffer? */ 574 if (fright->o == IR_BUFHDR) { /* No put operations? */
575 return lj_ir_kstr(J, &J2G(J)->strempty); 575 if (!(fright->op2 & IRBUFHDR_APPEND)) /* Empty buffer? */
576 fins->op2 = fright->prev; /* Relies on checks in bufput_append. */ 576 return lj_ir_kstr(J, &J2G(J)->strempty);
577 return CSEFOLD; 577 fins->op2 = fright->prev; /* Relies on checks in bufput_append. */
578 } else { 578 return CSEFOLD;
579 /* Shortcut for a single put operation. */ 579 } else {
580 IRIns *irb = IR(fright->op1); 580 IRIns *irb = IR(fright->op1);
581 if (irb->o == IR_BUFHDR && !(irb->op2 & IRBUFHDR_APPEND)) { 581 if (irb->o == IR_BUFHDR && !(irb->op2 & IRBUFHDR_APPEND))
582 IRRef ref = fright->op2; 582 return fright->op2; /* Shortcut for a single put operation. */
583 if (irt_isstr(IR(ref)->t))
584 return ref;
585 lua_assert(irt_isinteger(IR(ref)->t) || irt_isnum(IR(ref)->t));
586 return emitir(IRT(IR_TOSTR, IRT_STR), ref, 0);
587 } 583 }
588 } 584 }
589 /* Try to CSE the whole chain. */ 585 /* Try to CSE the whole chain. */