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