1 ; RUN: opt -jump-threading -S < %s | FileCheck %s 2 3 declare void @side_effect(i32) 4 5 define void @test0(i32 %i, i32 %len) { 6 ; CHECK-LABEL: @test0( 7 entry: 8 call void @side_effect(i32 0) 9 %i.inc = add nuw i32 %i, 1 10 %c0 = icmp ult i32 %i.inc, %len 11 br i1 %c0, label %left, label %right 12 13 left: 14 ; CHECK: entry: 15 ; CHECK: br i1 %c0, label %left0, label %right 16 17 ; CHECK: left0: 18 ; CHECK: call void @side_effect 19 ; CHECK-NOT: br i1 %c1 20 ; CHECK: call void @side_effect 21 call void @side_effect(i32 0) 22 %c1 = icmp ult i32 %i, %len 23 br i1 %c1, label %left0, label %right 24 25 left0: 26 call void @side_effect(i32 0) 27 ret void 28 29 right: 30 %t = phi i32 [ 1, %left ], [ 2, %entry ] 31 call void @side_effect(i32 %t) 32 ret void 33 } 34 35 define void @test1(i32 %i, i32 %len) { 36 ; CHECK-LABEL: @test1( 37 entry: 38 call void @side_effect(i32 0) 39 %i.inc = add nsw i32 %i, 1 40 %c0 = icmp slt i32 %i.inc, %len 41 br i1 %c0, label %left, label %right 42 43 left: 44 ; CHECK: entry: 45 ; CHECK: br i1 %c0, label %left0, label %right 46 47 ; CHECK: left0: 48 ; CHECK: call void @side_effect 49 ; CHECK-NOT: br i1 %c1 50 ; CHECK: call void @side_effect 51 call void @side_effect(i32 0) 52 %c1 = icmp slt i32 %i, %len 53 br i1 %c1, label %left0, label %right 54 55 left0: 56 call void @side_effect(i32 0) 57 ret void 58 59 right: 60 %t = phi i32 [ 1, %left ], [ 2, %entry ] 61 call void @side_effect(i32 %t) 62 ret void 63 } 64 65 define void @test2(i32 %i, i32 %len, i1* %c.ptr) { 66 ; CHECK-LABEL: @test2( 67 68 ; CHECK: entry: 69 ; CHECK: br i1 %c0, label %cont, label %right 70 ; CHECK: cont: 71 ; CHECK: br i1 %c, label %left0, label %right 72 ; CHECK: left0: 73 ; CHECK: call void @side_effect(i32 0) 74 ; CHECK: call void @side_effect(i32 0) 75 entry: 76 call void @side_effect(i32 0) 77 %i.inc = add nsw i32 %i, 1 78 %c0 = icmp slt i32 %i.inc, %len 79 br i1 %c0, label %cont, label %right 80 81 cont: 82 %c = load i1, i1* %c.ptr 83 br i1 %c, label %left, label %right 84 85 left: 86 call void @side_effect(i32 0) 87 %c1 = icmp slt i32 %i, %len 88 br i1 %c1, label %left0, label %right 89 90 left0: 91 call void @side_effect(i32 0) 92 ret void 93 94 right: 95 %t = phi i32 [ 1, %left ], [ 2, %entry ], [ 3, %cont ] 96 call void @side_effect(i32 %t) 97 ret void 98 } 99 100 ; A s<= B implies A s> B is false. 101 ; CHECK-LABEL: @test3( 102 ; CHECK: entry: 103 ; CHECK: br i1 %cmp, label %if.end, label %if.end3 104 ; CHECK-NOT: br i1 %cmp1, label %if.then2, label %if.end 105 ; CHECK-NOT: call void @side_effect(i32 0) 106 ; CHECK: br label %if.end3 107 ; CHECK: ret void 108 109 define void @test3(i32 %a, i32 %b) { 110 entry: 111 %cmp = icmp sle i32 %a, %b 112 br i1 %cmp, label %if.then, label %if.end3 113 114 if.then: 115 %cmp1 = icmp sgt i32 %a, %b 116 br i1 %cmp1, label %if.then2, label %if.end 117 118 if.then2: 119 call void @side_effect(i32 0) 120 br label %if.end 121 122 if.end: 123 br label %if.end3 124 125 if.end3: 126 ret void 127 } 128 129 declare void @is(i1) 130 131 ; If A >=s B is false then A <=s B is implied true. 132 ; CHECK-LABEL: @test_sge_sle 133 ; CHECK: call void @is(i1 true) 134 ; CHECK-NOT: call void @is(i1 false) 135 define void @test_sge_sle(i32 %a, i32 %b) { 136 %cmp1 = icmp sge i32 %a, %b 137 br i1 %cmp1, label %untaken, label %taken 138 139 taken: 140 %cmp2 = icmp sle i32 %a, %b 141 br i1 %cmp2, label %istrue, label %isfalse 142 143 istrue: 144 call void @is(i1 true) 145 ret void 146 147 isfalse: 148 call void @is(i1 false) 149 ret void 150 151 untaken: 152 ret void 153 } 154 155 ; If A <=s B is false then A <=s B is implied false. 156 ; CHECK-LABEL: @test_sle_sle 157 ; CHECK-NOT: call void @is(i1 true) 158 ; CHECK: call void @is(i1 false) 159 define void @test_sle_sle(i32 %a, i32 %b) { 160 %cmp1 = icmp sle i32 %a, %b 161 br i1 %cmp1, label %untaken, label %taken 162 163 taken: 164 %cmp2 = icmp sle i32 %a, %b 165 br i1 %cmp2, label %istrue, label %isfalse 166 167 istrue: 168 call void @is(i1 true) 169 ret void 170 171 isfalse: 172 call void @is(i1 false) 173 ret void 174 175 untaken: 176 ret void 177 } 178