blob: ab094aeebf520751fbf8ffc470463e606e3cb2c5 [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
David Majnemer8a1c45d2015-12-12 05:38:55 +00005declare i32 @__C_specific_handler(...)
6
David Majnemer459a64a2015-09-16 18:40:37 +00007declare void @f()
8
9declare i32 @g()
10
11declare void @h(i32)
12
13; CHECK-LABEL: @test1(
David Majnemer8a1c45d2015-12-12 05:38:55 +000014define void @test1() personality i32 (...)* @__C_specific_handler {
David Majnemer459a64a2015-09-16 18:40:37 +000015entry:
16 invoke void @f()
17 to label %invoke.cont1 unwind label %left
18
19invoke.cont1:
20 invoke void @f()
21 to label %invoke.cont2 unwind label %right
22
23invoke.cont2:
24 invoke void @f()
25 to label %exit unwind label %inner
26
27left:
David Majnemer8a1c45d2015-12-12 05:38:55 +000028 %0 = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000029 br label %shared
30
31right:
David Majnemer8a1c45d2015-12-12 05:38:55 +000032 %1 = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000033 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:
David Majnemer459a64a2015-09-16 18:40:37 +000044 %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont2 ]
David Majnemer8a1c45d2015-12-12 05:38:55 +000045 %i = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000046 call void @h(i32 %phi)
47 unreachable
48
David Majnemer8a1c45d2015-12-12 05:38:55 +000049; 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)
Andrew Kaylorfdd48fa2015-11-09 19:59:02 +000052
David Majnemer459a64a2015-09-16 18:40:37 +000053exit:
54 unreachable
55}
56
57; CHECK-LABEL: @test2(
David Majnemer8a1c45d2015-12-12 05:38:55 +000058define void @test2() personality i32 (...)* @__C_specific_handler {
David Majnemer459a64a2015-09-16 18:40:37 +000059entry:
60 invoke void @f()
61 to label %invoke.cont unwind label %left
62
63invoke.cont:
64 invoke void @f()
65 to label %exit unwind label %right
66
67left:
David Majnemer8a1c45d2015-12-12 05:38:55 +000068 cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000069 br label %shared
70
71right:
David Majnemer8a1c45d2015-12-12 05:38:55 +000072 cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000073 br label %shared
74
75shared:
76 %x = call i32 @g()
77 invoke void @f()
78 to label %shared.cont unwind label %inner
79
80shared.cont:
81 unreachable
82
83inner:
David Majnemer8a1c45d2015-12-12 05:38:55 +000084 %i = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000085 call void @h(i32 %x)
86 unreachable
87
David Majnemer8a1c45d2015-12-12 05:38:55 +000088; CHECK: %x1 = phi i32 [ %x.for.left, %left ], [ %x, %right ]
89; CHECK: %i = cleanuppad within none []
90; CHECK: call void @h(i32 %x1)
Andrew Kaylorfdd48fa2015-11-09 19:59:02 +000091
David Majnemer459a64a2015-09-16 18:40:37 +000092exit:
93 unreachable
94}
David Majnemer67bff0d2015-09-16 20:42:16 +000095
David Majnemer8a1c45d2015-12-12 05:38:55 +000096; CHECK-LABEL: @test4(
97define void @test4(i1 %x) personality i32 (...)* @__CxxFrameHandler3 {
98entry:
99 invoke void @f()
100 to label %invoke.cont1 unwind label %left
101
102invoke.cont1:
103 invoke void @f()
104 to label %exit unwind label %right
105
106left:
107 %0 = cleanuppad within none []
108 br label %shared
109
110right:
111 %1 = cleanuppad within none []
112 br i1 %x, label %shared, label %right.other
113
114right.other:
115 br label %shared
116
117shared:
118 %phi = phi i32 [ 1, %left ], [ 0, %right ], [ -1, %right.other ]
119 call void @h(i32 %phi)
120 unreachable
121
122; CHECK: %0 = cleanuppad within none []
123; CHECK: call void @h(i32 1)
124
125; CHECK: %1 = cleanuppad within none []
126; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ]
127; CHECK: call void @h(i32 %phi)
128
129exit:
130 unreachable
David Majnemer67bff0d2015-09-16 20:42:16 +0000131}
132
133declare void @__std_terminate()