Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt -S -instcombine < %s | FileCheck %s
      2 
      3 declare void @foo()
      4 
      5 define void @test1(i32 %a, i32 %b) nounwind {
      6   %1 = icmp slt i32 %a, 0
      7   %2 = icmp slt i32 %b, 0
      8   %or.cond = or i1 %1, %2
      9   br i1 %or.cond, label %if.then, label %if.end
     10 
     11 ; CHECK-LABEL: @test1(
     12 ; CHECK-NEXT: %1 = or i32 %a, %b
     13 ; CHECK-NEXT: %2 = icmp slt i32 %1, 0
     14 ; CHECK-NEXT: br
     15 
     16 if.then:
     17   tail call void @foo() nounwind
     18   ret void
     19 
     20 if.end:
     21   ret void
     22 }
     23 
     24 define void @test2(i32 %a, i32 %b) nounwind {
     25   %1 = icmp sgt i32 %a, -1
     26   %2 = icmp sgt i32 %b, -1
     27   %or.cond = or i1 %1, %2
     28   br i1 %or.cond, label %if.then, label %if.end
     29 
     30 ; CHECK-LABEL: @test2(
     31 ; CHECK-NEXT: %1 = and i32 %a, %b
     32 ; CHECK-NEXT: %2 = icmp sgt i32 %1, -1
     33 ; CHECK-NEXT: br
     34 
     35 if.then:
     36   tail call void @foo() nounwind
     37   ret void
     38 
     39 if.end:
     40   ret void
     41 }
     42 
     43 define void @test3(i32 %a, i32 %b) nounwind {
     44   %1 = icmp slt i32 %a, 0
     45   %2 = icmp slt i32 %b, 0
     46   %or.cond = and i1 %1, %2
     47   br i1 %or.cond, label %if.then, label %if.end
     48 
     49 ; CHECK-LABEL: @test3(
     50 ; CHECK-NEXT: %1 = and i32 %a, %b
     51 ; CHECK-NEXT: %2 = icmp slt i32 %1, 0
     52 ; CHECK-NEXT: br
     53 
     54 if.then:
     55   tail call void @foo() nounwind
     56   ret void
     57 
     58 if.end:
     59   ret void
     60 }
     61 
     62 define void @test4(i32 %a, i32 %b) nounwind {
     63   %1 = icmp sgt i32 %a, -1
     64   %2 = icmp sgt i32 %b, -1
     65   %or.cond = and i1 %1, %2
     66   br i1 %or.cond, label %if.then, label %if.end
     67 
     68 ; CHECK-LABEL: @test4(
     69 ; CHECK-NEXT: %1 = or i32 %a, %b
     70 ; CHECK-NEXT: %2 = icmp sgt i32 %1, -1
     71 ; CHECK-NEXT: br
     72 
     73 if.then:
     74   tail call void @foo() nounwind
     75   ret void
     76 
     77 if.end:
     78   ret void
     79 }
     80 
     81 define void @test5(i32 %a) nounwind {
     82   %and = and i32 %a, 134217728
     83   %1 = icmp eq i32 %and, 0
     84   %2 = icmp sgt i32 %a, -1
     85   %or.cond = and i1 %1, %2
     86   br i1 %or.cond, label %if.then, label %if.end
     87 
     88 ; CHECK-LABEL: @test5(
     89 ; CHECK-NEXT: %1 = and i32 %a, -2013265920
     90 ; CHECK-NEXT: %2 = icmp eq i32 %1, 0
     91 ; CHECK-NEXT: br i1 %2, label %if.then, label %if.end
     92 
     93 if.then:
     94   tail call void @foo() nounwind
     95   ret void
     96 
     97 if.end:
     98   ret void
     99 }
    100 
    101 define void @test6(i32 %a) nounwind {
    102   %1 = icmp sgt i32 %a, -1
    103   %and = and i32 %a, 134217728
    104   %2 = icmp eq i32 %and, 0
    105   %or.cond = and i1 %1, %2
    106   br i1 %or.cond, label %if.then, label %if.end
    107 
    108 ; CHECK-LABEL: @test6(
    109 ; CHECK-NEXT: %1 = and i32 %a, -2013265920
    110 ; CHECK-NEXT: %2 = icmp eq i32 %1, 0
    111 ; CHECK-NEXT: br i1 %2, label %if.then, label %if.end
    112 
    113 if.then:
    114   tail call void @foo() nounwind
    115   ret void
    116 
    117 if.end:
    118   ret void
    119 }
    120 
    121 define void @test7(i32 %a) nounwind {
    122   %and = and i32 %a, 134217728
    123   %1 = icmp ne i32 %and, 0
    124   %2 = icmp slt i32 %a, 0
    125   %or.cond = or i1 %1, %2
    126   br i1 %or.cond, label %if.then, label %if.end
    127 
    128 ; CHECK-LABEL: @test7(
    129 ; CHECK-NEXT: %1 = and i32 %a, -2013265920
    130 ; CHECK-NEXT: %2 = icmp eq i32 %1, 0
    131 ; CHECK-NEXT: br i1 %2, label %if.end, label %if.the
    132 
    133 if.then:
    134   tail call void @foo() nounwind
    135   ret void
    136 
    137 if.end:
    138   ret void
    139 }
    140 
    141 define void @test8(i32 %a) nounwind {
    142   %1 = icmp slt i32 %a, 0
    143   %and = and i32 %a, 134217728
    144   %2 = icmp ne i32 %and, 0
    145   %or.cond = or i1 %1, %2
    146   br i1 %or.cond, label %if.then, label %if.end
    147 
    148 ; CHECK-LABEL: @test8(
    149 ; CHECK-NEXT: %1 = and i32 %a, -2013265920
    150 ; CHECK-NEXT: %2 = icmp eq i32 %1, 0
    151 ; CHECK-NEXT: br i1 %2, label %if.end, label %if.the
    152 
    153 if.then:
    154   tail call void @foo() nounwind
    155   ret void
    156 
    157 if.end:
    158   ret void
    159 }
    160 
    161 define void @test9(i32 %a) nounwind {
    162   %1 = and i32 %a, 1073741824
    163   %2 = icmp ne i32 %1, 0
    164   %3 = icmp sgt i32 %a, -1
    165   %or.cond = and i1 %2, %3
    166   br i1 %or.cond, label %if.then, label %if.end
    167 
    168 ; CHECK-LABEL: @test9(
    169 ; CHECK-NEXT: %1 = and i32 %a, -1073741824
    170 ; CHECK-NEXT: %2 = icmp eq i32 %1, 1073741824
    171 ; CHECK-NEXT: br i1 %2, label %if.then, label %if.end
    172 
    173 if.then:
    174   tail call void @foo() nounwind
    175   ret void
    176 
    177 if.end:
    178   ret void
    179 }
    180 
    181 define void @test10(i32 %a) nounwind {
    182   %1 = and i32 %a, 2
    183   %2 = icmp eq i32 %1, 0
    184   %3 = icmp ult i32 %a, 4
    185   %or.cond = and i1 %2, %3
    186   br i1 %or.cond, label %if.then, label %if.end
    187 
    188 ; CHECK-LABEL: @test10(
    189 ; CHECK-NEXT: %1 = icmp ult i32 %a, 2
    190 ; CHECK-NEXT: br i1 %1, label %if.then, label %if.end
    191 
    192 if.then:
    193   tail call void @foo() nounwind
    194   ret void
    195 
    196 if.end:
    197   ret void
    198 }
    199 
    200 define void @test11(i32 %a) nounwind {
    201   %1 = and i32 %a, 2
    202   %2 = icmp ne i32 %1, 0
    203   %3 = icmp ugt i32 %a, 3
    204   %or.cond = or i1 %2, %3
    205   br i1 %or.cond, label %if.then, label %if.end
    206 
    207 ; CHECK-LABEL: @test11(
    208 ; CHECK-NEXT: %1 = icmp ugt i32 %a, 1
    209 ; CHECK-NEXT: br i1 %1, label %if.then, label %if.end
    210 
    211 if.then:
    212   tail call void @foo() nounwind
    213   ret void
    214 
    215 if.end:
    216   ret void
    217 }
    218