aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2024-08-15 00:20:54 +0200
committerMike Pall <mike>2024-08-15 00:20:54 +0200
commit2d54213e7ca9f276e080671dfcad2d26fbea2de4 (patch)
treeb2113b5edd9d841d0fcf9646792e71175e14ddd4
parent833600390cb34d2e1d3f05b8eae8bebf9fd7a873 (diff)
downloadluajit-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.c9
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
1137LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */ 1137LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */
1138LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32*/ 1138LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32 */
1139LJFOLDF(simplify_conv_int_num) 1139LJFOLDF(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
1171LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */ 1171LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */
1172LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */ 1172LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */
1173LJFOLD(CONV CONV IRCONV_INT_U32) /* _INT or _U32 */
1173LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */ 1174LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */
1174LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */ 1175LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */
1176LJFOLD(CONV CONV IRCONV_U32_INT) /* _INT or _U32 */
1175LJFOLDF(simplify_conv_int_i64) 1177LJFOLDF(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. */
1220LJFOLD(FPMATH CONV IRFPM_FLOOR) 1222LJFOLD(FPMATH CONV IRFPM_FLOOR)
1221LJFOLD(FPMATH CONV IRFPM_CEIL) 1223LJFOLD(FPMATH CONV IRFPM_CEIL)
1222LJFOLD(FPMATH CONV IRFPM_TRUNC) 1224LJFOLD(FPMATH CONV IRFPM_TRUNC)
1223LJFOLDF(simplify_floor_conv) 1225LJFOLDF(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}