1*9880d681SAndroid Build Coastguard Worker; RUN: opt %s -S -simplifycfg | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; cmp1 implies cmp2 is false 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 5*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @is(i1 true) 6*9880d681SAndroid Build Coastguard Worker; CHECK: call void @is(i1 false) 7*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 %a) { 8*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %a, 0 9*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %taken, label %untaken 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workertaken: 12*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp eq i32 %a, 1 13*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %istrue, label %isfalse 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workeristrue: 16*9880d681SAndroid Build Coastguard Worker call void @is(i1 true) 17*9880d681SAndroid Build Coastguard Worker ret void 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerisfalse: 20*9880d681SAndroid Build Coastguard Worker call void @is(i1 false) 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workeruntaken: 24*9880d681SAndroid Build Coastguard Worker ret void 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; cmp1 implies cmp2 is false 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 29*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @is(i1 true) 30*9880d681SAndroid Build Coastguard Worker; CHECK: call void @is(i1 false) 31*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32 %a) { 32*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ugt i32 %a, 5 33*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %untaken, label %taken 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workertaken: 36*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ugt i32 %a, 6 37*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %istrue, label %isfalse 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workeristrue: 40*9880d681SAndroid Build Coastguard Worker call void @is(i1 true) 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerisfalse: 44*9880d681SAndroid Build Coastguard Worker call void @is(i1 false) 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workeruntaken: 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; cmp1 implies cmp2 is false 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @is(i1 true) 54*9880d681SAndroid Build Coastguard Worker; CHECK: call void @is(i1 false) 55*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32 %a) { 56*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ugt i32 %a, 1 57*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %taken, label %untaken 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workertaken: 60*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp eq i32 %a, 0 61*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %istrue, label %isfalse 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workeristrue: 64*9880d681SAndroid Build Coastguard Worker call void @is(i1 true) 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerisfalse: 68*9880d681SAndroid Build Coastguard Worker call void @is(i1 false) 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workeruntaken: 72*9880d681SAndroid Build Coastguard Worker ret void 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; cmp1 implies cmp2 is true 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 77*9880d681SAndroid Build Coastguard Worker; CHECK: call void @is(i1 true) 78*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @is(i1 false) 79*9880d681SAndroid Build Coastguard Workerdefine void @test4(i32 %a) { 80*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp sgt i32 %a, 1 81*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %taken, label %untaken 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workertaken: 84*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ugt i32 %a, 0 85*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %istrue, label %isfalse 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workeristrue: 88*9880d681SAndroid Build Coastguard Worker call void @is(i1 true) 89*9880d681SAndroid Build Coastguard Worker ret void 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerisfalse: 92*9880d681SAndroid Build Coastguard Worker call void @is(i1 false) 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workeruntaken: 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; cmp1 implies cmp2 is true 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 101*9880d681SAndroid Build Coastguard Worker; CHECK: call void @is(i1 true) 102*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @is(i1 false) 103*9880d681SAndroid Build Coastguard Workerdefine void @test5(i32 %a) { 104*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp sgt i32 %a, 5 105*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %taken, label %untaken 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workertaken: 108*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sgt i32 %a, -1 109*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %istrue, label %isfalse 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workeristrue: 112*9880d681SAndroid Build Coastguard Worker call void @is(i1 true) 113*9880d681SAndroid Build Coastguard Worker ret void 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerisfalse: 116*9880d681SAndroid Build Coastguard Worker call void @is(i1 false) 117*9880d681SAndroid Build Coastguard Worker ret void 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workeruntaken: 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdeclare void @is(i1) 124