1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...) 5*9880d681SAndroid Build Coastguard Workerdeclare void @__cxa_call_unexpected(i8*) 6*9880d681SAndroid Build Coastguard Workerdeclare void @purefn() nounwind readnone 7*9880d681SAndroid Build Coastguard Workerdeclare i32 @read_only() nounwind readonly 8*9880d681SAndroid Build Coastguard Workerdeclare i32 @nounwind_fn() nounwind 9*9880d681SAndroid Build Coastguard Workerdeclare i32 @fn() 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f1( 13*9880d681SAndroid Build Coastguard Workerdefine i8* @f1() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker; CHECK: call void @llvm.trap() 16*9880d681SAndroid Build Coastguard Worker; CHECK: unreachable 17*9880d681SAndroid Build Coastguard Worker %call = invoke noalias i8* undef() 18*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerinvoke.cont: 21*9880d681SAndroid Build Coastguard Worker ret i8* %call 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerlpad: 24*9880d681SAndroid Build Coastguard Worker %0 = landingpad { i8*, i32 } 25*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 26*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i8*, i32 } %0, 0 27*9880d681SAndroid Build Coastguard Worker tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind 28*9880d681SAndroid Build Coastguard Worker unreachable 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f2( 32*9880d681SAndroid Build Coastguard Workerdefine i8* @f2() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker; CHECK: call void @llvm.trap() 35*9880d681SAndroid Build Coastguard Worker; CHECK: unreachable 36*9880d681SAndroid Build Coastguard Worker %call = invoke noalias i8* null() 37*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerinvoke.cont: 40*9880d681SAndroid Build Coastguard Worker ret i8* %call 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerlpad: 43*9880d681SAndroid Build Coastguard Worker %0 = landingpad { i8*, i32 } 44*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 45*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i8*, i32 } %0, 0 46*9880d681SAndroid Build Coastguard Worker tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind 47*9880d681SAndroid Build Coastguard Worker unreachable 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f3( 51*9880d681SAndroid Build Coastguard Workerdefine i32 @f3() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry 53*9880d681SAndroid Build Coastguard Workerentry: 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 3 55*9880d681SAndroid Build Coastguard Worker %call = invoke i32 @read_only() 56*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerinvoke.cont: 59*9880d681SAndroid Build Coastguard Worker ret i32 3 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerlpad: 62*9880d681SAndroid Build Coastguard Worker %0 = landingpad { i8*, i32 } 63*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 64*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i8*, i32 } %0, 0 65*9880d681SAndroid Build Coastguard Worker tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind 66*9880d681SAndroid Build Coastguard Worker unreachable 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f4( 70*9880d681SAndroid Build Coastguard Workerdefine i32 @f4() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry 72*9880d681SAndroid Build Coastguard Workerentry: 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i32 @read_only() 74*9880d681SAndroid Build Coastguard Worker %call = invoke i32 @read_only() 75*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerinvoke.cont: 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %call 79*9880d681SAndroid Build Coastguard Worker ret i32 %call 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerlpad: 82*9880d681SAndroid Build Coastguard Worker %0 = landingpad { i8*, i32 } 83*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 84*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i8*, i32 } %0, 0 85*9880d681SAndroid Build Coastguard Worker tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind 86*9880d681SAndroid Build Coastguard Worker unreachable 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f5( 90*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i1 %cond, i8* %a, i8* %b) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 91*9880d681SAndroid Build Coastguard Workerentry: 92*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %x, label %y 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerx: 95*9880d681SAndroid Build Coastguard Worker; CHECK: invoke i32 @fn() 96*9880d681SAndroid Build Coastguard Worker %call = invoke i32 @fn() 97*9880d681SAndroid Build Coastguard Worker to label %cont unwind label %lpad 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workery: 100*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @nounwind_fn() 101*9880d681SAndroid Build Coastguard Worker %call2 = invoke i32 @nounwind_fn() 102*9880d681SAndroid Build Coastguard Worker to label %cont unwind label %lpad 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workercont: 105*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 106*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %phi 107*9880d681SAndroid Build Coastguard Worker %phi = phi i32 [%call, %x], [%call2, %y] 108*9880d681SAndroid Build Coastguard Worker ret i32 %phi 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerlpad: 111*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 112*9880d681SAndroid Build Coastguard Worker %phi2 = phi i8* [%a, %x], [%b, %y] 113*9880d681SAndroid Build Coastguard Worker %0 = landingpad { i8*, i32 } 114*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 115*9880d681SAndroid Build Coastguard Worker; CHECK: __cxa_call_unexpected(i8* %a) 116*9880d681SAndroid Build Coastguard Worker tail call void @__cxa_call_unexpected(i8* %phi2) noreturn nounwind 117*9880d681SAndroid Build Coastguard Worker unreachable 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f6( 121*9880d681SAndroid Build Coastguard Workerdefine void @f6() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 122*9880d681SAndroid Build Coastguard Workerentry: 123*9880d681SAndroid Build Coastguard Worker invoke void @purefn() 124*9880d681SAndroid Build Coastguard Worker to label %invoke.cont1 unwind label %lpad 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerinvoke.cont1: 127*9880d681SAndroid Build Coastguard Worker %foo = invoke i32 @fn() 128*9880d681SAndroid Build Coastguard Worker to label %invoke.cont2 unwind label %lpad 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerinvoke.cont2: 131*9880d681SAndroid Build Coastguard Worker ret void 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerlpad: 134*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi 135*9880d681SAndroid Build Coastguard Worker %tmp = phi i8* [ null, %invoke.cont1 ], [ null, %entry ] 136*9880d681SAndroid Build Coastguard Worker landingpad { i8*, i32 } 137*9880d681SAndroid Build Coastguard Worker cleanup 138*9880d681SAndroid Build Coastguard Worker ret void 139*9880d681SAndroid Build Coastguard Worker} 140