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
7declare i32 @generic_personality(i32, i64, i8*, i8*)
8declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
9declare i32 @__objc_personality_v0(i32, i64, i8*, i8*)
10
11declare void @bar()
12
13define void @foo_generic() {
14; CHECK-LABEL: @foo_generic(
15  invoke void @bar()
16    to label %cont.a unwind label %lpad.a
17cont.a:
18  invoke void @bar()
19    to label %cont.b unwind label %lpad.b
20cont.b:
21  invoke void @bar()
22    to label %cont.c unwind label %lpad.c
23cont.c:
24  invoke void @bar()
25    to label %cont.d unwind label %lpad.d
26cont.d:
27  invoke void @bar()
28    to label %cont.e unwind label %lpad.e
29cont.e:
30  invoke void @bar()
31    to label %cont.f unwind label %lpad.f
32cont.f:
33  invoke void @bar()
34    to label %cont.g unwind label %lpad.g
35cont.g:
36  invoke void @bar()
37    to label %cont.h unwind label %lpad.h
38cont.h:
39  invoke void @bar()
40    to label %cont.i unwind label %lpad.i
41cont.i:
42  ret void
43
44lpad.a:
45  %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
46          catch i32* @T1
47          catch i32* @T2
48          catch i32* @T1
49          catch i32* @T2
50  unreachable
51; CHECK: %a = landingpad
52; CHECK-NEXT: @T1
53; CHECK-NEXT: @T2
54; CHECK-NEXT: unreachable
55
56lpad.b:
57  %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
58          filter [0 x i32*] zeroinitializer
59          catch i32* @T1
60  unreachable
61; CHECK: %b = landingpad
62; CHECK-NEXT: filter
63; CHECK-NEXT: unreachable
64
65lpad.c:
66  %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
67          catch i32* @T1
68          filter [1 x i32*] [i32* @T1]
69          catch i32* @T2
70  unreachable
71; CHECK: %c = landingpad
72; CHECK-NEXT: @T1
73; CHECK-NEXT: filter [0 x i32*]
74; CHECK-NEXT: unreachable
75
76lpad.d:
77  %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
78          filter [3 x i32*] zeroinitializer
79  unreachable
80; CHECK: %d = landingpad
81; CHECK-NEXT: filter [1 x i32*] zeroinitializer
82; CHECK-NEXT: unreachable
83
84lpad.e:
85  %e = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
86          catch i32* @T1
87          filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
88  unreachable
89; CHECK: %e = landingpad
90; CHECK-NEXT: @T1
91; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
92; CHECK-NEXT: unreachable
93
94lpad.f:
95  %f = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
96          filter [2 x i32*] [i32* @T2, i32* @T1]
97          filter [1 x i32*] [i32* @T1]
98  unreachable
99; CHECK: %f = landingpad
100; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
101; CHECK-NEXT: unreachable
102
103lpad.g:
104  %g = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
105          filter [1 x i32*] [i32* @T1]
106          catch i32* @T3
107          filter [2 x i32*] [i32* @T2, i32* @T1]
108  unreachable
109; CHECK: %g = landingpad
110; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
111; CHECK-NEXT: catch i32* @T3
112; CHECK-NEXT: unreachable
113
114lpad.h:
115  %h = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
116          filter [2 x i32*] [i32* @T1, i32* null]
117          filter [1 x i32*] zeroinitializer
118  unreachable
119; CHECK: %h = landingpad
120; CHECK-NEXT: filter [1 x i32*] zeroinitializer
121; CHECK-NEXT: unreachable
122
123lpad.i:
124  %i = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
125          cleanup
126          filter [0 x i32*] zeroinitializer
127  unreachable
128; CHECK: %i = landingpad
129; CHECK-NEXT: filter
130; CHECK-NEXT: unreachable
131}
132
133define void @foo_cxx() {
134; CHECK-LABEL: @foo_cxx(
135  invoke void @bar()
136    to label %cont.a unwind label %lpad.a
137cont.a:
138  invoke void @bar()
139    to label %cont.b unwind label %lpad.b
140cont.b:
141  invoke void @bar()
142    to label %cont.c unwind label %lpad.c
143cont.c:
144  invoke void @bar()
145    to label %cont.d unwind label %lpad.d
146cont.d:
147  ret void
148
149lpad.a:
150  %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
151          catch i32* null
152          catch i32* @T1
153  unreachable
154; CHECK: %a = landingpad
155; CHECK-NEXT: null
156; CHECK-NEXT: unreachable
157
158lpad.b:
159  %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
160          filter [1 x i32*] zeroinitializer
161  unreachable
162; CHECK: %b = landingpad
163; CHECK-NEXT: cleanup
164; CHECK-NEXT: unreachable
165
166lpad.c:
167  %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
168          filter [2 x i32*] [i32* @T1, i32* null]
169  unreachable
170; CHECK: %c = landingpad
171; CHECK-NEXT: cleanup
172; CHECK-NEXT: unreachable
173
174lpad.d:
175  %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
176          cleanup
177          catch i32* null
178  unreachable
179; CHECK: %d = landingpad
180; CHECK-NEXT: null
181; CHECK-NEXT: unreachable
182}
183
184define void @foo_objc() {
185; CHECK-LABEL: @foo_objc(
186  invoke void @bar()
187    to label %cont.a unwind label %lpad.a
188cont.a:
189  invoke void @bar()
190    to label %cont.b unwind label %lpad.b
191cont.b:
192  invoke void @bar()
193    to label %cont.c unwind label %lpad.c
194cont.c:
195  invoke void @bar()
196    to label %cont.d unwind label %lpad.d
197cont.d:
198  ret void
199
200lpad.a:
201  %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
202          catch i32* null
203          catch i32* @T1
204  unreachable
205; CHECK: %a = landingpad
206; CHECK-NEXT: null
207; CHECK-NEXT: unreachable
208
209lpad.b:
210  %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
211          filter [1 x i32*] zeroinitializer
212  unreachable
213; CHECK: %b = landingpad
214; CHECK-NEXT: cleanup
215; CHECK-NEXT: unreachable
216
217lpad.c:
218  %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
219          filter [2 x i32*] [i32* @T1, i32* null]
220  unreachable
221; CHECK: %c = landingpad
222; CHECK-NEXT: cleanup
223; CHECK-NEXT: unreachable
224
225lpad.d:
226  %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
227          cleanup
228          catch i32* null
229  unreachable
230; CHECK: %d = landingpad
231; CHECK-NEXT: null
232; CHECK-NEXT: unreachable
233}
234