Home | History | Annotate | Download | only in Reassociate
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -reassociate -gvn -instcombine -S | FileCheck %s
      3 ; RUN: opt < %s -passes='reassociate,gvn,instcombine' -S | FileCheck %s
      4 
      5 define i32 @test1(i32 %arg) {
      6 ; CHECK-LABEL: @test1(
      7 ; CHECK-NEXT:    [[ARG_NEG:%.*]] = sub i32 0, [[ARG:%.*]]
      8 ; CHECK-NEXT:    ret i32 [[ARG_NEG]]
      9 ;
     10   %tmp1 = sub i32 -12, %arg
     11   %tmp2 = add i32 %tmp1, 12
     12   ret i32 %tmp2
     13 }
     14 
     15 define i32 @test2(i32 %reg109, i32 %reg1111) {
     16 ; CHECK-LABEL: @test2(
     17 ; CHECK-NEXT:    [[REG117:%.*]] = add i32 [[REG1111:%.*]], [[REG109:%.*]]
     18 ; CHECK-NEXT:    ret i32 [[REG117]]
     19 ;
     20   %reg115 = add i32 %reg109, -30
     21   %reg116 = add i32 %reg115, %reg1111
     22   %reg117 = add i32 %reg116, 30
     23   ret i32 %reg117
     24 }
     25 
     26 @e = external global i32
     27 @a = external global i32
     28 @b = external global i32
     29 @c = external global i32
     30 @f = external global i32
     31 
     32 define void @test3() {
     33 ; CHECK-LABEL: @test3(
     34 ; CHECK-NEXT:    [[A:%.*]] = load i32, i32* @a, align 4
     35 ; CHECK-NEXT:    [[B:%.*]] = load i32, i32* @b, align 4
     36 ; CHECK-NEXT:    [[C:%.*]] = load i32, i32* @c, align 4
     37 ; CHECK-NEXT:    [[T1:%.*]] = add i32 [[B]], [[A]]
     38 ; CHECK-NEXT:    [[T2:%.*]] = add i32 [[T1]], [[C]]
     39 ; CHECK-NEXT:    store i32 [[T2]], i32* @e, align 4
     40 ; CHECK-NEXT:    store i32 [[T2]], i32* @f, align 4
     41 ; CHECK-NEXT:    ret void
     42 ;
     43   %A = load i32, i32* @a
     44   %B = load i32, i32* @b
     45   %C = load i32, i32* @c
     46   %t1 = add i32 %A, %B
     47   %t2 = add i32 %t1, %C
     48   %t3 = add i32 %C, %A
     49   %t4 = add i32 %t3, %B
     50   ; e = (a+b)+c;
     51   store i32 %t2, i32* @e
     52   ; f = (a+c)+b
     53   store i32 %t4, i32* @f
     54   ret void
     55 }
     56 
     57 define void @test4() {
     58 ; CHECK-LABEL: @test4(
     59 ; CHECK-NEXT:    [[A:%.*]] = load i32, i32* @a, align 4
     60 ; CHECK-NEXT:    [[B:%.*]] = load i32, i32* @b, align 4
     61 ; CHECK-NEXT:    [[C:%.*]] = load i32, i32* @c, align 4
     62 ; CHECK-NEXT:    [[T1:%.*]] = add i32 [[B]], [[A]]
     63 ; CHECK-NEXT:    [[T2:%.*]] = add i32 [[T1]], [[C]]
     64 ; CHECK-NEXT:    store i32 [[T2]], i32* @e, align 4
     65 ; CHECK-NEXT:    store i32 [[T2]], i32* @f, align 4
     66 ; CHECK-NEXT:    ret void
     67 ;
     68   %A = load i32, i32* @a
     69   %B = load i32, i32* @b
     70   %C = load i32, i32* @c
     71   %t1 = add i32 %A, %B
     72   %t2 = add i32 %t1, %C
     73   %t3 = add i32 %C, %A
     74   %t4 = add i32 %t3, %B
     75   ; e = c+(a+b)
     76   store i32 %t2, i32* @e
     77   ; f = (c+a)+b
     78   store i32 %t4, i32* @f
     79   ret void
     80 }
     81 
     82 define void @test5() {
     83 ; CHECK-LABEL: @test5(
     84 ; CHECK-NEXT:    [[A:%.*]] = load i32, i32* @a, align 4
     85 ; CHECK-NEXT:    [[B:%.*]] = load i32, i32* @b, align 4
     86 ; CHECK-NEXT:    [[C:%.*]] = load i32, i32* @c, align 4
     87 ; CHECK-NEXT:    [[T1:%.*]] = add i32 [[B]], [[A]]
     88 ; CHECK-NEXT:    [[T2:%.*]] = add i32 [[T1]], [[C]]
     89 ; CHECK-NEXT:    store i32 [[T2]], i32* @e, align 4
     90 ; CHECK-NEXT:    store i32 [[T2]], i32* @f, align 4
     91 ; CHECK-NEXT:    ret void
     92 ;
     93   %A = load i32, i32* @a
     94   %B = load i32, i32* @b
     95   %C = load i32, i32* @c
     96   %t1 = add i32 %B, %A
     97   %t2 = add i32 %t1, %C
     98   %t3 = add i32 %C, %A
     99   %t4 = add i32 %t3, %B
    100   ; e = c+(b+a)
    101   store i32 %t2, i32* @e
    102   ; f = (c+a)+b
    103   store i32 %t4, i32* @f
    104   ret void
    105 }
    106 
    107 define i32 @test6() {
    108 ; CHECK-LABEL: @test6(
    109 ; CHECK-NEXT:    ret i32 0
    110 ;
    111   %tmp.0 = load i32, i32* @a
    112   %tmp.1 = load i32, i32* @b
    113   ; (a+b)
    114   %tmp.2 = add i32 %tmp.0, %tmp.1
    115   %tmp.4 = load i32, i32* @c
    116   ; (a+b)+c
    117   %tmp.5 = add i32 %tmp.2, %tmp.4
    118   ; (a+c)
    119   %tmp.8 = add i32 %tmp.0, %tmp.4
    120   ; (a+c)+b
    121   %tmp.11 = add i32 %tmp.8, %tmp.1
    122   ; X ^ X = 0
    123   %RV = xor i32 %tmp.5, %tmp.11
    124   ret i32 %RV
    125 }
    126 
    127 ; This should be one add and two multiplies.
    128 ; A*A*B + A*C*A
    129 
    130 define i32 @test7(i32 %A, i32 %B, i32 %C) {
    131 ; CHECK-LABEL: @test7(
    132 ; CHECK-NEXT:    [[REASS_ADD1:%.*]] = add i32 [[C:%.*]], [[B:%.*]]
    133 ; CHECK-NEXT:    [[REASS_MUL2:%.*]] = mul i32 [[A:%.*]], [[A]]
    134 ; CHECK-NEXT:    [[REASS_MUL:%.*]] = mul i32 [[REASS_MUL2]], [[REASS_ADD1]]
    135 ; CHECK-NEXT:    ret i32 [[REASS_MUL]]
    136 ;
    137   %aa = mul i32 %A, %A
    138   %aab = mul i32 %aa, %B
    139   %ac = mul i32 %A, %C
    140   %aac = mul i32 %ac, %A
    141   %r = add i32 %aab, %aac
    142   ret i32 %r
    143 }
    144 
    145 define i32 @test8(i32 %X, i32 %Y, i32 %Z) {
    146 ; CHECK-LABEL: @test8(
    147 ; CHECK-NEXT:    [[A:%.*]] = mul i32 [[Y:%.*]], [[X:%.*]]
    148 ; CHECK-NEXT:    [[C:%.*]] = sub i32 [[Z:%.*]], [[A]]
    149 ; CHECK-NEXT:    ret i32 [[C]]
    150 ;
    151   %A = sub i32 0, %X
    152   %B = mul i32 %A, %Y
    153   ; (-X)*Y + Z -> Z-X*Y
    154   %C = add i32 %B, %Z
    155   ret i32 %C
    156 }
    157 
    158 ; PR5458
    159 
    160 define i32 @test9(i32 %X) {
    161 ; CHECK-LABEL: @test9(
    162 ; CHECK-NEXT:    [[FACTOR:%.*]] = mul i32 [[X:%.*]], 94
    163 ; CHECK-NEXT:    ret i32 [[FACTOR]]
    164 ;
    165   %Y = mul i32 %X, 47
    166   %Z = add i32 %Y, %Y
    167   ret i32 %Z
    168 }
    169 
    170 define i32 @test10(i32 %X) {
    171 ; CHECK-LABEL: @test10(
    172 ; CHECK-NEXT:    [[FACTOR:%.*]] = mul i32 [[X:%.*]], 3
    173 ; CHECK-NEXT:    ret i32 [[FACTOR]]
    174 ;
    175   %Y = add i32 %X ,%X
    176   %Z = add i32 %Y, %X
    177   ret i32 %Z
    178 }
    179 
    180 define i32 @test11(i32 %W) {
    181 ; CHECK-LABEL: @test11(
    182 ; CHECK-NEXT:    [[FACTOR:%.*]] = mul i32 [[W:%.*]], 381
    183 ; CHECK-NEXT:    ret i32 [[FACTOR]]
    184 ;
    185   %X = mul i32 %W, 127
    186   %Y = add i32 %X ,%X
    187   %Z = add i32 %Y, %X
    188   ret i32 %Z
    189 }
    190 
    191 declare void @mumble(i32)
    192 
    193 define i32 @test12(i32 %X) {
    194 ; CHECK-LABEL: @test12(
    195 ; CHECK-NEXT:    [[X_NEG:%.*]] = sub i32 0, [[X:%.*]]
    196 ; CHECK-NEXT:    call void @mumble(i32 [[X_NEG]])
    197 ; CHECK-NEXT:    [[FACTOR:%.*]] = mul i32 [[X]], -3
    198 ; CHECK-NEXT:    [[Z:%.*]] = add i32 [[FACTOR]], 6
    199 ; CHECK-NEXT:    ret i32 [[Z]]
    200 ;
    201   %X.neg = sub nsw nuw i32 0, %X
    202   call void @mumble(i32 %X.neg)
    203   %A = sub i32 1, %X
    204   %B = sub i32 2, %X
    205   %C = sub i32 3, %X
    206   %Y = add i32 %A ,%B
    207   %Z = add i32 %Y, %C
    208   ret i32 %Z
    209 }
    210 
    211 define i32 @test13(i32 %X1, i32 %X2, i32 %X3) {
    212 ; CHECK-LABEL: @test13(
    213 ; CHECK-NEXT:    [[REASS_ADD:%.*]] = sub i32 [[X3:%.*]], [[X2:%.*]]
    214 ; CHECK-NEXT:    [[REASS_MUL:%.*]] = mul i32 [[REASS_ADD]], [[X1:%.*]]
    215 ; CHECK-NEXT:    ret i32 [[REASS_MUL]]
    216 ;
    217   %A = sub i32 0, %X1
    218   %B = mul i32 %A, %X2   ; -X1*X2
    219   %C = mul i32 %X1, %X3  ; X1*X3
    220   %D = add i32 %B, %C    ; -X1*X2 + X1*X3 -> X1*(X3-X2)
    221   ret i32 %D
    222 }
    223 
    224 ; PR5359
    225 
    226 define i32 @test14(i32 %X1, i32 %X2) {
    227 ; CHECK-LABEL: @test14(
    228 ; CHECK-NEXT:    [[REASS_ADD:%.*]] = sub i32 [[X1:%.*]], [[X2:%.*]]
    229 ; CHECK-NEXT:    [[REASS_MUL:%.*]] = mul i32 [[REASS_ADD]], 47
    230 ; CHECK-NEXT:    ret i32 [[REASS_MUL]]
    231 ;
    232   %B = mul i32 %X1, 47   ; X1*47
    233   %C = mul i32 %X2, -47  ; X2*-47
    234   %D = add i32 %B, %C    ; X1*47 + X2*-47 -> 47*(X1-X2)
    235   ret i32 %D
    236 }
    237 
    238 ; Do not reassociate expressions of type i1
    239 
    240 define i32 @test15(i32 %X1, i32 %X2, i32 %X3) {
    241 ; CHECK-LABEL: @test15(
    242 ; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X1:%.*]], 0
    243 ; CHECK-NEXT:    [[B:%.*]] = icmp slt i32 [[X2:%.*]], [[X3:%.*]]
    244 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
    245 ; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X1]], i32 0
    246 ; CHECK-NEXT:    ret i32 [[D]]
    247 ;
    248   %A = icmp ne i32 %X1, 0
    249   %B = icmp slt i32 %X2, %X3
    250   %C = and i1 %A, %B
    251   %D = select i1 %C, i32 %X1, i32 0
    252   ret i32 %D
    253 }
    254 
    255 ; PR30256 - previously this asserted.
    256 
    257 define i64 @test16(i1 %cmp, i64 %a, i64 %b) {
    258 ; CHECK-LABEL: @test16(
    259 ; CHECK-NEXT:  entry:
    260 ; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
    261 ; CHECK:       if.then:
    262 ; CHECK-NEXT:    [[FACTOR:%.*]] = mul i64 [[A:%.*]], -4
    263 ; CHECK-NEXT:    [[ADD2:%.*]] = add i64 [[FACTOR]], [[B:%.*]]
    264 ; CHECK-NEXT:    ret i64 [[ADD2]]
    265 ; CHECK:       if.end:
    266 ; CHECK-NEXT:    ret i64 0
    267 ;
    268 entry:
    269   %shl = shl i64 %a, 1
    270   %shl.neg = sub i64 0, %shl
    271   br i1 %cmp, label %if.then, label %if.end
    272 
    273 if.then:
    274   %add1 = add i64 %shl.neg, %shl.neg
    275   %add2 = add i64 %add1, %b
    276   ret i64 %add2
    277 
    278 if.end:
    279   ret i64 0
    280 }
    281 
    282 define i32 @test17(i32 %X1, i32 %X2, i32 %X3, i32 %X4) {
    283 ; CHECK-LABEL: @test17(
    284 ; CHECK-NEXT:    [[A:%.*]] = mul i32 [[X4:%.*]], [[X3:%.*]]
    285 ; CHECK-NEXT:    [[C:%.*]] = mul i32 [[A]], [[X1:%.*]]
    286 ; CHECK-NEXT:    [[D:%.*]] = mul i32 [[A]], [[X2:%.*]]
    287 ; CHECK-NEXT:    [[E:%.*]] = xor i32 [[C]], [[D]]
    288 ; CHECK-NEXT:    ret i32 [[E]]
    289 ;
    290   %A = mul i32 %X3, %X1
    291   %B = mul i32 %X3, %X2
    292   %C = mul i32 %A, %X4
    293   %D = mul i32 %B, %X4
    294   %E = xor i32 %C, %D
    295   ret i32 %E
    296 }
    297 
    298