diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_opt_fold.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 1172f4fc..f4872046 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -917,6 +917,8 @@ LJFOLDF(simplify_conv_sext) | |||
917 | if (!(fins->op2 & IRCONV_SEXT)) | 917 | if (!(fins->op2 & IRCONV_SEXT)) |
918 | return NEXTFOLD; | 918 | return NEXTFOLD; |
919 | PHIBARRIER(fleft); | 919 | PHIBARRIER(fleft); |
920 | if (fleft->o == IR_XLOAD && (irt_isu8(fleft->t) || irt_isu16(fleft->t))) | ||
921 | goto ok_reduce; | ||
920 | if (fleft->o == IR_ADD && irref_isk(fleft->op2)) { | 922 | if (fleft->o == IR_ADD && irref_isk(fleft->op2)) { |
921 | ofs = (int64_t)IR(fleft->op2)->i; | 923 | ofs = (int64_t)IR(fleft->op2)->i; |
922 | ref = fleft->op1; | 924 | ref = fleft->op1; |
@@ -926,6 +928,7 @@ LJFOLDF(simplify_conv_sext) | |||
926 | IRRef lo = J->scev.dir ? J->scev.start : J->scev.stop; | 928 | IRRef lo = J->scev.dir ? J->scev.start : J->scev.stop; |
927 | lua_assert(irt_isint(J->scev.t)); | 929 | lua_assert(irt_isint(J->scev.t)); |
928 | if (lo && IR(lo)->i + ofs >= 0) { | 930 | if (lo && IR(lo)->i + ofs >= 0) { |
931 | ok_reduce: | ||
929 | #if LJ_TARGET_X64 | 932 | #if LJ_TARGET_X64 |
930 | /* Eliminate widening. All 32 bit ops do an implicit zero-extension. */ | 933 | /* Eliminate widening. All 32 bit ops do an implicit zero-extension. */ |
931 | return LEFTFOLD; | 934 | return LEFTFOLD; |