xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/LandingPadClauses.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker@T1 = external constant i32
4*9880d681SAndroid Build Coastguard Worker@T2 = external constant i32
5*9880d681SAndroid Build Coastguard Worker@T3 = external constant i32
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare i32 @generic_personality(i32, i64, i8*, i8*)
8*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
9*9880d681SAndroid Build Coastguard Workerdeclare i32 @__objc_personality_v0(i32, i64, i8*, i8*)
10*9880d681SAndroid Build Coastguard Workerdeclare i32 @__C_specific_handler(...)
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdeclare void @bar()
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine void @foo_generic() personality i32 (i32, i64, i8*, i8*)* @generic_personality {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo_generic(
16*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
17*9880d681SAndroid Build Coastguard Worker    to label %cont.a unwind label %lpad.a
18*9880d681SAndroid Build Coastguard Workercont.a:
19*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
20*9880d681SAndroid Build Coastguard Worker    to label %cont.b unwind label %lpad.b
21*9880d681SAndroid Build Coastguard Workercont.b:
22*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
23*9880d681SAndroid Build Coastguard Worker    to label %cont.c unwind label %lpad.c
24*9880d681SAndroid Build Coastguard Workercont.c:
25*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
26*9880d681SAndroid Build Coastguard Worker    to label %cont.d unwind label %lpad.d
27*9880d681SAndroid Build Coastguard Workercont.d:
28*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
29*9880d681SAndroid Build Coastguard Worker    to label %cont.e unwind label %lpad.e
30*9880d681SAndroid Build Coastguard Workercont.e:
31*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
32*9880d681SAndroid Build Coastguard Worker    to label %cont.f unwind label %lpad.f
33*9880d681SAndroid Build Coastguard Workercont.f:
34*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
35*9880d681SAndroid Build Coastguard Worker    to label %cont.g unwind label %lpad.g
36*9880d681SAndroid Build Coastguard Workercont.g:
37*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
38*9880d681SAndroid Build Coastguard Worker    to label %cont.h unwind label %lpad.h
39*9880d681SAndroid Build Coastguard Workercont.h:
40*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
41*9880d681SAndroid Build Coastguard Worker    to label %cont.i unwind label %lpad.i
42*9880d681SAndroid Build Coastguard Workercont.i:
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerlpad.a:
46*9880d681SAndroid Build Coastguard Worker  %a = landingpad { i8*, i32 }
47*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
48*9880d681SAndroid Build Coastguard Worker          catch i32* @T2
49*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
50*9880d681SAndroid Build Coastguard Worker          catch i32* @T2
51*9880d681SAndroid Build Coastguard Worker  unreachable
52*9880d681SAndroid Build Coastguard Worker; CHECK: %a = landingpad
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: @T1
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: @T2
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerlpad.b:
58*9880d681SAndroid Build Coastguard Worker  %b = landingpad { i8*, i32 }
59*9880d681SAndroid Build Coastguard Worker          filter [0 x i32*] zeroinitializer
60*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
61*9880d681SAndroid Build Coastguard Worker  unreachable
62*9880d681SAndroid Build Coastguard Worker; CHECK: %b = landingpad
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerlpad.c:
67*9880d681SAndroid Build Coastguard Worker  %c = landingpad { i8*, i32 }
68*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
69*9880d681SAndroid Build Coastguard Worker          filter [1 x i32*] [i32* @T1]
70*9880d681SAndroid Build Coastguard Worker          catch i32* @T2
71*9880d681SAndroid Build Coastguard Worker  unreachable
72*9880d681SAndroid Build Coastguard Worker; Caught types should not be removed from filters
73*9880d681SAndroid Build Coastguard Worker; CHECK: %c = landingpad
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catch i32* @T1
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catch i32* @T2
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerlpad.d:
80*9880d681SAndroid Build Coastguard Worker  %d = landingpad { i8*, i32 }
81*9880d681SAndroid Build Coastguard Worker          filter [3 x i32*] zeroinitializer
82*9880d681SAndroid Build Coastguard Worker  unreachable
83*9880d681SAndroid Build Coastguard Worker; CHECK: %d = landingpad
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter [1 x i32*] zeroinitializer
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerlpad.e:
88*9880d681SAndroid Build Coastguard Worker  %e = landingpad { i8*, i32 }
89*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
90*9880d681SAndroid Build Coastguard Worker          filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
91*9880d681SAndroid Build Coastguard Worker  unreachable
92*9880d681SAndroid Build Coastguard Worker; Caught types should not be removed from filters
93*9880d681SAndroid Build Coastguard Worker; CHECK: %e = landingpad
94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catch i32* @T1
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter [2 x i32*] [i32* @T1, i32* @T2]
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerlpad.f:
99*9880d681SAndroid Build Coastguard Worker  %f = landingpad { i8*, i32 }
100*9880d681SAndroid Build Coastguard Worker          filter [2 x i32*] [i32* @T2, i32* @T1]
101*9880d681SAndroid Build Coastguard Worker          filter [1 x i32*] [i32* @T1]
102*9880d681SAndroid Build Coastguard Worker  unreachable
103*9880d681SAndroid Build Coastguard Worker; CHECK: %f = landingpad
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerlpad.g:
108*9880d681SAndroid Build Coastguard Worker  %g = landingpad { i8*, i32 }
109*9880d681SAndroid Build Coastguard Worker          filter [1 x i32*] [i32* @T1]
110*9880d681SAndroid Build Coastguard Worker          catch i32* @T3
111*9880d681SAndroid Build Coastguard Worker          filter [2 x i32*] [i32* @T2, i32* @T1]
112*9880d681SAndroid Build Coastguard Worker  unreachable
113*9880d681SAndroid Build Coastguard Worker; CHECK: %g = landingpad
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catch i32* @T3
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerlpad.h:
119*9880d681SAndroid Build Coastguard Worker  %h = landingpad { i8*, i32 }
120*9880d681SAndroid Build Coastguard Worker          filter [2 x i32*] [i32* @T1, i32* null]
121*9880d681SAndroid Build Coastguard Worker          filter [1 x i32*] zeroinitializer
122*9880d681SAndroid Build Coastguard Worker  unreachable
123*9880d681SAndroid Build Coastguard Worker; CHECK: %h = landingpad
124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter [1 x i32*] zeroinitializer
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerlpad.i:
128*9880d681SAndroid Build Coastguard Worker  %i = landingpad { i8*, i32 }
129*9880d681SAndroid Build Coastguard Worker          cleanup
130*9880d681SAndroid Build Coastguard Worker          filter [0 x i32*] zeroinitializer
131*9880d681SAndroid Build Coastguard Worker  unreachable
132*9880d681SAndroid Build Coastguard Worker; CHECK: %i = landingpad
133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: filter
134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerdefine void @foo_cxx() personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 {
138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo_cxx(
139*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
140*9880d681SAndroid Build Coastguard Worker    to label %cont.a unwind label %lpad.a
141*9880d681SAndroid Build Coastguard Workercont.a:
142*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
143*9880d681SAndroid Build Coastguard Worker    to label %cont.b unwind label %lpad.b
144*9880d681SAndroid Build Coastguard Workercont.b:
145*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
146*9880d681SAndroid Build Coastguard Worker    to label %cont.c unwind label %lpad.c
147*9880d681SAndroid Build Coastguard Workercont.c:
148*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
149*9880d681SAndroid Build Coastguard Worker    to label %cont.d unwind label %lpad.d
150*9880d681SAndroid Build Coastguard Workercont.d:
151*9880d681SAndroid Build Coastguard Worker  ret void
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerlpad.a:
154*9880d681SAndroid Build Coastguard Worker  %a = landingpad { i8*, i32 }
155*9880d681SAndroid Build Coastguard Worker          catch i32* null
156*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
157*9880d681SAndroid Build Coastguard Worker  unreachable
158*9880d681SAndroid Build Coastguard Worker; CHECK: %a = landingpad
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: null
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerlpad.b:
163*9880d681SAndroid Build Coastguard Worker  %b = landingpad { i8*, i32 }
164*9880d681SAndroid Build Coastguard Worker          filter [1 x i32*] zeroinitializer
165*9880d681SAndroid Build Coastguard Worker  unreachable
166*9880d681SAndroid Build Coastguard Worker; CHECK: %b = landingpad
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cleanup
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerlpad.c:
171*9880d681SAndroid Build Coastguard Worker  %c = landingpad { i8*, i32 }
172*9880d681SAndroid Build Coastguard Worker          filter [2 x i32*] [i32* @T1, i32* null]
173*9880d681SAndroid Build Coastguard Worker  unreachable
174*9880d681SAndroid Build Coastguard Worker; CHECK: %c = landingpad
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cleanup
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerlpad.d:
179*9880d681SAndroid Build Coastguard Worker  %d = landingpad { i8*, i32 }
180*9880d681SAndroid Build Coastguard Worker          cleanup
181*9880d681SAndroid Build Coastguard Worker          catch i32* null
182*9880d681SAndroid Build Coastguard Worker  unreachable
183*9880d681SAndroid Build Coastguard Worker; CHECK: %d = landingpad
184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: null
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine void @foo_objc() personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 {
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo_objc(
190*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
191*9880d681SAndroid Build Coastguard Worker    to label %cont.a unwind label %lpad.a
192*9880d681SAndroid Build Coastguard Workercont.a:
193*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
194*9880d681SAndroid Build Coastguard Worker    to label %cont.b unwind label %lpad.b
195*9880d681SAndroid Build Coastguard Workercont.b:
196*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
197*9880d681SAndroid Build Coastguard Worker    to label %cont.c unwind label %lpad.c
198*9880d681SAndroid Build Coastguard Workercont.c:
199*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
200*9880d681SAndroid Build Coastguard Worker    to label %cont.d unwind label %lpad.d
201*9880d681SAndroid Build Coastguard Workercont.d:
202*9880d681SAndroid Build Coastguard Worker  ret void
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerlpad.a:
205*9880d681SAndroid Build Coastguard Worker  %a = landingpad { i8*, i32 }
206*9880d681SAndroid Build Coastguard Worker          catch i32* null
207*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
208*9880d681SAndroid Build Coastguard Worker  unreachable
209*9880d681SAndroid Build Coastguard Worker; CHECK: %a = landingpad
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: null
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerlpad.b:
214*9880d681SAndroid Build Coastguard Worker  %b = landingpad { i8*, i32 }
215*9880d681SAndroid Build Coastguard Worker          filter [1 x i32*] zeroinitializer
216*9880d681SAndroid Build Coastguard Worker  unreachable
217*9880d681SAndroid Build Coastguard Worker; CHECK: %b = landingpad
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cleanup
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerlpad.c:
222*9880d681SAndroid Build Coastguard Worker  %c = landingpad { i8*, i32 }
223*9880d681SAndroid Build Coastguard Worker          filter [2 x i32*] [i32* @T1, i32* null]
224*9880d681SAndroid Build Coastguard Worker  unreachable
225*9880d681SAndroid Build Coastguard Worker; CHECK: %c = landingpad
226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cleanup
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerlpad.d:
230*9880d681SAndroid Build Coastguard Worker  %d = landingpad { i8*, i32 }
231*9880d681SAndroid Build Coastguard Worker          cleanup
232*9880d681SAndroid Build Coastguard Worker          catch i32* null
233*9880d681SAndroid Build Coastguard Worker  unreachable
234*9880d681SAndroid Build Coastguard Worker; CHECK: %d = landingpad
235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: null
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine void @foo_seh() personality i32 (...)* @__C_specific_handler {
240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo_seh(
241*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
242*9880d681SAndroid Build Coastguard Worker    to label %cont.a unwind label %lpad.a
243*9880d681SAndroid Build Coastguard Workercont.a:
244*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
245*9880d681SAndroid Build Coastguard Worker    to label %cont.b unwind label %lpad.b
246*9880d681SAndroid Build Coastguard Workercont.b:
247*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
248*9880d681SAndroid Build Coastguard Worker    to label %cont.c unwind label %lpad.c
249*9880d681SAndroid Build Coastguard Workercont.c:
250*9880d681SAndroid Build Coastguard Worker  invoke void @bar()
251*9880d681SAndroid Build Coastguard Worker    to label %cont.d unwind label %lpad.d
252*9880d681SAndroid Build Coastguard Workercont.d:
253*9880d681SAndroid Build Coastguard Worker  ret void
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Workerlpad.a:
256*9880d681SAndroid Build Coastguard Worker  %a = landingpad { i8*, i32 }
257*9880d681SAndroid Build Coastguard Worker          catch i32* null
258*9880d681SAndroid Build Coastguard Worker          catch i32* @T1
259*9880d681SAndroid Build Coastguard Worker  unreachable
260*9880d681SAndroid Build Coastguard Worker; CHECK: %a = landingpad
261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: null
262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Workerlpad.b:
265*9880d681SAndroid Build Coastguard Worker  %b = landingpad { i8*, i32 }
266*9880d681SAndroid Build Coastguard Worker          filter [1 x i32*] zeroinitializer
267*9880d681SAndroid Build Coastguard Worker  unreachable
268*9880d681SAndroid Build Coastguard Worker; CHECK: %b = landingpad
269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cleanup
270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Workerlpad.c:
273*9880d681SAndroid Build Coastguard Worker  %c = landingpad { i8*, i32 }
274*9880d681SAndroid Build Coastguard Worker          filter [2 x i32*] [i32* @T1, i32* null]
275*9880d681SAndroid Build Coastguard Worker  unreachable
276*9880d681SAndroid Build Coastguard Worker; CHECK: %c = landingpad
277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cleanup
278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Workerlpad.d:
281*9880d681SAndroid Build Coastguard Worker  %d = landingpad { i8*, i32 }
282*9880d681SAndroid Build Coastguard Worker          cleanup
283*9880d681SAndroid Build Coastguard Worker          catch i32* null
284*9880d681SAndroid Build Coastguard Worker  unreachable
285*9880d681SAndroid Build Coastguard Worker; CHECK: %d = landingpad
286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: null
287*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unreachable
288*9880d681SAndroid Build Coastguard Worker}
289