1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker br i1 %flag, label %if.then, label %if.else 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1 8*9880d681SAndroid Build Coastguard Worker; CHECK: add 9*9880d681SAndroid Build Coastguard Worker; CHECK: select 10*9880d681SAndroid Build Coastguard Worker; CHECK: icmp 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br 12*9880d681SAndroid Build Coastguard Workerif.then: 13*9880d681SAndroid Build Coastguard Worker %cmp = icmp uge i32 %blksA, %nblks 14*9880d681SAndroid Build Coastguard Worker %frombool1 = zext i1 %cmp to i8 15*9880d681SAndroid Build Coastguard Worker br label %if.end 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerif.else: 18*9880d681SAndroid Build Coastguard Worker %add = add i32 %nblks, %blksB 19*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ule i32 %add, %blksA 20*9880d681SAndroid Build Coastguard Worker %frombool3 = zext i1 %cmp2 to i8 21*9880d681SAndroid Build Coastguard Worker br label %if.end 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerif.end: 24*9880d681SAndroid Build Coastguard Worker %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ] 25*9880d681SAndroid Build Coastguard Worker %tobool4 = icmp ne i8 %obeys.0, 0 26*9880d681SAndroid Build Coastguard Worker ret i1 %tobool4 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) { 30*9880d681SAndroid Build Coastguard Workerentry: 31*9880d681SAndroid Build Coastguard Worker br i1 %flag, label %if.then, label %if.else 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2 34*9880d681SAndroid Build Coastguard Worker; CHECK: add 35*9880d681SAndroid Build Coastguard Worker; CHECK: select 36*9880d681SAndroid Build Coastguard Worker; CHECK: icmp 37*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br 38*9880d681SAndroid Build Coastguard Workerif.then: 39*9880d681SAndroid Build Coastguard Worker %cmp = icmp uge i32 %blksA, %nblks 40*9880d681SAndroid Build Coastguard Worker %frombool1 = zext i1 %cmp to i8 41*9880d681SAndroid Build Coastguard Worker br label %if.end 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerif.else: 44*9880d681SAndroid Build Coastguard Worker %add = add i32 %nblks, %blksB 45*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp uge i32 %blksA, %add 46*9880d681SAndroid Build Coastguard Worker %frombool3 = zext i1 %cmp2 to i8 47*9880d681SAndroid Build Coastguard Worker br label %if.end 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerif.end: 50*9880d681SAndroid Build Coastguard Worker %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ] 51*9880d681SAndroid Build Coastguard Worker %tobool4 = icmp ne i8 %obeys.0, 0 52*9880d681SAndroid Build Coastguard Worker ret i1 %tobool4 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo(i32, i32) nounwind readnone 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i1 zeroext %flag, i32 %x, i32 %y) { 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker br i1 %flag, label %if.then, label %if.else 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerif.then: 62*9880d681SAndroid Build Coastguard Worker %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone 63*9880d681SAndroid Build Coastguard Worker %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone 64*9880d681SAndroid Build Coastguard Worker br label %if.end 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerif.else: 67*9880d681SAndroid Build Coastguard Worker %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone 68*9880d681SAndroid Build Coastguard Worker %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone 69*9880d681SAndroid Build Coastguard Worker br label %if.end 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerif.end: 72*9880d681SAndroid Build Coastguard Worker %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ] 73*9880d681SAndroid Build Coastguard Worker %yy = phi i32 [ %y0, %if.then ], [ %y1, %if.else ] 74*9880d681SAndroid Build Coastguard Worker %ret = add i32 %xx, %yy 75*9880d681SAndroid Build Coastguard Worker ret i32 %ret 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3 79*9880d681SAndroid Build Coastguard Worker; CHECK: select 80*9880d681SAndroid Build Coastguard Worker; CHECK: call 81*9880d681SAndroid Build Coastguard Worker; CHECK: call 82*9880d681SAndroid Build Coastguard Worker; CHECK: add 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br 84