xref: /llvm-project/llvm/test/CodeGen/WinEH/wineh-no-demotion.ll (revision d1a83ff3e0274f26746e874d480c866bec3818d6)
1; RUN: opt -mtriple=x86_64-pc-windows-msvc -S -win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s
2; RUN: opt -mtriple=x86_64-pc-windows-msvc -S -passes=win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s
3
4declare i32 @__CxxFrameHandler3(...)
5
6declare i32 @__C_specific_handler(...)
7
8declare void @f()
9
10declare i32 @g()
11
12declare void @h(i32)
13
14; CHECK-LABEL: @test1(
15define void @test1(i1 %bool) personality ptr @__C_specific_handler {
16entry:
17  invoke void @f()
18          to label %invoke.cont unwind label %left
19
20invoke.cont:
21  invoke void @f()
22          to label %exit unwind label %inner
23
24left:
25  %0 = cleanuppad within none []
26  br i1 %bool, label %shared, label %cleanupret
27
28cleanupret:
29  cleanupret from %0 unwind label %right
30
31right:
32  %1 = cleanuppad within none []
33  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:
44  %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ]
45  %i = cleanuppad within none []
46  call void @h(i32 %phi)
47  unreachable
48
49; CHECK: %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ], [ %x.for.left, %shared.for.left ]
50; CHECK: %i = cleanuppad within none []
51; CHECK: call void @h(i32 %phi)
52
53exit:
54  unreachable
55}
56
57; CHECK-LABEL: @test2(
58define void @test2(i1 %bool) personality ptr @__C_specific_handler {
59entry:
60  invoke void @f()
61          to label %shared.cont unwind label %left
62
63left:
64  %0 = cleanuppad within none []
65  br i1 %bool, label %shared, label %cleanupret
66
67cleanupret:
68  cleanupret from %0 unwind label %right
69
70right:
71  %1 = cleanuppad within none []
72  br label %shared
73
74shared:
75  %x = call i32 @g()
76  invoke void @f()
77          to label %shared.cont unwind label %inner
78
79shared.cont:
80  unreachable
81
82inner:
83  %i = cleanuppad within none []
84  call void @h(i32 %x)
85  unreachable
86
87; CHECK: %x1 = phi i32 [ %x.for.left, %shared.for.left ], [ %x, %shared ]
88; CHECK: %i = cleanuppad within none []
89; CHECK: call void @h(i32 %x1)
90
91exit:
92  unreachable
93}
94
95; CHECK-LABEL: @test4(
96define void @test4(i1 %x) personality ptr @__CxxFrameHandler3 {
97entry:
98  invoke void @f()
99          to label %invoke.cont1 unwind label %left
100
101invoke.cont1:
102  invoke void @f()
103          to label %exit unwind label %right
104
105left:
106  %0 = cleanuppad within none []
107  br label %shared
108
109right:
110  %1 = cleanuppad within none []
111  br i1 %x, label %shared, label %right.other
112
113right.other:
114  br label %shared
115
116shared:
117  %phi = phi i32 [ 1, %left ], [ 0, %right ], [ -1, %right.other ]
118  call void @h(i32 %phi)
119  unreachable
120
121; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ]
122; CHECK: call void @h(i32 %phi)
123
124; CHECK: %phi.for.left = phi i32 [ 1, %left ]
125; CHECK: call void @h(i32 %phi.for.left)
126
127exit:
128  unreachable
129}
130
131declare void @__std_terminate()
132