diff options
author | Mike Pall <mike> | 2013-04-23 00:08:04 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-04-23 00:10:01 +0200 |
commit | 2cdf90f0683e4da3afc8554d17859260fdc6b4dc (patch) | |
tree | 7709bdec5c3e562067e792d14b1e3f46df96849d /src/lj_opt_fold.c | |
parent | 1ae3e5204b8cbd8b643a5a3ab747211be8fe6fba (diff) | |
download | luajit-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.c | 28 |
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) | |||
541 | LJFOLD(BUFPUT any any) | 541 | LJFOLD(BUFPUT any any) |
542 | LJFOLDF(bufput_kgc) | 542 | LJFOLDF(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) | |||
570 | LJFOLDF(bufstr_kfold_cse) | 570 | LJFOLDF(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. */ |