178 lines · plain
1; RUN: opt -passes=jump-threading -S < %s | FileCheck %s2 3declare void @side_effect(i32)4 5define 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, 110 %c0 = icmp ult i32 %i.inc, %len11 br i1 %c0, label %left, label %right12 13 left:14; CHECK: entry:15; CHECK: br i1 %c0, label %left0, label %right16 17; CHECK: left0:18; CHECK: call void @side_effect19; CHECK-NOT: br i1 %c120; CHECK: call void @side_effect21 call void @side_effect(i32 0)22 %c1 = icmp ult i32 %i, %len23 br i1 %c1, label %left0, label %right24 25 left0:26 call void @side_effect(i32 0)27 ret void28 29 right:30 %t = phi i32 [ 1, %left ], [ 2, %entry ]31 call void @side_effect(i32 %t)32 ret void33}34 35define 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, 140 %c0 = icmp slt i32 %i.inc, %len41 br i1 %c0, label %left, label %right42 43 left:44; CHECK: entry:45; CHECK: br i1 %c0, label %left0, label %right46 47; CHECK: left0:48; CHECK: call void @side_effect49; CHECK-NOT: br i1 %c150; CHECK: call void @side_effect51 call void @side_effect(i32 0)52 %c1 = icmp slt i32 %i, %len53 br i1 %c1, label %left0, label %right54 55 left0:56 call void @side_effect(i32 0)57 ret void58 59 right:60 %t = phi i32 [ 1, %left ], [ 2, %entry ]61 call void @side_effect(i32 %t)62 ret void63}64 65define void @test2(i32 %i, i32 %len, ptr %c.ptr) {66; CHECK-LABEL: @test2(67 68; CHECK: entry:69; CHECK: br i1 %c0, label %cont, label %right70; CHECK: cont:71; CHECK: br i1 %c, label %left0, label %right72; 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, 178 %c0 = icmp slt i32 %i.inc, %len79 br i1 %c0, label %cont, label %right80 81 cont:82 %c = load i1, ptr %c.ptr83 br i1 %c, label %left, label %right84 85 left:86 call void @side_effect(i32 0)87 %c1 = icmp slt i32 %i, %len88 br i1 %c1, label %left0, label %right89 90 left0:91 call void @side_effect(i32 0)92 ret void93 94 right:95 %t = phi i32 [ 1, %left ], [ 2, %entry ], [ 3, %cont ]96 call void @side_effect(i32 %t)97 ret void98}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.end3104; CHECK-NOT: br i1 %cmp1, label %if.then2, label %if.end105; CHECK-NOT: call void @side_effect(i32 0)106; CHECK: br label %if.end3107; CHECK: ret void108 109define void @test3(i32 %a, i32 %b) {110entry:111 %cmp = icmp sle i32 %a, %b112 br i1 %cmp, label %if.then, label %if.end3113 114if.then:115 %cmp1 = icmp sgt i32 %a, %b116 br i1 %cmp1, label %if.then2, label %if.end117 118if.then2:119 call void @side_effect(i32 0)120 br label %if.end121 122if.end:123 br label %if.end3124 125if.end3:126 ret void127}128 129declare void @is(i1)130 131; If A >=s B is false then A <=s B is implied true.132; CHECK-LABEL: @test_sge_sle133; CHECK: call void @is(i1 true)134; CHECK-NOT: call void @is(i1 false)135define void @test_sge_sle(i32 %a, i32 %b) {136 %cmp1 = icmp sge i32 %a, %b137 br i1 %cmp1, label %untaken, label %taken138 139taken:140 %cmp2 = icmp sle i32 %a, %b141 br i1 %cmp2, label %istrue, label %isfalse142 143istrue:144 call void @is(i1 true)145 ret void146 147isfalse:148 call void @is(i1 false)149 ret void150 151untaken:152 ret void153}154 155; If A <=s B is false then A <=s B is implied false.156; CHECK-LABEL: @test_sle_sle157; CHECK-NOT: call void @is(i1 true)158; CHECK: call void @is(i1 false)159define void @test_sle_sle(i32 %a, i32 %b) {160 %cmp1 = icmp sle i32 %a, %b161 br i1 %cmp1, label %untaken, label %taken162 163taken:164 %cmp2 = icmp sle i32 %a, %b165 br i1 %cmp2, label %istrue, label %isfalse166 167istrue:168 call void @is(i1 true)169 ret void170 171isfalse:172 call void @is(i1 false)173 ret void174 175untaken:176 ret void177}178