diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index d2c20546..8f05e7c8 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -771,6 +771,28 @@ LJFOLDF(cse_toint) | |||
771 | return EMITFOLD; /* No fallthrough to regular CSE. */ | 771 | return EMITFOLD; /* No fallthrough to regular CSE. */ |
772 | } | 772 | } |
773 | 773 | ||
774 | /* Special CSE rule for CONV. */ | ||
775 | LJFOLD(CONV any any) | ||
776 | LJFOLDF(cse_conv) | ||
777 | { | ||
778 | if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) { | ||
779 | IRRef op1 = fins->op1, op2 = (fins->op2 & IRCONV_MODEMASK); | ||
780 | uint8_t guard = irt_isguard(fins->t); | ||
781 | IRRef ref = J->chain[IR_CONV]; | ||
782 | while (ref > op1) { | ||
783 | IRIns *ir = IR(ref); | ||
784 | /* CSE also depends on the target type! | ||
785 | ** OTOH commoning with stronger checks is ok, too. | ||
786 | */ | ||
787 | if (ir->op1 == op1 && irt_sametype(ir->t, fins->t) && | ||
788 | (ir->op2 & IRCONV_MODEMASK) == op2 && irt_isguard(ir->t) >= guard) | ||
789 | return ref; | ||
790 | ref = ir->prev; | ||
791 | } | ||
792 | } | ||
793 | return EMITFOLD; /* No fallthrough to regular CSE. */ | ||
794 | } | ||
795 | |||
774 | /* -- Strength reduction of widening -------------------------------------- */ | 796 | /* -- Strength reduction of widening -------------------------------------- */ |
775 | 797 | ||
776 | LJFOLD(TOI64 any 3) /* IRTOINT_ZEXT64 */ | 798 | LJFOLD(TOI64 any 3) /* IRTOINT_ZEXT64 */ |