1 ; RUN: opt -mtriple=x86_x64-pc-windows-msvc -S -winehprepare -disable-demotion < %s | FileCheck %s
3 declare i32 @__CxxFrameHandler3(...)
5 declare i32 @__C_specific_handler(...)
13 ; CHECK-LABEL: @test1(
14 define void @test1() personality i32 (...)* @__C_specific_handler {
17 to label %invoke.cont1 unwind label %left
21 to label %invoke.cont2 unwind label %right
25 to label %exit unwind label %inner
28 %0 = cleanuppad within none []
32 %1 = cleanuppad within none []
38 to label %shared.cont unwind label %inner
44 %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont2 ]
45 %i = cleanuppad within none []
46 call void @h(i32 %phi)
49 ; CHECK: %phi = phi i32 [ %x, %right ], [ 0, %invoke.cont2 ], [ %x.for.left, %left ]
50 ; CHECK: %i = cleanuppad within none []
51 ; CHECK: call void @h(i32 %phi)
57 ; CHECK-LABEL: @test2(
58 define void @test2() personality i32 (...)* @__C_specific_handler {
61 to label %invoke.cont unwind label %left
65 to label %exit unwind label %right
68 cleanuppad within none []
72 cleanuppad within none []
78 to label %shared.cont unwind label %inner
84 %i = cleanuppad within none []
88 ; CHECK: %x1 = phi i32 [ %x.for.left, %left ], [ %x, %right ]
89 ; CHECK: %i = cleanuppad within none []
90 ; CHECK: call void @h(i32 %x1)
96 ; CHECK-LABEL: @test3(
97 define void @test3() personality i32 (...)* @__CxxFrameHandler3 {
100 to label %invoke.cont unwind label %terminate
106 ; CHECK: cleanuppad within none []
107 ; CHECK: call void @__std_terminate()
109 terminatepad within none [void ()* @__std_terminate] unwind to caller
112 ; CHECK-LABEL: @test4(
113 define void @test4(i1 %x) personality i32 (...)* @__CxxFrameHandler3 {
116 to label %invoke.cont1 unwind label %left
120 to label %exit unwind label %right
123 %0 = cleanuppad within none []
127 %1 = cleanuppad within none []
128 br i1 %x, label %shared, label %right.other
134 %phi = phi i32 [ 1, %left ], [ 0, %right ], [ -1, %right.other ]
135 call void @h(i32 %phi)
138 ; CHECK: %0 = cleanuppad within none []
139 ; CHECK: call void @h(i32 1)
141 ; CHECK: %1 = cleanuppad within none []
142 ; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ]
143 ; CHECK: call void @h(i32 %phi)
149 declare void @__std_terminate()