diff options
-rw-r--r-- | src/lj_opt_fold.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 7d45b7b5..d00fdd56 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -1006,11 +1006,16 @@ LJFOLDF(simplify_conv_flt_num) | |||
1006 | LJFOLD(TOBIT CONV KNUM) | 1006 | LJFOLD(TOBIT CONV KNUM) |
1007 | LJFOLDF(simplify_tobit_conv) | 1007 | LJFOLDF(simplify_tobit_conv) |
1008 | { | 1008 | { |
1009 | if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT || | 1009 | /* Fold even across PHI to avoid expensive num->int conversions in loop. */ |
1010 | (fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { | 1010 | if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) { |
1011 | /* Fold even across PHI to avoid expensive num->int conversions in loop. */ | ||
1012 | lua_assert(irt_isnum(fleft->t)); | 1011 | lua_assert(irt_isnum(fleft->t)); |
1013 | return fleft->op1; | 1012 | return fleft->op1; |
1013 | } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { | ||
1014 | lua_assert(irt_isnum(fleft->t)); | ||
1015 | fins->o = IR_CONV; | ||
1016 | fins->op1 = fleft->op1; | ||
1017 | fins->op2 = (IRT_INT<<5)|IRT_U32; | ||
1018 | return RETRYFOLD; | ||
1014 | } | 1019 | } |
1015 | return NEXTFOLD; | 1020 | return NEXTFOLD; |
1016 | } | 1021 | } |