aboutsummaryrefslogtreecommitdiff
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.c53
1 files changed, 19 insertions, 34 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index b4d05a26..cefd69c8 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -1774,8 +1774,6 @@ LJFOLDF(reassoc_intarith_k64)
1774#endif 1774#endif
1775} 1775}
1776 1776
1777LJFOLD(MIN MIN any)
1778LJFOLD(MAX MAX any)
1779LJFOLD(BAND BAND any) 1777LJFOLD(BAND BAND any)
1780LJFOLD(BOR BOR any) 1778LJFOLD(BOR BOR any)
1781LJFOLDF(reassoc_dup) 1779LJFOLDF(reassoc_dup)
@@ -1785,6 +1783,15 @@ LJFOLDF(reassoc_dup)
1785 return NEXTFOLD; 1783 return NEXTFOLD;
1786} 1784}
1787 1785
1786LJFOLD(MIN MIN any)
1787LJFOLD(MAX MAX any)
1788LJFOLDF(reassoc_dup_minmax)
1789{
1790 if (fins->op2 == fleft->op2)
1791 return LEFTFOLD; /* (a o b) o b ==> a o b */
1792 return NEXTFOLD;
1793}
1794
1788LJFOLD(BXOR BXOR any) 1795LJFOLD(BXOR BXOR any)
1789LJFOLDF(reassoc_bxor) 1796LJFOLDF(reassoc_bxor)
1790{ 1797{
@@ -1823,23 +1830,12 @@ LJFOLDF(reassoc_shift)
1823 return NEXTFOLD; 1830 return NEXTFOLD;
1824} 1831}
1825 1832
1826LJFOLD(MIN MIN KNUM)
1827LJFOLD(MAX MAX KNUM)
1828LJFOLD(MIN MIN KINT) 1833LJFOLD(MIN MIN KINT)
1829LJFOLD(MAX MAX KINT) 1834LJFOLD(MAX MAX KINT)
1830LJFOLDF(reassoc_minmax_k) 1835LJFOLDF(reassoc_minmax_k)
1831{ 1836{
1832 IRIns *irk = IR(fleft->op2); 1837 IRIns *irk = IR(fleft->op2);
1833 if (irk->o == IR_KNUM) { 1838 if (irk->o == IR_KINT) {
1834 lua_Number a = ir_knum(irk)->n;
1835 lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD);
1836 if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
1837 return LEFTFOLD;
1838 PHIBARRIER(fleft);
1839 fins->op1 = fleft->op1;
1840 fins->op2 = (IRRef1)lj_ir_knum(J, y);
1841 return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */
1842 } else if (irk->o == IR_KINT) {
1843 int32_t a = irk->i; 1839 int32_t a = irk->i;
1844 int32_t y = kfold_intop(a, fright->i, fins->o); 1840 int32_t y = kfold_intop(a, fright->i, fins->o);
1845 if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */ 1841 if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
@@ -1852,24 +1848,6 @@ LJFOLDF(reassoc_minmax_k)
1852 return NEXTFOLD; 1848 return NEXTFOLD;
1853} 1849}
1854 1850
1855LJFOLD(MIN MAX any)
1856LJFOLD(MAX MIN any)
1857LJFOLDF(reassoc_minmax_left)
1858{
1859 if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)
1860 return RIGHTFOLD; /* (b o1 a) o2 b ==> b; (a o1 b) o2 b ==> b */
1861 return NEXTFOLD;
1862}
1863
1864LJFOLD(MIN any MAX)
1865LJFOLD(MAX any MIN)
1866LJFOLDF(reassoc_minmax_right)
1867{
1868 if (fins->op1 == fright->op1 || fins->op1 == fright->op2)
1869 return LEFTFOLD; /* a o2 (a o1 b) ==> a; a o2 (b o1 a) ==> a */
1870 return NEXTFOLD;
1871}
1872
1873/* -- Array bounds check elimination -------------------------------------- */ 1851/* -- Array bounds check elimination -------------------------------------- */
1874 1852
1875/* Eliminate ABC across PHIs to handle t[i-1] forwarding case. 1853/* Eliminate ABC across PHIs to handle t[i-1] forwarding case.
@@ -1995,8 +1973,6 @@ LJFOLDF(comm_comp)
1995 1973
1996LJFOLD(BAND any any) 1974LJFOLD(BAND any any)
1997LJFOLD(BOR any any) 1975LJFOLD(BOR any any)
1998LJFOLD(MIN any any)
1999LJFOLD(MAX any any)
2000LJFOLDF(comm_dup) 1976LJFOLDF(comm_dup)
2001{ 1977{
2002 if (fins->op1 == fins->op2) /* x o x ==> x */ 1978 if (fins->op1 == fins->op2) /* x o x ==> x */
@@ -2004,6 +1980,15 @@ LJFOLDF(comm_dup)
2004 return fold_comm_swap(J); 1980 return fold_comm_swap(J);
2005} 1981}
2006 1982
1983LJFOLD(MIN any any)
1984LJFOLD(MAX any any)
1985LJFOLDF(comm_dup_minmax)
1986{
1987 if (fins->op1 == fins->op2) /* x o x ==> x */
1988 return LEFTFOLD;
1989 return NEXTFOLD;
1990}
1991
2007LJFOLD(BXOR any any) 1992LJFOLD(BXOR any any)
2008LJFOLDF(comm_bxor) 1993LJFOLDF(comm_bxor)
2009{ 1994{