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