Home | History | Annotate | Download | only in SimplifyCFG
      1 ; RUN: opt %s -S -simplifycfg | FileCheck %s
      2 
      3 declare void @is(i1)
      4 
      5 ; If A == B is false then A == B is implied false.
      6 ; CHECK-LABEL: @test_eq_eq
      7 ; CHECK-NOT: call void @is(i1 true)
      8 ; CHECK: call void @is(i1 false)
      9 define void @test_eq_eq(i32 %a, i32 %b) {
     10   %cmp1 = icmp eq i32 %a, %b
     11   br i1 %cmp1, label %untaken, label %taken
     12 
     13 taken:
     14   %cmp2 = icmp eq i32 %a, %b
     15   br i1 %cmp2, label %istrue, label %isfalse
     16 
     17 istrue:
     18   call void @is(i1 true)
     19   ret void
     20 
     21 isfalse:
     22   call void @is(i1 false)
     23   ret void
     24 
     25 untaken:
     26   ret void
     27 }
     28 
     29 ; If A == B is false then A != B is implied true.
     30 ; CHECK-LABEL: @test_eq_ne
     31 ; CHECK: call void @is(i1 true)
     32 ; CHECK-NOT: call void @is(i1 false)
     33 define void @test_eq_ne(i32 %a, i32 %b) {
     34   %cmp1 = icmp eq i32 %a, %b
     35   br i1 %cmp1, label %untaken, label %taken
     36 
     37 taken:
     38   %cmp2 = icmp ne i32 %a, %b
     39   br i1 %cmp2, label %istrue, label %isfalse
     40 
     41 istrue:
     42   call void @is(i1 true)
     43   ret void
     44 
     45 isfalse:
     46   call void @is(i1 false)
     47   ret void
     48 
     49 untaken:
     50   ret void
     51 }
     52 
     53 ; If A != B is false then A != B is implied false.
     54 ; CHECK-LABEL: @test_ne_ne
     55 ; CHECK-NOT: call void @is(i1 true)
     56 ; CHECK: call void @is(i1 false)
     57 define void @test_ne_ne(i32 %a, i32 %b) {
     58   %cmp1 = icmp ne i32 %a, %b
     59   br i1 %cmp1, label %untaken, label %taken
     60 
     61 taken:
     62   %cmp2 = icmp ne i32 %a, %b
     63   br i1 %cmp2, label %istrue, label %isfalse
     64 
     65 istrue:
     66   call void @is(i1 true)
     67   ret void
     68 
     69 isfalse:
     70   call void @is(i1 false)
     71   ret void
     72 
     73 untaken:
     74   ret void
     75 }
     76 
     77 ; If A != B is false then A >u B is implied false.
     78 ; CHECK-LABEL: @test_ne_ugt
     79 ; CHECK-NOT: call void @is(i1 true)
     80 ; CHECK: call void @is(i1 false)
     81 define void @test_ne_ugt(i32 %a, i32 %b) {
     82   %cmp1 = icmp ne i32 %a, %b
     83   br i1 %cmp1, label %untaken, label %taken
     84 
     85 taken:
     86   %cmp2 = icmp ugt i32 %a, %b
     87   br i1 %cmp2, label %istrue, label %isfalse
     88 
     89 istrue:
     90   call void @is(i1 true)
     91   ret void
     92 
     93 isfalse:
     94   call void @is(i1 false)
     95   ret void
     96 
     97 untaken:
     98   ret void
     99 }
    100 
    101 ; If A != B is false then A >=u B is implied true.
    102 ; CHECK-LABEL: @test_ne_uge
    103 ; CHECK: call void @is(i1 true)
    104 ; CHECK-NOT: call void @is(i1 false)
    105 define void @test_ne_uge(i32 %a, i32 %b) {
    106   %cmp1 = icmp ne i32 %a, %b
    107   br i1 %cmp1, label %untaken, label %taken
    108 
    109 taken:
    110   %cmp2 = icmp uge i32 %a, %b
    111   br i1 %cmp2, label %istrue, label %isfalse
    112 
    113 istrue:
    114   call void @is(i1 true)
    115   ret void
    116 
    117 isfalse:
    118   call void @is(i1 false)
    119   ret void
    120 
    121 untaken:
    122   ret void
    123 }
    124 
    125 ; If A != B is false then A <u B is implied false.
    126 ; CHECK-LABEL: @test_ne_ult
    127 ; CHECK-NOT: call void @is(i1 true)
    128 ; CHECK: call void @is(i1 false)
    129 define void @test_ne_ult(i32 %a, i32 %b) {
    130   %cmp1 = icmp ne i32 %a, %b
    131   br i1 %cmp1, label %untaken, label %taken
    132 
    133 taken:
    134   %cmp2 = icmp ult i32 %a, %b
    135   br i1 %cmp2, label %istrue, label %isfalse
    136 
    137 istrue:
    138   call void @is(i1 true)
    139   ret void
    140 
    141 isfalse:
    142   call void @is(i1 false)
    143   ret void
    144 
    145 untaken:
    146   ret void
    147 }
    148 
    149 ; If A != B is false then A <=u B is implied true.
    150 ; CHECK-LABEL: @test_ne_ule
    151 ; CHECK: call void @is(i1 true)
    152 ; CHECK-NOT: call void @is(i1 false)
    153 define void @test_ne_ule(i32 %a, i32 %b) {
    154   %cmp1 = icmp ne i32 %a, %b
    155   br i1 %cmp1, label %untaken, label %taken
    156 
    157 taken:
    158   %cmp2 = icmp ule i32 %a, %b
    159   br i1 %cmp2, label %istrue, label %isfalse
    160 
    161 istrue:
    162   call void @is(i1 true)
    163   ret void
    164 
    165 isfalse:
    166   call void @is(i1 false)
    167   ret void
    168 
    169 untaken:
    170   ret void
    171 }
    172 
    173 ; If A >u B is false then A >u B is implied false.
    174 ; CHECK-LABEL: @test_ugt_ugt
    175 ; CHECK-NOT: call void @is(i1 true)
    176 ; CHECK: call void @is(i1 false)
    177 define void @test_ugt_ugt(i32 %a, i32 %b) {
    178   %cmp1 = icmp ugt i32 %a, %b
    179   br i1 %cmp1, label %untaken, label %taken
    180 
    181 taken:
    182   %cmp2 = icmp ugt i32 %a, %b
    183   br i1 %cmp2, label %istrue, label %isfalse
    184 
    185 istrue:
    186   call void @is(i1 true)
    187   ret void
    188 
    189 isfalse:
    190   call void @is(i1 false)
    191   ret void
    192 
    193 untaken:
    194   ret void
    195 }
    196 
    197 ; If A >u B is false then A <=u B is implied true.
    198 ; CHECK-LABEL: @test_ugt_ule
    199 ; CHECK: call void @is(i1 true)
    200 ; CHECK-NOT: call void @is(i1 false)
    201 define void @test_ugt_ule(i32 %a, i32 %b) {
    202   %cmp1 = icmp ugt i32 %a, %b
    203   br i1 %cmp1, label %untaken, label %taken
    204 
    205 taken:
    206   %cmp2 = icmp ule i32 %a, %b
    207   br i1 %cmp2, label %istrue, label %isfalse
    208 
    209 istrue:
    210   call void @is(i1 true)
    211   ret void
    212 
    213 isfalse:
    214   call void @is(i1 false)
    215   ret void
    216 
    217 untaken:
    218   ret void
    219 }
    220 
    221 ; If A >=u B is false then A >=u B is implied false.
    222 ; CHECK-LABEL: @test_uge_uge
    223 ; CHECK-NOT: call void @is(i1 true)
    224 ; CHECK: call void @is(i1 false)
    225 define void @test_uge_uge(i32 %a, i32 %b) {
    226   %cmp1 = icmp uge i32 %a, %b
    227   br i1 %cmp1, label %untaken, label %taken
    228 
    229 taken:
    230   %cmp2 = icmp uge i32 %a, %b
    231   br i1 %cmp2, label %istrue, label %isfalse
    232 
    233 istrue:
    234   call void @is(i1 true)
    235   ret void
    236 
    237 isfalse:
    238   call void @is(i1 false)
    239   ret void
    240 
    241 untaken:
    242   ret void
    243 }
    244 
    245 ; If A >=u B is false then A <u B is implied true.
    246 ; CHECK-LABEL: @test_uge_ult
    247 ; CHECK: call void @is(i1 true)
    248 ; CHECK-NOT: call void @is(i1 false)
    249 define void @test_uge_ult(i32 %a, i32 %b) {
    250   %cmp1 = icmp uge i32 %a, %b
    251   br i1 %cmp1, label %untaken, label %taken
    252 
    253 taken:
    254   %cmp2 = icmp ult i32 %a, %b
    255   br i1 %cmp2, label %istrue, label %isfalse
    256 
    257 istrue:
    258   call void @is(i1 true)
    259   ret void
    260 
    261 isfalse:
    262   call void @is(i1 false)
    263   ret void
    264 
    265 untaken:
    266   ret void
    267 }
    268 
    269 ; If A >=u B is false then A <=u B is implied true.
    270 ; CHECK-LABEL: @test_uge_ule
    271 ; CHECK: call void @is(i1 true)
    272 ; CHECK-NOT: call void @is(i1 false)
    273 define void @test_uge_ule(i32 %a, i32 %b) {
    274   %cmp1 = icmp uge i32 %a, %b
    275   br i1 %cmp1, label %untaken, label %taken
    276 
    277 taken:
    278   %cmp2 = icmp ule i32 %a, %b
    279   br i1 %cmp2, label %istrue, label %isfalse
    280 
    281 istrue:
    282   call void @is(i1 true)
    283   ret void
    284 
    285 isfalse:
    286   call void @is(i1 false)
    287   ret void
    288 
    289 untaken:
    290   ret void
    291 }
    292 
    293 ; If A <u B is false then A <u B is implied false.
    294 ; CHECK-LABEL: @test_ult_ult
    295 ; CHECK-NOT: call void @is(i1 true)
    296 ; CHECK: call void @is(i1 false)
    297 define void @test_ult_ult(i32 %a, i32 %b) {
    298   %cmp1 = icmp ult i32 %a, %b
    299   br i1 %cmp1, label %untaken, label %taken
    300 
    301 taken:
    302   %cmp2 = icmp ult i32 %a, %b
    303   br i1 %cmp2, label %istrue, label %isfalse
    304 
    305 istrue:
    306   call void @is(i1 true)
    307   ret void
    308 
    309 isfalse:
    310   call void @is(i1 false)
    311   ret void
    312 
    313 untaken:
    314   ret void
    315 }
    316 
    317 ; If A <=u B is false then A <=u B is implied false.
    318 ; CHECK-LABEL: @test_ule_ule
    319 ; CHECK-NOT: call void @is(i1 true)
    320 ; CHECK: call void @is(i1 false)
    321 define void @test_ule_ule(i32 %a, i32 %b) {
    322   %cmp1 = icmp ule i32 %a, %b
    323   br i1 %cmp1, label %untaken, label %taken
    324 
    325 taken:
    326   %cmp2 = icmp ule i32 %a, %b
    327   br i1 %cmp2, label %istrue, label %isfalse
    328 
    329 istrue:
    330   call void @is(i1 true)
    331   ret void
    332 
    333 isfalse:
    334   call void @is(i1 false)
    335   ret void
    336 
    337 untaken:
    338   ret void
    339 }
    340