Home | History | Annotate | Download | only in SimplifyCFG
      1 ; RUN: opt %s -S -simplifycfg | FileCheck %s
      2 
      3 ; cmp1 implies cmp2 is false
      4 ; CHECK-LABEL: @test1
      5 ; CHECK-NOT: call void @is(i1 true)
      6 ; CHECK: call void @is(i1 false)
      7 define void @test1(i32 %a) {
      8   %cmp1 = icmp eq i32 %a, 0
      9   br i1 %cmp1, label %taken, label %untaken
     10 
     11 taken:
     12   %cmp2 = icmp eq i32 %a, 1
     13   br i1 %cmp2, label %istrue, label %isfalse
     14 
     15 istrue:
     16   call void @is(i1 true)
     17   ret void
     18 
     19 isfalse:
     20   call void @is(i1 false)
     21   ret void
     22 
     23 untaken:
     24   ret void
     25 }
     26 
     27 ; cmp1 implies cmp2 is false
     28 ; CHECK-LABEL: @test2
     29 ; CHECK-NOT: call void @is(i1 true)
     30 ; CHECK: call void @is(i1 false)
     31 define void @test2(i32 %a) {
     32   %cmp1 = icmp ugt i32 %a, 5
     33   br i1 %cmp1, label %untaken, label %taken
     34 
     35 taken:
     36   %cmp2 = icmp ugt i32 %a, 6
     37   br i1 %cmp2, label %istrue, label %isfalse
     38 
     39 istrue:
     40   call void @is(i1 true)
     41   ret void
     42 
     43 isfalse:
     44   call void @is(i1 false)
     45   ret void
     46 
     47 untaken:
     48   ret void
     49 }
     50 
     51 ; cmp1 implies cmp2 is false
     52 ; CHECK-LABEL: @test3
     53 ; CHECK-NOT: call void @is(i1 true)
     54 ; CHECK: call void @is(i1 false)
     55 define void @test3(i32 %a) {
     56   %cmp1 = icmp ugt i32 %a, 1
     57   br i1 %cmp1, label %taken, label %untaken
     58 
     59 taken:
     60   %cmp2 = icmp eq i32 %a, 0
     61   br i1 %cmp2, label %istrue, label %isfalse
     62 
     63 istrue:
     64   call void @is(i1 true)
     65   ret void
     66 
     67 isfalse:
     68   call void @is(i1 false)
     69   ret void
     70 
     71 untaken:
     72   ret void
     73 }
     74 
     75 ; cmp1 implies cmp2 is true
     76 ; CHECK-LABEL: @test4
     77 ; CHECK: call void @is(i1 true)
     78 ; CHECK-NOT: call void @is(i1 false)
     79 define void @test4(i32 %a) {
     80   %cmp1 = icmp sgt i32 %a, 1
     81   br i1 %cmp1, label %taken, label %untaken
     82 
     83 taken:
     84   %cmp2 = icmp ugt i32 %a, 0
     85   br i1 %cmp2, label %istrue, label %isfalse
     86 
     87 istrue:
     88   call void @is(i1 true)
     89   ret void
     90 
     91 isfalse:
     92   call void @is(i1 false)
     93   ret void
     94 
     95 untaken:
     96   ret void
     97 }
     98 
     99 ; cmp1 implies cmp2 is true
    100 ; CHECK-LABEL: @test5
    101 ; CHECK: call void @is(i1 true)
    102 ; CHECK-NOT: call void @is(i1 false)
    103 define void @test5(i32 %a) {
    104   %cmp1 = icmp sgt i32 %a, 5
    105   br i1 %cmp1, label %taken, label %untaken
    106 
    107 taken:
    108   %cmp2 = icmp sgt i32 %a, -1
    109   br i1 %cmp2, label %istrue, label %isfalse
    110 
    111 istrue:
    112   call void @is(i1 true)
    113   ret void
    114 
    115 isfalse:
    116   call void @is(i1 false)
    117   ret void
    118 
    119 untaken:
    120   ret void
    121 }
    122 
    123 declare void @is(i1)
    124