1 ; RUN: opt < %s -instcombine -S | FileCheck %s
3 @T1 = external constant i32
4 @T2 = external constant i32
5 @T3 = external constant i32
7 declare i32 @generic_personality(i32, i64, i8*, i8*)
8 declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
9 declare i32 @__objc_personality_v0(i32, i64, i8*, i8*)
10 declare i32 @__C_specific_handler(...)
14 define void @foo_generic() personality i32 (i32, i64, i8*, i8*)* @generic_personality {
15 ; CHECK-LABEL: @foo_generic(
17 to label %cont.a unwind label %lpad.a
20 to label %cont.b unwind label %lpad.b
23 to label %cont.c unwind label %lpad.c
26 to label %cont.d unwind label %lpad.d
29 to label %cont.e unwind label %lpad.e
32 to label %cont.f unwind label %lpad.f
35 to label %cont.g unwind label %lpad.g
38 to label %cont.h unwind label %lpad.h
41 to label %cont.i unwind label %lpad.i
46 %a = landingpad { i8*, i32 }
52 ; CHECK: %a = landingpad
55 ; CHECK-NEXT: unreachable
58 %b = landingpad { i8*, i32 }
59 filter [0 x i32*] zeroinitializer
62 ; CHECK: %b = landingpad
64 ; CHECK-NEXT: unreachable
67 %c = landingpad { i8*, i32 }
69 filter [1 x i32*] [i32* @T1]
72 ; CHECK: %c = landingpad
74 ; CHECK-NEXT: filter [0 x i32*]
75 ; CHECK-NEXT: unreachable
78 %d = landingpad { i8*, i32 }
79 filter [3 x i32*] zeroinitializer
81 ; CHECK: %d = landingpad
82 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
83 ; CHECK-NEXT: unreachable
86 %e = landingpad { i8*, i32 }
88 filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
90 ; CHECK: %e = landingpad
92 ; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
93 ; CHECK-NEXT: unreachable
96 %f = landingpad { i8*, i32 }
97 filter [2 x i32*] [i32* @T2, i32* @T1]
98 filter [1 x i32*] [i32* @T1]
100 ; CHECK: %f = landingpad
101 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
102 ; CHECK-NEXT: unreachable
105 %g = landingpad { i8*, i32 }
106 filter [1 x i32*] [i32* @T1]
108 filter [2 x i32*] [i32* @T2, i32* @T1]
110 ; CHECK: %g = landingpad
111 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
112 ; CHECK-NEXT: catch i32* @T3
113 ; CHECK-NEXT: unreachable
116 %h = landingpad { i8*, i32 }
117 filter [2 x i32*] [i32* @T1, i32* null]
118 filter [1 x i32*] zeroinitializer
120 ; CHECK: %h = landingpad
121 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
122 ; CHECK-NEXT: unreachable
125 %i = landingpad { i8*, i32 }
127 filter [0 x i32*] zeroinitializer
129 ; CHECK: %i = landingpad
131 ; CHECK-NEXT: unreachable
134 define void @foo_cxx() personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 {
135 ; CHECK-LABEL: @foo_cxx(
137 to label %cont.a unwind label %lpad.a
140 to label %cont.b unwind label %lpad.b
143 to label %cont.c unwind label %lpad.c
146 to label %cont.d unwind label %lpad.d
151 %a = landingpad { i8*, i32 }
155 ; CHECK: %a = landingpad
157 ; CHECK-NEXT: unreachable
160 %b = landingpad { i8*, i32 }
161 filter [1 x i32*] zeroinitializer
163 ; CHECK: %b = landingpad
164 ; CHECK-NEXT: cleanup
165 ; CHECK-NEXT: unreachable
168 %c = landingpad { i8*, i32 }
169 filter [2 x i32*] [i32* @T1, i32* null]
171 ; CHECK: %c = landingpad
172 ; CHECK-NEXT: cleanup
173 ; CHECK-NEXT: unreachable
176 %d = landingpad { i8*, i32 }
180 ; CHECK: %d = landingpad
182 ; CHECK-NEXT: unreachable
185 define void @foo_objc() personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 {
186 ; CHECK-LABEL: @foo_objc(
188 to label %cont.a unwind label %lpad.a
191 to label %cont.b unwind label %lpad.b
194 to label %cont.c unwind label %lpad.c
197 to label %cont.d unwind label %lpad.d
202 %a = landingpad { i8*, i32 }
206 ; CHECK: %a = landingpad
208 ; CHECK-NEXT: unreachable
211 %b = landingpad { i8*, i32 }
212 filter [1 x i32*] zeroinitializer
214 ; CHECK: %b = landingpad
215 ; CHECK-NEXT: cleanup
216 ; CHECK-NEXT: unreachable
219 %c = landingpad { i8*, i32 }
220 filter [2 x i32*] [i32* @T1, i32* null]
222 ; CHECK: %c = landingpad
223 ; CHECK-NEXT: cleanup
224 ; CHECK-NEXT: unreachable
227 %d = landingpad { i8*, i32 }
231 ; CHECK: %d = landingpad
233 ; CHECK-NEXT: unreachable
236 define void @foo_seh() personality i32 (...)* @__C_specific_handler {
237 ; CHECK-LABEL: @foo_seh(
239 to label %cont.a unwind label %lpad.a
242 to label %cont.b unwind label %lpad.b
245 to label %cont.c unwind label %lpad.c
248 to label %cont.d unwind label %lpad.d
253 %a = landingpad { i8*, i32 }
257 ; CHECK: %a = landingpad
259 ; CHECK-NEXT: unreachable
262 %b = landingpad { i8*, i32 }
263 filter [1 x i32*] zeroinitializer
265 ; CHECK: %b = landingpad
266 ; CHECK-NEXT: cleanup
267 ; CHECK-NEXT: unreachable
270 %c = landingpad { i8*, i32 }
271 filter [2 x i32*] [i32* @T1, i32* null]
273 ; CHECK: %c = landingpad
274 ; CHECK-NEXT: cleanup
275 ; CHECK-NEXT: unreachable
278 %d = landingpad { i8*, i32 }
282 ; CHECK: %d = landingpad
284 ; CHECK-NEXT: unreachable