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