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