blob: 4fb84db890930e6a35f159ae7017165f0c3eebbc [file] [log] [blame]
David Majnemer3bb88c02015-12-15 21:27:27 +00001; RUN: opt -mtriple=x86_x64-pc-windows-msvc -S -winehprepare -disable-demotion -disable-cleanups < %s | FileCheck %s
David Majnemer459a64a2015-09-16 18:40:37 +00002
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 Majnemer3bb88c02015-12-15 21:27:27 +000014define void @test1(i1 %bool) personality i32 (...)* @__C_specific_handler {
David Majnemer459a64a2015-09-16 18:40:37 +000015entry:
16 invoke void @f()
David Majnemer3bb88c02015-12-15 21:27:27 +000017 to label %invoke.cont unwind label %left
David Majnemer459a64a2015-09-16 18:40:37 +000018
David Majnemer3bb88c02015-12-15 21:27:27 +000019invoke.cont:
David Majnemer459a64a2015-09-16 18:40:37 +000020 invoke void @f()
21 to label %exit unwind label %inner
22
23left:
David Majnemer8a1c45d2015-12-12 05:38:55 +000024 %0 = cleanuppad within none []
David Majnemer3bb88c02015-12-15 21:27:27 +000025 br i1 %bool, label %shared, label %cleanupret
26
27cleanupret:
28 cleanupret from %0 unwind label %right
David Majnemer459a64a2015-09-16 18:40:37 +000029
30right:
David Majnemer8a1c45d2015-12-12 05:38:55 +000031 %1 = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000032 br label %shared
33
34shared:
35 %x = call i32 @g()
David Majnemer3bb88c02015-12-15 21:27:27 +000036 invoke void @f() [ "funclet"(token %0) ]
David Majnemer459a64a2015-09-16 18:40:37 +000037 to label %shared.cont unwind label %inner
38
39shared.cont:
40 unreachable
41
42inner:
David Majnemer3bb88c02015-12-15 21:27:27 +000043 %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ]
David Majnemer8a1c45d2015-12-12 05:38:55 +000044 %i = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000045 call void @h(i32 %phi)
46 unreachable
47
David Majnemer3bb88c02015-12-15 21:27:27 +000048; CHECK: %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ], [ %x.for.left, %shared.for.left ]
David Majnemer8a1c45d2015-12-12 05:38:55 +000049; CHECK: %i = cleanuppad within none []
50; CHECK: call void @h(i32 %phi)
Andrew Kaylorfdd48fa2015-11-09 19:59:02 +000051
David Majnemer459a64a2015-09-16 18:40:37 +000052exit:
53 unreachable
54}
55
56; CHECK-LABEL: @test2(
David Majnemer3bb88c02015-12-15 21:27:27 +000057define void @test2(i1 %bool) personality i32 (...)* @__C_specific_handler {
David Majnemer459a64a2015-09-16 18:40:37 +000058entry:
59 invoke void @f()
David Majnemer3bb88c02015-12-15 21:27:27 +000060 to label %shared.cont unwind label %left
David Majnemer459a64a2015-09-16 18:40:37 +000061
62left:
David Majnemer3bb88c02015-12-15 21:27:27 +000063 %0 = cleanuppad within none []
64 br i1 %bool, label %shared, label %cleanupret
65
66cleanupret:
67 cleanupret from %0 unwind label %right
David Majnemer459a64a2015-09-16 18:40:37 +000068
69right:
David Majnemer3bb88c02015-12-15 21:27:27 +000070 %1 = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000071 br label %shared
72
73shared:
74 %x = call i32 @g()
David Majnemer3bb88c02015-12-15 21:27:27 +000075 invoke void @f() [ "funclet"(token %0) ]
David Majnemer459a64a2015-09-16 18:40:37 +000076 to label %shared.cont unwind label %inner
77
78shared.cont:
79 unreachable
80
81inner:
David Majnemer8a1c45d2015-12-12 05:38:55 +000082 %i = cleanuppad within none []
David Majnemer459a64a2015-09-16 18:40:37 +000083 call void @h(i32 %x)
84 unreachable
85
David Majnemer3bb88c02015-12-15 21:27:27 +000086; CHECK: %x1 = phi i32 [ %x.for.left, %shared.for.left ], [ %x, %shared ]
87; CHECK: %i = cleanuppad within none []
88; CHECK: call void @h(i32 %x1)
Andrew Kaylorfdd48fa2015-11-09 19:59:02 +000089
David Majnemer459a64a2015-09-16 18:40:37 +000090exit:
91 unreachable
92}
David Majnemer67bff0d2015-09-16 20:42:16 +000093
David Majnemer8a1c45d2015-12-12 05:38:55 +000094; CHECK-LABEL: @test4(
95define void @test4(i1 %x) personality i32 (...)* @__CxxFrameHandler3 {
96entry:
97 invoke void @f()
98 to label %invoke.cont1 unwind label %left
99
100invoke.cont1:
101 invoke void @f()
102 to label %exit unwind label %right
103
104left:
105 %0 = cleanuppad within none []
106 br label %shared
107
108right:
109 %1 = cleanuppad within none []
110 br i1 %x, label %shared, label %right.other
111
112right.other:
113 br label %shared
114
115shared:
116 %phi = phi i32 [ 1, %left ], [ 0, %right ], [ -1, %right.other ]
117 call void @h(i32 %phi)
118 unreachable
119
David Majnemer8a1c45d2015-12-12 05:38:55 +0000120; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ]
121; CHECK: call void @h(i32 %phi)
122
David Majnemer3bb88c02015-12-15 21:27:27 +0000123; CHECK: %phi.for.left = phi i32 [ 1, %left ]
124; CHECK: call void @h(i32 %phi.for.left)
125
David Majnemer8a1c45d2015-12-12 05:38:55 +0000126exit:
127 unreachable
David Majnemer67bff0d2015-09-16 20:42:16 +0000128}
129
130declare void @__std_terminate()