diff options
author | Mike Pall <mike> | 2024-08-15 00:20:54 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2024-08-15 00:20:54 +0200 |
commit | 2d54213e7ca9f276e080671dfcad2d26fbea2de4 (patch) | |
tree | b2113b5edd9d841d0fcf9646792e71175e14ddd4 | |
parent | 833600390cb34d2e1d3f05b8eae8bebf9fd7a873 (diff) | |
download | luajit-2d54213e7ca9f276e080671dfcad2d26fbea2de4.tar.gz luajit-2d54213e7ca9f276e080671dfcad2d26fbea2de4.tar.bz2 luajit-2d54213e7ca9f276e080671dfcad2d26fbea2de4.zip |
Add more FOLD rules for integer conversions.
Thanks to Peter Cawley. #1246
-rw-r--r-- | src/lj_opt_fold.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 62483c26..098bf431 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -1135,7 +1135,7 @@ LJFOLDF(shortcut_conv_num_int) | |||
1135 | } | 1135 | } |
1136 | 1136 | ||
1137 | LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */ | 1137 | LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */ |
1138 | LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32*/ | 1138 | LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32 */ |
1139 | LJFOLDF(simplify_conv_int_num) | 1139 | LJFOLDF(simplify_conv_int_num) |
1140 | { | 1140 | { |
1141 | /* Fold even across PHI to avoid expensive num->int conversions in loop. */ | 1141 | /* Fold even across PHI to avoid expensive num->int conversions in loop. */ |
@@ -1170,8 +1170,10 @@ LJFOLDF(simplify_conv_i64_num) | |||
1170 | 1170 | ||
1171 | LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */ | 1171 | LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */ |
1172 | LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */ | 1172 | LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */ |
1173 | LJFOLD(CONV CONV IRCONV_INT_U32) /* _INT or _U32 */ | ||
1173 | LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */ | 1174 | LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */ |
1174 | LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */ | 1175 | LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */ |
1176 | LJFOLD(CONV CONV IRCONV_U32_INT) /* _INT or _U32 */ | ||
1175 | LJFOLDF(simplify_conv_int_i64) | 1177 | LJFOLDF(simplify_conv_int_i64) |
1176 | { | 1178 | { |
1177 | int src; | 1179 | int src; |
@@ -1216,14 +1218,13 @@ LJFOLDF(simplify_tobit_conv) | |||
1216 | return NEXTFOLD; | 1218 | return NEXTFOLD; |
1217 | } | 1219 | } |
1218 | 1220 | ||
1219 | /* Shortcut floor/ceil/round + IRT_NUM <- IRT_INT/IRT_U32 conversion. */ | 1221 | /* Shortcut floor/ceil/trunc + IRT_NUM <- integer conversion. */ |
1220 | LJFOLD(FPMATH CONV IRFPM_FLOOR) | 1222 | LJFOLD(FPMATH CONV IRFPM_FLOOR) |
1221 | LJFOLD(FPMATH CONV IRFPM_CEIL) | 1223 | LJFOLD(FPMATH CONV IRFPM_CEIL) |
1222 | LJFOLD(FPMATH CONV IRFPM_TRUNC) | 1224 | LJFOLD(FPMATH CONV IRFPM_TRUNC) |
1223 | LJFOLDF(simplify_floor_conv) | 1225 | LJFOLDF(simplify_floor_conv) |
1224 | { | 1226 | { |
1225 | if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT || | 1227 | if ((uint32_t)(fleft->op2 & IRCONV_SRCMASK) - (uint32_t)IRT_I8 <= (uint32_t)(IRT_U64 - IRT_U8)) |
1226 | (fleft->op2 & IRCONV_SRCMASK) == IRT_U32) | ||
1227 | return LEFTFOLD; | 1228 | return LEFTFOLD; |
1228 | return NEXTFOLD; | 1229 | return NEXTFOLD; |
1229 | } | 1230 | } |