diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 53 |
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 | ||
1777 | LJFOLD(MIN MIN any) | ||
1778 | LJFOLD(MAX MAX any) | ||
1779 | LJFOLD(BAND BAND any) | 1777 | LJFOLD(BAND BAND any) |
1780 | LJFOLD(BOR BOR any) | 1778 | LJFOLD(BOR BOR any) |
1781 | LJFOLDF(reassoc_dup) | 1779 | LJFOLDF(reassoc_dup) |
@@ -1785,6 +1783,15 @@ LJFOLDF(reassoc_dup) | |||
1785 | return NEXTFOLD; | 1783 | return NEXTFOLD; |
1786 | } | 1784 | } |
1787 | 1785 | ||
1786 | LJFOLD(MIN MIN any) | ||
1787 | LJFOLD(MAX MAX any) | ||
1788 | LJFOLDF(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 | |||
1788 | LJFOLD(BXOR BXOR any) | 1795 | LJFOLD(BXOR BXOR any) |
1789 | LJFOLDF(reassoc_bxor) | 1796 | LJFOLDF(reassoc_bxor) |
1790 | { | 1797 | { |
@@ -1823,23 +1830,12 @@ LJFOLDF(reassoc_shift) | |||
1823 | return NEXTFOLD; | 1830 | return NEXTFOLD; |
1824 | } | 1831 | } |
1825 | 1832 | ||
1826 | LJFOLD(MIN MIN KNUM) | ||
1827 | LJFOLD(MAX MAX KNUM) | ||
1828 | LJFOLD(MIN MIN KINT) | 1833 | LJFOLD(MIN MIN KINT) |
1829 | LJFOLD(MAX MAX KINT) | 1834 | LJFOLD(MAX MAX KINT) |
1830 | LJFOLDF(reassoc_minmax_k) | 1835 | LJFOLDF(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 | ||
1855 | LJFOLD(MIN MAX any) | ||
1856 | LJFOLD(MAX MIN any) | ||
1857 | LJFOLDF(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 | |||
1864 | LJFOLD(MIN any MAX) | ||
1865 | LJFOLD(MAX any MIN) | ||
1866 | LJFOLDF(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 | ||
1996 | LJFOLD(BAND any any) | 1974 | LJFOLD(BAND any any) |
1997 | LJFOLD(BOR any any) | 1975 | LJFOLD(BOR any any) |
1998 | LJFOLD(MIN any any) | ||
1999 | LJFOLD(MAX any any) | ||
2000 | LJFOLDF(comm_dup) | 1976 | LJFOLDF(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 | ||
1983 | LJFOLD(MIN any any) | ||
1984 | LJFOLD(MAX any any) | ||
1985 | LJFOLDF(comm_dup_minmax) | ||
1986 | { | ||
1987 | if (fins->op1 == fins->op2) /* x o x ==> x */ | ||
1988 | return LEFTFOLD; | ||
1989 | return NEXTFOLD; | ||
1990 | } | ||
1991 | |||
2007 | LJFOLD(BXOR any any) | 1992 | LJFOLD(BXOR any any) |
2008 | LJFOLDF(comm_bxor) | 1993 | LJFOLDF(comm_bxor) |
2009 | { | 1994 | { |