brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · 8aa8790 Raw
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