blob: 4e4206eb2be2dfe90374dee9e611a7eea31dbc38 [file] [log] [blame]
David Majnemer459a64a2015-09-16 18:40:37 +00001; RUN: opt -mtriple=x86_x64-pc-windows-msvc -S -winehprepare -disable-demotion < %s | FileCheck %s
2
3declare i32 @__CxxFrameHandler3(...)
4
5declare void @f()
6
7declare i32 @g()
8
9declare void @h(i32)
10
11; CHECK-LABEL: @test1(
12define void @test1() personality i32 (...)* @__CxxFrameHandler3 {
13entry:
14 invoke void @f()
15 to label %invoke.cont1 unwind label %left
16
17invoke.cont1:
18 invoke void @f()
19 to label %invoke.cont2 unwind label %right
20
21invoke.cont2:
22 invoke void @f()
23 to label %exit unwind label %inner
24
25left:
26 %0 = cleanuppad []
27 br label %shared
28
29right:
30 %1 = cleanuppad []
31 br label %shared
32
33shared:
34 %x = call i32 @g()
35 invoke void @f()
36 to label %shared.cont unwind label %inner
37
38shared.cont:
39 unreachable
40
41inner:
42 ; CHECK: %phi = phi i32 [ %x, %right ], [ 0, %invoke.cont2 ], [ %x.for.left, %left ]
43 %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont2 ]
44 %i = cleanuppad []
45 call void @h(i32 %phi)
46 unreachable
47
48exit:
49 unreachable
50}
51
52; CHECK-LABEL: @test2(
53define void @test2() personality i32 (...)* @__CxxFrameHandler3 {
54entry:
55 invoke void @f()
56 to label %invoke.cont unwind label %left
57
58invoke.cont:
59 invoke void @f()
60 to label %exit unwind label %right
61
62left:
63 cleanuppad []
64 br label %shared
65
66right:
67 cleanuppad []
68 br label %shared
69
70shared:
71 %x = call i32 @g()
72 invoke void @f()
73 to label %shared.cont unwind label %inner
74
75shared.cont:
76 unreachable
77
78inner:
79 ; CHECK: %x1 = phi i32 [ %x.for.left, %left ], [ %x, %right ]
80 ; CHECK: call void @h(i32 %x1)
81 %i = cleanuppad []
82 call void @h(i32 %x)
83 unreachable
84
85exit:
86 unreachable
87}
David Majnemer67bff0d2015-09-16 20:42:16 +000088
89; CHECK-LABEL: @test3(
90define void @test3() personality i32 (...)* @__CxxFrameHandler3 {
91entry:
92 invoke void @f()
93 to label %invoke.cont unwind label %terminate
94
95invoke.cont:
96 ret void
97
98terminate:
99; CHECK: cleanuppad []
100; CHECK: call void @__std_terminate()
101; CHECK: unreachable
102 terminatepad [void ()* @__std_terminate] unwind to caller
103}
104
105declare void @__std_terminate()