summaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c22
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. */
775LJFOLD(CONV any any)
776LJFOLDF(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
776LJFOLD(TOI64 any 3) /* IRTOINT_ZEXT64 */ 798LJFOLD(TOI64 any 3) /* IRTOINT_ZEXT64 */