1*9880d681SAndroid Build Coastguard Worker; RUN: opt -mtriple=x86_x64-pc-windows-msvc -S -winehprepare -disable-demotion -disable-cleanups < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...) 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare i32 @__C_specific_handler(...) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare void @f() 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdeclare i32 @g() 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdeclare void @h(i32) 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 14*9880d681SAndroid Build Coastguard Workerdefine void @test1(i1 %bool) personality i32 (...)* @__C_specific_handler { 15*9880d681SAndroid Build Coastguard Workerentry: 16*9880d681SAndroid Build Coastguard Worker invoke void @f() 17*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %left 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerinvoke.cont: 20*9880d681SAndroid Build Coastguard Worker invoke void @f() 21*9880d681SAndroid Build Coastguard Worker to label %exit unwind label %inner 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerleft: 24*9880d681SAndroid Build Coastguard Worker %0 = cleanuppad within none [] 25*9880d681SAndroid Build Coastguard Worker br i1 %bool, label %shared, label %cleanupret 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workercleanupret: 28*9880d681SAndroid Build Coastguard Worker cleanupret from %0 unwind label %right 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerright: 31*9880d681SAndroid Build Coastguard Worker %1 = cleanuppad within none [] 32*9880d681SAndroid Build Coastguard Worker br label %shared 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workershared: 35*9880d681SAndroid Build Coastguard Worker %x = call i32 @g() 36*9880d681SAndroid Build Coastguard Worker invoke void @f() 37*9880d681SAndroid Build Coastguard Worker to label %shared.cont unwind label %inner 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workershared.cont: 40*9880d681SAndroid Build Coastguard Worker unreachable 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerinner: 43*9880d681SAndroid Build Coastguard Worker %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ] 44*9880d681SAndroid Build Coastguard Worker %i = cleanuppad within none [] 45*9880d681SAndroid Build Coastguard Worker call void @h(i32 %phi) 46*9880d681SAndroid Build Coastguard Worker unreachable 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; CHECK: %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ], [ %x.for.left, %shared.for.left ] 49*9880d681SAndroid Build Coastguard Worker; CHECK: %i = cleanuppad within none [] 50*9880d681SAndroid Build Coastguard Worker; CHECK: call void @h(i32 %phi) 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerexit: 53*9880d681SAndroid Build Coastguard Worker unreachable 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 57*9880d681SAndroid Build Coastguard Workerdefine void @test2(i1 %bool) personality i32 (...)* @__C_specific_handler { 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker invoke void @f() 60*9880d681SAndroid Build Coastguard Worker to label %shared.cont unwind label %left 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerleft: 63*9880d681SAndroid Build Coastguard Worker %0 = cleanuppad within none [] 64*9880d681SAndroid Build Coastguard Worker br i1 %bool, label %shared, label %cleanupret 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workercleanupret: 67*9880d681SAndroid Build Coastguard Worker cleanupret from %0 unwind label %right 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerright: 70*9880d681SAndroid Build Coastguard Worker %1 = cleanuppad within none [] 71*9880d681SAndroid Build Coastguard Worker br label %shared 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workershared: 74*9880d681SAndroid Build Coastguard Worker %x = call i32 @g() 75*9880d681SAndroid Build Coastguard Worker invoke void @f() 76*9880d681SAndroid Build Coastguard Worker to label %shared.cont unwind label %inner 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workershared.cont: 79*9880d681SAndroid Build Coastguard Worker unreachable 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerinner: 82*9880d681SAndroid Build Coastguard Worker %i = cleanuppad within none [] 83*9880d681SAndroid Build Coastguard Worker call void @h(i32 %x) 84*9880d681SAndroid Build Coastguard Worker unreachable 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; CHECK: %x1 = phi i32 [ %x.for.left, %shared.for.left ], [ %x, %shared ] 87*9880d681SAndroid Build Coastguard Worker; CHECK: %i = cleanuppad within none [] 88*9880d681SAndroid Build Coastguard Worker; CHECK: call void @h(i32 %x1) 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerexit: 91*9880d681SAndroid Build Coastguard Worker unreachable 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 95*9880d681SAndroid Build Coastguard Workerdefine void @test4(i1 %x) personality i32 (...)* @__CxxFrameHandler3 { 96*9880d681SAndroid Build Coastguard Workerentry: 97*9880d681SAndroid Build Coastguard Worker invoke void @f() 98*9880d681SAndroid Build Coastguard Worker to label %invoke.cont1 unwind label %left 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerinvoke.cont1: 101*9880d681SAndroid Build Coastguard Worker invoke void @f() 102*9880d681SAndroid Build Coastguard Worker to label %exit unwind label %right 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerleft: 105*9880d681SAndroid Build Coastguard Worker %0 = cleanuppad within none [] 106*9880d681SAndroid Build Coastguard Worker br label %shared 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerright: 109*9880d681SAndroid Build Coastguard Worker %1 = cleanuppad within none [] 110*9880d681SAndroid Build Coastguard Worker br i1 %x, label %shared, label %right.other 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerright.other: 113*9880d681SAndroid Build Coastguard Worker br label %shared 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workershared: 116*9880d681SAndroid Build Coastguard Worker %phi = phi i32 [ 1, %left ], [ 0, %right ], [ -1, %right.other ] 117*9880d681SAndroid Build Coastguard Worker call void @h(i32 %phi) 118*9880d681SAndroid Build Coastguard Worker unreachable 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ] 121*9880d681SAndroid Build Coastguard Worker; CHECK: call void @h(i32 %phi) 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.for.left = phi i32 [ 1, %left ] 124*9880d681SAndroid Build Coastguard Worker; CHECK: call void @h(i32 %phi.for.left) 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerexit: 127*9880d681SAndroid Build Coastguard Worker unreachable 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdeclare void @__std_terminate() 131