Home | History | Annotate | Download | only in InstCombine
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -instcombine -S | FileCheck %s
      3 
      4 @G1 = global i32 0
      5 @G2 = global i32 0
      6 
      7 define i1 @test0(i1 %A) {
      8 ; CHECK-LABEL: @test0(
      9 ; CHECK-NEXT:    ret i1 %A
     10 ;
     11   %B = xor i1 %A, false
     12   ret i1 %B
     13 }
     14 
     15 define i32 @test1(i32 %A) {
     16 ; CHECK-LABEL: @test1(
     17 ; CHECK-NEXT:    ret i32 %A
     18 ;
     19   %B = xor i32 %A, 0
     20   ret i32 %B
     21 }
     22 
     23 define i1 @test2(i1 %A) {
     24 ; CHECK-LABEL: @test2(
     25 ; CHECK-NEXT:    ret i1 false
     26 ;
     27   %B = xor i1 %A, %A
     28   ret i1 %B
     29 }
     30 
     31 define i32 @test3(i32 %A) {
     32 ; CHECK-LABEL: @test3(
     33 ; CHECK-NEXT:    ret i32 0
     34 ;
     35   %B = xor i32 %A, %A
     36   ret i32 %B
     37 }
     38 
     39 define i32 @test4(i32 %A) {
     40 ; CHECK-LABEL: @test4(
     41 ; CHECK-NEXT:    ret i32 -1
     42 ;
     43   %NotA = xor i32 -1, %A
     44   %B = xor i32 %A, %NotA
     45   ret i32 %B
     46 }
     47 
     48 define i32 @test5(i32 %A) {
     49 ; CHECK-LABEL: @test5(
     50 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 %A, -124
     51 ; CHECK-NEXT:    ret i32 [[TMP1]]
     52 ;
     53   %t1 = or i32 %A, 123
     54   %r = xor i32 %t1, 123
     55   ret i32 %r
     56 }
     57 
     58 define i8 @test6(i8 %A) {
     59 ; CHECK-LABEL: @test6(
     60 ; CHECK-NEXT:    ret i8 %A
     61 ;
     62   %B = xor i8 %A, 17
     63   %C = xor i8 %B, 17
     64   ret i8 %C
     65 }
     66 
     67 define i32 @test7(i32 %A, i32 %B) {
     68 ; CHECK-LABEL: @test7(
     69 ; CHECK-NEXT:    [[A1:%.*]] = and i32 %A, 7
     70 ; CHECK-NEXT:    [[B1:%.*]] = and i32 %B, 128
     71 ; CHECK-NEXT:    [[C11:%.*]] = or i32 [[A1]], [[B1]]
     72 ; CHECK-NEXT:    ret i32 [[C11]]
     73 ;
     74   %A1 = and i32 %A, 7
     75   %B1 = and i32 %B, 128
     76   %C1 = xor i32 %A1, %B1
     77   ret i32 %C1
     78 }
     79 
     80 define i8 @test8(i1 %c) {
     81 ; CHECK-LABEL: @test8(
     82 ; CHECK-NEXT:    br i1 %c, label %False, label %True
     83 ; CHECK:       True:
     84 ; CHECK-NEXT:    ret i8 1
     85 ; CHECK:       False:
     86 ; CHECK-NEXT:    ret i8 3
     87 ;
     88   %d = xor i1 %c, true
     89   br i1 %d, label %True, label %False
     90 
     91 True:
     92   ret i8 1
     93 
     94 False:
     95   ret i8 3
     96 }
     97 
     98 define i1 @test9(i8 %A) {
     99 ; CHECK-LABEL: @test9(
    100 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 %A, 89
    101 ; CHECK-NEXT:    ret i1 [[C]]
    102 ;
    103   %B = xor i8 %A, 123
    104   %C = icmp eq i8 %B, 34
    105   ret i1 %C
    106 }
    107 
    108 define i8 @test10(i8 %A) {
    109 ; CHECK-LABEL: @test10(
    110 ; CHECK-NEXT:    [[B:%.*]] = and i8 %A, 3
    111 ; CHECK-NEXT:    [[C1:%.*]] = or i8 [[B]], 4
    112 ; CHECK-NEXT:    ret i8 [[C1]]
    113 ;
    114   %B = and i8 %A, 3
    115   %C = xor i8 %B, 4
    116   ret i8 %C
    117 }
    118 
    119 define i8 @test11(i8 %A) {
    120 ; CHECK-LABEL: @test11(
    121 ; CHECK-NEXT:    [[B:%.*]] = and i8 %A, -13
    122 ; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[B]], 8
    123 ; CHECK-NEXT:    ret i8 [[TMP1]]
    124 ;
    125   %B = or i8 %A, 12
    126   %C = xor i8 %B, 4
    127   ret i8 %C
    128 }
    129 
    130 define i1 @test12(i8 %A) {
    131 ; CHECK-LABEL: @test12(
    132 ; CHECK-NEXT:    [[C:%.*]] = icmp ne i8 %A, 4
    133 ; CHECK-NEXT:    ret i1 [[C]]
    134 ;
    135   %B = xor i8 %A, 4
    136   %c = icmp ne i8 %B, 0
    137   ret i1 %c
    138 }
    139 
    140 define i1 @test13(i8 %A, i8 %B) {
    141 ; CHECK-LABEL: @test13(
    142 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i8 %A, %B
    143 ; CHECK-NEXT:    ret i1 [[TMP1]]
    144 ;
    145   %C = icmp ult i8 %A, %B
    146   %D = icmp ugt i8 %A, %B
    147   %E = xor i1 %C, %D
    148   ret i1 %E
    149 }
    150 
    151 define i1 @test14(i8 %A, i8 %B) {
    152 ; CHECK-LABEL: @test14(
    153 ; CHECK-NEXT:    ret i1 true
    154 ;
    155   %C = icmp eq i8 %A, %B
    156   %D = icmp ne i8 %B, %A
    157   %E = xor i1 %C, %D
    158   ret i1 %E
    159 }
    160 
    161 define i32 @test15(i32 %A) {
    162 ; CHECK-LABEL: @test15(
    163 ; CHECK-NEXT:    [[C:%.*]] = sub i32 0, %A
    164 ; CHECK-NEXT:    ret i32 [[C]]
    165 ;
    166   %B = add i32 %A, -1
    167   %C = xor i32 %B, -1
    168   ret i32 %C
    169 }
    170 
    171 define i32 @test16(i32 %A) {
    172 ; CHECK-LABEL: @test16(
    173 ; CHECK-NEXT:    [[C:%.*]] = sub i32 -124, %A
    174 ; CHECK-NEXT:    ret i32 [[C]]
    175 ;
    176   %B = add i32 %A, 123
    177   %C = xor i32 %B, -1
    178   ret i32 %C
    179 }
    180 
    181 define i32 @test17(i32 %A) {
    182 ; CHECK-LABEL: @test17(
    183 ; CHECK-NEXT:    [[C:%.*]] = add i32 %A, -124
    184 ; CHECK-NEXT:    ret i32 [[C]]
    185 ;
    186   %B = sub i32 123, %A
    187   %C = xor i32 %B, -1
    188   ret i32 %C
    189 }
    190 
    191 define i32 @test18(i32 %A) {
    192 ; CHECK-LABEL: @test18(
    193 ; CHECK-NEXT:    [[C:%.*]] = add i32 %A, 124
    194 ; CHECK-NEXT:    ret i32 [[C]]
    195 ;
    196   %B = xor i32 %A, -1
    197   %C = sub i32 123, %B
    198   ret i32 %C
    199 }
    200 
    201 define i32 @test19(i32 %A, i32 %B) {
    202 ; CHECK-LABEL: @test19(
    203 ; CHECK-NEXT:    ret i32 %B
    204 ;
    205   %C = xor i32 %A, %B
    206   %D = xor i32 %C, %A
    207   ret i32 %D
    208 }
    209 
    210 define void @test20(i32 %A, i32 %B) {
    211 ; CHECK-LABEL: @test20(
    212 ; CHECK-NEXT:    store i32 %B, i32* @G1, align 4
    213 ; CHECK-NEXT:    store i32 %A, i32* @G2, align 4
    214 ; CHECK-NEXT:    ret void
    215 ;
    216   %t2 = xor i32 %B, %A
    217   %t5 = xor i32 %t2, %B
    218   %t8 = xor i32 %t5, %t2
    219   store i32 %t8, i32* @G1
    220   store i32 %t5, i32* @G2
    221   ret void
    222 }
    223 
    224 define i32 @test21(i1 %C, i32 %A, i32 %B) {
    225 ; CHECK-LABEL: @test21(
    226 ; CHECK-NEXT:    [[D:%.*]] = select i1 %C, i32 %B, i32 %A
    227 ; CHECK-NEXT:    ret i32 [[D]]
    228 ;
    229   %C2 = xor i1 %C, true
    230   %D = select i1 %C2, i32 %A, i32 %B
    231   ret i32 %D
    232 }
    233 
    234 define i32 @test22(i1 %X) {
    235 ; CHECK-LABEL: @test22(
    236 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i1 %X to i32
    237 ; CHECK-NEXT:    ret i32 [[TMP1]]
    238 ;
    239   %Y = xor i1 %X, true
    240   %Z = zext i1 %Y to i32
    241   %Q = xor i32 %Z, 1
    242   ret i32 %Q
    243 }
    244 
    245 ; Look through a zext between xors.
    246 
    247 define i32 @fold_zext_xor_sandwich(i1 %X) {
    248 ; CHECK-LABEL: @fold_zext_xor_sandwich(
    249 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i1 %X to i32
    250 ; CHECK-NEXT:    [[Q:%.*]] = xor i32 [[TMP1]], 3
    251 ; CHECK-NEXT:    ret i32 [[Q]]
    252 ;
    253   %Y = xor i1 %X, true
    254   %Z = zext i1 %Y to i32
    255   %Q = xor i32 %Z, 2
    256   ret i32 %Q
    257 }
    258 
    259 define <2 x i32> @fold_zext_xor_sandwich_vec(<2 x i1> %X) {
    260 ; CHECK-LABEL: @fold_zext_xor_sandwich_vec(
    261 ; CHECK-NEXT:    [[TMP1:%.*]] = zext <2 x i1> %X to <2 x i32>
    262 ; CHECK-NEXT:    [[Q:%.*]] = xor <2 x i32> [[TMP1]], <i32 3, i32 3>
    263 ; CHECK-NEXT:    ret <2 x i32> [[Q]]
    264 ;
    265   %Y = xor <2 x i1> %X, <i1 true, i1 true>
    266   %Z = zext <2 x i1> %Y to <2 x i32>
    267   %Q = xor <2 x i32> %Z, <i32 2, i32 2>
    268   ret <2 x i32> %Q
    269 }
    270 
    271 define i1 @test23(i32 %a, i32 %b) {
    272 ; CHECK-LABEL: @test23(
    273 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 %b, 0
    274 ; CHECK-NEXT:    ret i1 [[T4]]
    275 ;
    276   %t2 = xor i32 %b, %a
    277   %t4 = icmp eq i32 %t2, %a
    278   ret i1 %t4
    279 }
    280 
    281 define i1 @test24(i32 %c, i32 %d) {
    282 ; CHECK-LABEL: @test24(
    283 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 %d, 0
    284 ; CHECK-NEXT:    ret i1 [[T4]]
    285 ;
    286   %t2 = xor i32 %d, %c
    287   %t4 = icmp ne i32 %t2, %c
    288   ret i1 %t4
    289 }
    290 
    291 define i32 @test25(i32 %g, i32 %h) {
    292 ; CHECK-LABEL: @test25(
    293 ; CHECK-NEXT:    [[T4:%.*]] = and i32 %h, %g
    294 ; CHECK-NEXT:    ret i32 [[T4]]
    295 ;
    296   %h2 = xor i32 %h, -1
    297   %t2 = and i32 %h2, %g
    298   %t4 = xor i32 %t2, %g
    299   ret i32 %t4
    300 }
    301 
    302 define i32 @test26(i32 %a, i32 %b) {
    303 ; CHECK-LABEL: @test26(
    304 ; CHECK-NEXT:    [[T4:%.*]] = and i32 %a, %b
    305 ; CHECK-NEXT:    ret i32 [[T4]]
    306 ;
    307   %b2 = xor i32 %b, -1
    308   %t2 = xor i32 %a, %b2
    309   %t4 = and i32 %t2, %a
    310   ret i32 %t4
    311 }
    312 
    313 define i32 @test27(i32 %b, i32 %c, i32 %d) {
    314 ; CHECK-LABEL: @test27(
    315 ; CHECK-NEXT:    [[T6:%.*]] = icmp eq i32 %b, %c
    316 ; CHECK-NEXT:    [[T7:%.*]] = zext i1 [[T6]] to i32
    317 ; CHECK-NEXT:    ret i32 [[T7]]
    318 ;
    319   %t2 = xor i32 %d, %b
    320   %t5 = xor i32 %d, %c
    321   %t6 = icmp eq i32 %t2, %t5
    322   %t7 = zext i1 %t6 to i32
    323   ret i32 %t7
    324 }
    325 
    326 define i32 @test28(i32 %indvar) {
    327 ; CHECK-LABEL: @test28(
    328 ; CHECK-NEXT:    [[T214:%.*]] = add i32 %indvar, 1
    329 ; CHECK-NEXT:    ret i32 [[T214]]
    330 ;
    331   %t7 = add i32 %indvar, -2147483647
    332   %t214 = xor i32 %t7, -2147483648
    333   ret i32 %t214
    334 }
    335