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.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index eb500db9..325b0372 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -226,6 +226,8 @@ static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op)
226 case IR_BSAR: k1 >>= (k2 & 31); break; 226 case IR_BSAR: k1 >>= (k2 & 31); break;
227 case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break; 227 case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break;
228 case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break; 228 case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break;
229 case IR_MIN: k1 = k1 < k2 ? k1 : k2; break;
230 case IR_MAX: k1 = k1 > k2 ? k1 : k2; break;
229 default: lua_assert(0); break; 231 default: lua_assert(0); break;
230 } 232 }
231 return k1; 233 return k1;
@@ -242,6 +244,8 @@ LJFOLD(BSHR KINT KINT)
242LJFOLD(BSAR KINT KINT) 244LJFOLD(BSAR KINT KINT)
243LJFOLD(BROL KINT KINT) 245LJFOLD(BROL KINT KINT)
244LJFOLD(BROR KINT KINT) 246LJFOLD(BROR KINT KINT)
247LJFOLD(MIN KINT KINT)
248LJFOLD(MAX KINT KINT)
245LJFOLDF(kfold_intarith) 249LJFOLDF(kfold_intarith)
246{ 250{
247 return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); 251 return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o));
@@ -1434,19 +1438,29 @@ LJFOLDF(reassoc_shift)
1434 1438
1435LJFOLD(MIN MIN KNUM) 1439LJFOLD(MIN MIN KNUM)
1436LJFOLD(MAX MAX KNUM) 1440LJFOLD(MAX MAX KNUM)
1441LJFOLD(MIN MIN KINT)
1442LJFOLD(MAX MAX KINT)
1437LJFOLDF(reassoc_minmax_k) 1443LJFOLDF(reassoc_minmax_k)
1438{ 1444{
1439 IRIns *irk = IR(fleft->op2); 1445 IRIns *irk = IR(fleft->op2);
1440 if (irk->o == IR_KNUM) { 1446 if (irk->o == IR_KNUM) {
1441 lua_Number a = ir_knum(irk)->n; 1447 lua_Number a = ir_knum(irk)->n;
1442 lua_Number b = knumright; 1448 lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD);
1443 lua_Number y = lj_vm_foldarith(a, b, fins->o - IR_ADD);
1444 if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */ 1449 if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
1445 return LEFTFOLD; 1450 return LEFTFOLD;
1446 PHIBARRIER(fleft); 1451 PHIBARRIER(fleft);
1447 fins->op1 = fleft->op1; 1452 fins->op1 = fleft->op1;
1448 fins->op2 = (IRRef1)lj_ir_knum(J, y); 1453 fins->op2 = (IRRef1)lj_ir_knum(J, y);
1449 return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */ 1454 return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */
1455 } else if (irk->o == IR_KINT) {
1456 int32_t a = irk->i;
1457 int32_t y = kfold_intop(a, fright->i, fins->o);
1458 if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
1459 return LEFTFOLD;
1460 PHIBARRIER(fleft);
1461 fins->op1 = fleft->op1;
1462 fins->op2 = (IRRef1)lj_ir_kint(J, y);
1463 return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */
1450 } 1464 }
1451 return NEXTFOLD; 1465 return NEXTFOLD;
1452} 1466}