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