Fix math.min()/math.max() inconsistencies.
This commit is contained in:
@@ -1774,8 +1774,6 @@ LJFOLDF(reassoc_intarith_k64)
|
||||
#endif
|
||||
}
|
||||
|
||||
LJFOLD(MIN MIN any)
|
||||
LJFOLD(MAX MAX any)
|
||||
LJFOLD(BAND BAND any)
|
||||
LJFOLD(BOR BOR any)
|
||||
LJFOLDF(reassoc_dup)
|
||||
@@ -1785,6 +1783,15 @@ LJFOLDF(reassoc_dup)
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN MIN any)
|
||||
LJFOLD(MAX MAX any)
|
||||
LJFOLDF(reassoc_dup_minmax)
|
||||
{
|
||||
if (fins->op2 == fleft->op2)
|
||||
return LEFTFOLD; /* (a o b) o b ==> a o b */
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(BXOR BXOR any)
|
||||
LJFOLDF(reassoc_bxor)
|
||||
{
|
||||
@@ -1823,23 +1830,12 @@ LJFOLDF(reassoc_shift)
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN MIN KNUM)
|
||||
LJFOLD(MAX MAX KNUM)
|
||||
LJFOLD(MIN MIN KINT)
|
||||
LJFOLD(MAX MAX KINT)
|
||||
LJFOLDF(reassoc_minmax_k)
|
||||
{
|
||||
IRIns *irk = IR(fleft->op2);
|
||||
if (irk->o == IR_KNUM) {
|
||||
lua_Number a = ir_knum(irk)->n;
|
||||
lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD);
|
||||
if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
|
||||
return LEFTFOLD;
|
||||
PHIBARRIER(fleft);
|
||||
fins->op1 = fleft->op1;
|
||||
fins->op2 = (IRRef1)lj_ir_knum(J, y);
|
||||
return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */
|
||||
} else if (irk->o == IR_KINT) {
|
||||
if (irk->o == IR_KINT) {
|
||||
int32_t a = irk->i;
|
||||
int32_t y = kfold_intop(a, fright->i, fins->o);
|
||||
if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
|
||||
@@ -1852,24 +1848,6 @@ LJFOLDF(reassoc_minmax_k)
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN MAX any)
|
||||
LJFOLD(MAX MIN any)
|
||||
LJFOLDF(reassoc_minmax_left)
|
||||
{
|
||||
if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)
|
||||
return RIGHTFOLD; /* (b o1 a) o2 b ==> b; (a o1 b) o2 b ==> b */
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN any MAX)
|
||||
LJFOLD(MAX any MIN)
|
||||
LJFOLDF(reassoc_minmax_right)
|
||||
{
|
||||
if (fins->op1 == fright->op1 || fins->op1 == fright->op2)
|
||||
return LEFTFOLD; /* a o2 (a o1 b) ==> a; a o2 (b o1 a) ==> a */
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
/* -- Array bounds check elimination -------------------------------------- */
|
||||
|
||||
/* Eliminate ABC across PHIs to handle t[i-1] forwarding case.
|
||||
@@ -1995,8 +1973,6 @@ LJFOLDF(comm_comp)
|
||||
|
||||
LJFOLD(BAND any any)
|
||||
LJFOLD(BOR any any)
|
||||
LJFOLD(MIN any any)
|
||||
LJFOLD(MAX any any)
|
||||
LJFOLDF(comm_dup)
|
||||
{
|
||||
if (fins->op1 == fins->op2) /* x o x ==> x */
|
||||
@@ -2004,6 +1980,15 @@ LJFOLDF(comm_dup)
|
||||
return fold_comm_swap(J);
|
||||
}
|
||||
|
||||
LJFOLD(MIN any any)
|
||||
LJFOLD(MAX any any)
|
||||
LJFOLDF(comm_dup_minmax)
|
||||
{
|
||||
if (fins->op1 == fins->op2) /* x o x ==> x */
|
||||
return LEFTFOLD;
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(BXOR any any)
|
||||
LJFOLDF(comm_bxor)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user