134 lines · plain
1; RUN: opt -mtriple=x86_64-pc-windows-msvc -S -win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s2; RUN: opt -mtriple=x86_64-pc-windows-msvc -S -passes=win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s3; RUN: %if aarch64-registered-target %{ opt -mtriple=aarch64-pc-windows-msvc -S -win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s %}4; RUN: %if aarch64-registered-target %{ opt -mtriple=aarch64-pc-windows-msvc -S -passes=win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s %}5 6declare i32 @__CxxFrameHandler3(...)7 8declare i32 @__C_specific_handler(...)9 10declare void @f()11 12declare i32 @g()13 14declare void @h(i32)15 16; CHECK-LABEL: @test1(17define void @test1(i1 %bool) personality ptr @__C_specific_handler {18entry:19 invoke void @f()20 to label %invoke.cont unwind label %left21 22invoke.cont:23 invoke void @f()24 to label %exit unwind label %inner25 26left:27 %0 = cleanuppad within none []28 br i1 %bool, label %shared, label %cleanupret29 30cleanupret:31 cleanupret from %0 unwind label %right32 33right:34 %1 = cleanuppad within none []35 br label %shared36 37shared:38 %x = call i32 @g()39 invoke void @f()40 to label %shared.cont unwind label %inner41 42shared.cont:43 unreachable44 45inner:46 %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ]47 %i = cleanuppad within none []48 call void @h(i32 %phi)49 unreachable50 51; CHECK: %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ], [ %x.for.left, %shared.for.left ]52; CHECK: %i = cleanuppad within none []53; CHECK: call void @h(i32 %phi)54 55exit:56 unreachable57}58 59; CHECK-LABEL: @test2(60define void @test2(i1 %bool) personality ptr @__C_specific_handler {61entry:62 invoke void @f()63 to label %shared.cont unwind label %left64 65left:66 %0 = cleanuppad within none []67 br i1 %bool, label %shared, label %cleanupret68 69cleanupret:70 cleanupret from %0 unwind label %right71 72right:73 %1 = cleanuppad within none []74 br label %shared75 76shared:77 %x = call i32 @g()78 invoke void @f()79 to label %shared.cont unwind label %inner80 81shared.cont:82 unreachable83 84inner:85 %i = cleanuppad within none []86 call void @h(i32 %x)87 unreachable88 89; CHECK: %x1 = phi i32 [ %x.for.left, %shared.for.left ], [ %x, %shared ]90; CHECK: %i = cleanuppad within none []91; CHECK: call void @h(i32 %x1)92 93exit:94 unreachable95}96 97; CHECK-LABEL: @test4(98define void @test4(i1 %x) personality ptr @__CxxFrameHandler3 {99entry:100 invoke void @f()101 to label %invoke.cont1 unwind label %left102 103invoke.cont1:104 invoke void @f()105 to label %exit unwind label %right106 107left:108 %0 = cleanuppad within none []109 br label %shared110 111right:112 %1 = cleanuppad within none []113 br i1 %x, label %shared, label %right.other114 115right.other:116 br label %shared117 118shared:119 %phi = phi i32 [ 1, %left ], [ 0, %right ], [ -1, %right.other ]120 call void @h(i32 %phi)121 unreachable122 123; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ]124; CHECK: call void @h(i32 %phi)125 126; CHECK: %phi.for.left = phi i32 [ 1, %left ]127; CHECK: call void @h(i32 %phi.for.left)128 129exit:130 unreachable131}132 133declare void @__std_terminate()134