@@ -1557,32 +1557,6 @@ IR_FOLD(SUB_OV(_, C_ADDR))
15571557 IR_FOLD_NEXT ;
15581558}
15591559
1560- IR_FOLD (ADD (C_U8 , _ ))
1561- IR_FOLD (ADD (C_U16 , _ ))
1562- IR_FOLD (ADD (C_U32 , _ ))
1563- IR_FOLD (ADD (C_U64 , _ ))
1564- IR_FOLD (ADD (C_I8 , _ ))
1565- IR_FOLD (ADD (C_I16 , _ ))
1566- IR_FOLD (ADD (C_I32 , _ ))
1567- IR_FOLD (ADD (C_I64 , _ ))
1568- IR_FOLD (ADD (C_ADDR , _ ))
1569- IR_FOLD (ADD_OV (C_U8 , _ ))
1570- IR_FOLD (ADD_OV (C_U16 , _ ))
1571- IR_FOLD (ADD_OV (C_U32 , _ ))
1572- IR_FOLD (ADD_OV (C_U64 , _ ))
1573- IR_FOLD (ADD_OV (C_I8 , _ ))
1574- IR_FOLD (ADD_OV (C_I16 , _ ))
1575- IR_FOLD (ADD_OV (C_I32 , _ ))
1576- IR_FOLD (ADD_OV (C_I64 , _ ))
1577- IR_FOLD (ADD_OV (C_ADDR , _ ))
1578- {
1579- if (op1_insn -> val .u64 == 0 ) {
1580- /* 0 + a => a */
1581- IR_FOLD_COPY (op2 );
1582- }
1583- IR_FOLD_NEXT ;
1584- }
1585-
15861560IR_FOLD (SUB (C_I8 , _ ))
15871561IR_FOLD (SUB (C_I16 , _ ))
15881562IR_FOLD (SUB (C_I32 , _ ))
@@ -1839,51 +1813,6 @@ IR_FOLD(MUL(_, C_I64))
18391813 IR_FOLD_NEXT ;
18401814}
18411815
1842- IR_FOLD (MUL (C_U8 , _ ))
1843- IR_FOLD (MUL (C_U16 , _ ))
1844- IR_FOLD (MUL (C_U32 , _ ))
1845- IR_FOLD (MUL (C_U64 , _ ))
1846- IR_FOLD (MUL (C_ADDR , _ ))
1847- {
1848- if (op1_insn -> val .u64 == 0 ) {
1849- /* 0 * a => 0 */
1850- IR_FOLD_COPY (op1 );
1851- } else if (op1_insn -> val .u64 == 1 ) {
1852- IR_FOLD_COPY (op2 );
1853- } else if (op1_insn -> val .u64 == 2 && IR_OPT_TYPE (opt ) != IR_ADDR ) {
1854- opt = IR_ADD | (opt & IR_OPT_TYPE_MASK );
1855- op1 = op2 ;
1856- IR_FOLD_RESTART ;
1857- }
1858- IR_FOLD_NEXT ;
1859- }
1860-
1861- IR_FOLD (MUL (C_I8 , _ ))
1862- IR_FOLD (MUL (C_I16 , _ ))
1863- IR_FOLD (MUL (C_I32 , _ ))
1864- IR_FOLD (MUL (C_I64 , _ ))
1865- {
1866- if (op1_insn -> val .i64 == 0 ) {
1867- /* 0 * a => 0 */
1868- IR_FOLD_COPY (op1 );
1869- } else if (op1_insn -> val .i64 == 1 ) {
1870- /* 1 * a => a */
1871- IR_FOLD_COPY (op2 );
1872- } else if (op1_insn -> val .i64 == 2 ) {
1873- /* 2 * a => a + a */
1874- opt = IR_ADD | (opt & IR_OPT_TYPE_MASK );
1875- op1 = op2 ;
1876- IR_FOLD_RESTART ;
1877- } else if (op1_insn -> val .i64 == -1 ) {
1878- /* -1 * a => -a */
1879- opt = IR_NEG | (opt & IR_OPT_TYPE_MASK );
1880- op1 = op2 ;
1881- op2 = IR_UNUSED ;
1882- IR_FOLD_RESTART ;
1883- }
1884- IR_FOLD_NEXT ;
1885- }
1886-
18871816IR_FOLD (MUL (_ , C_DOUBLE ))
18881817{
18891818 if (op2_insn -> val .d == 1.0 ) {
@@ -2481,6 +2410,50 @@ IR_FOLD(TRUNC(AND))
24812410 IR_FOLD_NEXT ;
24822411}
24832412
2413+ IR_FOLD (AND (SHR , C_I8 ))
2414+ IR_FOLD (AND (SHR , C_U8 ))
2415+ {
2416+ if (IR_IS_CONST_REF (op1_insn -> op2 )) {
2417+ if (((uint8_t )-1 ) >> ctx -> ir_base [op1_insn -> op2 ].val .u8 == op2_insn -> val .u8 ) {
2418+ IR_FOLD_COPY (op1 );
2419+ }
2420+ }
2421+ IR_FOLD_NEXT ;
2422+ }
2423+
2424+ IR_FOLD (AND (SHR , C_I16 ))
2425+ IR_FOLD (AND (SHR , C_U16 ))
2426+ {
2427+ if (IR_IS_CONST_REF (op1_insn -> op2 )) {
2428+ if (((uint16_t )-1 ) >> ctx -> ir_base [op1_insn -> op2 ].val .u16 == op2_insn -> val .u16 ) {
2429+ IR_FOLD_COPY (op1 );
2430+ }
2431+ }
2432+ IR_FOLD_NEXT ;
2433+ }
2434+
2435+ IR_FOLD (AND (SHR , C_I32 ))
2436+ IR_FOLD (AND (SHR , C_U32 ))
2437+ {
2438+ if (IR_IS_CONST_REF (op1_insn -> op2 )) {
2439+ if (((uint32_t )-1 ) >> ctx -> ir_base [op1_insn -> op2 ].val .u32 == op2_insn -> val .u32 ) {
2440+ IR_FOLD_COPY (op1 );
2441+ }
2442+ }
2443+ IR_FOLD_NEXT ;
2444+ }
2445+
2446+ IR_FOLD (AND (SHR , C_I64 ))
2447+ IR_FOLD (AND (SHR , C_U64 ))
2448+ {
2449+ if (IR_IS_CONST_REF (op1_insn -> op2 )) {
2450+ if (((uint64_t )-1 ) >> ctx -> ir_base [op1_insn -> op2 ].val .u64 == op2_insn -> val .u64 ) {
2451+ IR_FOLD_COPY (op1 );
2452+ }
2453+ }
2454+ IR_FOLD_NEXT ;
2455+ }
2456+
24842457IR_FOLD (EQ (FP2FP , C_DOUBLE ))
24852458IR_FOLD (NE (FP2FP , C_DOUBLE ))
24862459IR_FOLD (LT (FP2FP , C_DOUBLE ))
@@ -2865,6 +2838,46 @@ IR_FOLD(XOR(XOR, _))
28652838 IR_FOLD_NEXT ;
28662839}
28672840
2841+ /* ROL/ROR */
2842+ IR_FOLD (OR (SHL , SHR ))
2843+ IR_FOLD (OR (SHR , SHL ))
2844+ IR_FOLD (ADD (SHL , SHR ))
2845+ IR_FOLD (ADD (SHR , SHL ))
2846+ {
2847+ if (op1_insn -> op1 == op2_insn -> op1 ) {
2848+ if (IR_IS_CONST_REF (op1_insn -> op2 ) && IR_IS_CONST_REF (op2_insn -> op2 )) {
2849+ if (ctx -> ir_base [op1_insn -> op2 ].val .u64 + ctx -> ir_base [op2_insn -> op2 ].val .u64 ==
2850+ ir_type_size [IR_OPT_TYPE (opt )] * 8 ) {
2851+ /* (x << c) | (x >> (32 - c)) -> ROL(x, c) */
2852+ op1 = op1_insn -> op1 ;
2853+ op2 = op1_insn -> op2 ;
2854+ opt = op1_insn -> opt + 3 ; /* SHL -> ROL, SHR -> ROR */
2855+ IR_FOLD_RESTART ;
2856+ }
2857+ } else if (ctx -> ir_base [op2_insn -> op2 ].op == IR_SUB
2858+ && IR_IS_CONST_REF (ctx -> ir_base [op2_insn -> op2 ].op1 )
2859+ && ctx -> ir_base [op2_insn -> op2 ].op2 == op1_insn -> op2
2860+ && ctx -> ir_base [ctx -> ir_base [op2_insn -> op2 ].op1 ].val .u64 == ir_type_size [IR_OPT_TYPE (opt )] * 8 ) {
2861+ /* (x << y) | (x >> (32 - y)) -> ROL(x, y) */
2862+ op1 = op1_insn -> op1 ;
2863+ op2 = op1_insn -> op2 ;
2864+ opt = op1_insn -> opt + 3 ; /* SHL -> ROL, SHR -> ROR */
2865+ IR_FOLD_RESTART ;
2866+ } else if (ctx -> ir_base [op1_insn -> op2 ].op == IR_SUB
2867+ && IR_IS_CONST_REF (ctx -> ir_base [op1_insn -> op2 ].op1 )
2868+ && ctx -> ir_base [op1_insn -> op2 ].op2 == op2_insn -> op2
2869+ && ctx -> ir_base [ctx -> ir_base [op1_insn -> op2 ].op1 ].val .u64 == ir_type_size [IR_OPT_TYPE (opt )] * 8 ) {
2870+ /* (x << (32 - y)) | (x >> y) -> ROR(x, y) */
2871+ op1 = op2_insn -> op1 ;
2872+ op2 = op2_insn -> op2 ;
2873+ opt = op2_insn -> opt + 3 ; /* SHL -> ROL, SHR -> ROR */
2874+ IR_FOLD_RESTART ;
2875+ }
2876+ }
2877+ IR_FOLD_NEXT ;
2878+ }
2879+
2880+
28682881/* Swap operands (move lower ref to op2) for better CSE */
28692882IR_FOLD (ADD (_ , _ ))
28702883IR_FOLD (MUL (_ , _ ))
0 commit comments