1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @test1(i1 %C, i1* %BP) { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 5*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker br i1 %C, label %T, label %F 9*9880d681SAndroid Build Coastguard WorkerT: 10*9880d681SAndroid Build Coastguard Worker store i1 %C, i1* %BP 11*9880d681SAndroid Build Coastguard Worker unreachable 12*9880d681SAndroid Build Coastguard WorkerF: 13*9880d681SAndroid Build Coastguard Worker ret void 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine void @test2() personality i32 (...)* @__gxx_personality_v0 { 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 18*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @test2() 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 21*9880d681SAndroid Build Coastguard Workerentry: 22*9880d681SAndroid Build Coastguard Worker invoke void @test2( ) 23*9880d681SAndroid Build Coastguard Worker to label %N unwind label %U 24*9880d681SAndroid Build Coastguard WorkerU: 25*9880d681SAndroid Build Coastguard Worker %res = landingpad { i8* } 26*9880d681SAndroid Build Coastguard Worker cleanup 27*9880d681SAndroid Build Coastguard Worker unreachable 28*9880d681SAndroid Build Coastguard WorkerN: 29*9880d681SAndroid Build Coastguard Worker ret void 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...) 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %v) { 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 36*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%[A-Za-z0-9]+]] = icmp eq i32 %v, 2 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 [[CMP]], i32 2, i32 1 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker switch i32 %v, label %default [ 42*9880d681SAndroid Build Coastguard Worker i32 1, label %U 43*9880d681SAndroid Build Coastguard Worker i32 2, label %T 44*9880d681SAndroid Build Coastguard Worker ] 45*9880d681SAndroid Build Coastguard Workerdefault: 46*9880d681SAndroid Build Coastguard Worker ret i32 1 47*9880d681SAndroid Build Coastguard WorkerU: 48*9880d681SAndroid Build Coastguard Worker unreachable 49*9880d681SAndroid Build Coastguard WorkerT: 50*9880d681SAndroid Build Coastguard Worker ret i32 2 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker;; We can either convert the following control-flow to a select or remove the 55*9880d681SAndroid Build Coastguard Worker;; unreachable control flow because of the undef store of null. Make sure we do 56*9880d681SAndroid Build Coastguard Worker;; the latter. 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine void @test5(i1 %cond, i8* %ptr) { 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5 61*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 62*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 63*9880d681SAndroid Build Coastguard Worker; CHECK: store i8 2, i8* %ptr 64*9880d681SAndroid Build Coastguard Worker; CHECK: ret 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerentry: 67*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %bb1, label %bb3 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerbb3: 70*9880d681SAndroid Build Coastguard Worker br label %bb2 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerbb1: 73*9880d681SAndroid Build Coastguard Worker br label %bb2 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerbb2: 76*9880d681SAndroid Build Coastguard Worker %ptr.2 = phi i8* [ %ptr, %bb3 ], [ null, %bb1 ] 77*9880d681SAndroid Build Coastguard Worker store i8 2, i8* %ptr.2, align 8 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6 82*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 84*9880d681SAndroid Build Coastguard Worker; CHECK: store i8 2, i8* %ptr 85*9880d681SAndroid Build Coastguard Worker; CHECK: ret 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine void @test6(i1 %cond, i8* %ptr) { 88*9880d681SAndroid Build Coastguard Workerentry: 89*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %bb1, label %bb2 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerbb1: 92*9880d681SAndroid Build Coastguard Worker br label %bb2 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerbb2: 95*9880d681SAndroid Build Coastguard Worker %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ] 96*9880d681SAndroid Build Coastguard Worker store i8 2, i8* %ptr.2, align 8 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i1 %X) { 101*9880d681SAndroid Build Coastguard Workerentry: 102*9880d681SAndroid Build Coastguard Worker br i1 %X, label %if, label %else 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerif: 105*9880d681SAndroid Build Coastguard Worker call void undef() 106*9880d681SAndroid Build Coastguard Worker br label %else 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerelse: 109*9880d681SAndroid Build Coastguard Worker %phi = phi i32 [ 0, %entry ], [ 1, %if ] 110*9880d681SAndroid Build Coastguard Worker ret i32 %phi 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test7( 113*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call 114*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdefine void @test8(i1 %X, void ()* %Y) { 117*9880d681SAndroid Build Coastguard Workerentry: 118*9880d681SAndroid Build Coastguard Worker br i1 %X, label %if, label %else 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerif: 121*9880d681SAndroid Build Coastguard Worker br label %else 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerelse: 124*9880d681SAndroid Build Coastguard Worker %phi = phi void ()* [ %Y, %entry ], [ null, %if ] 125*9880d681SAndroid Build Coastguard Worker call void %phi() 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test8( 129*9880d681SAndroid Build Coastguard Worker; CHECK: call void %Y( 130