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*)
13 define void @foo_generic() {
14 ; CHECK-LABEL: @foo_generic(
16 to label %cont.a unwind label %lpad.a
19 to label %cont.b unwind label %lpad.b
22 to label %cont.c unwind label %lpad.c
25 to label %cont.d unwind label %lpad.d
28 to label %cont.e unwind label %lpad.e
31 to label %cont.f unwind label %lpad.f
34 to label %cont.g unwind label %lpad.g
37 to label %cont.h unwind label %lpad.h
40 to label %cont.i unwind label %lpad.i
45 %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
51 ; CHECK: %a = landingpad
54 ; CHECK-NEXT: unreachable
57 %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
58 filter [0 x i32*] zeroinitializer
61 ; CHECK: %b = landingpad
63 ; CHECK-NEXT: unreachable
66 %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
68 filter [1 x i32*] [i32* @T1]
71 ; CHECK: %c = landingpad
73 ; CHECK-NEXT: filter [0 x i32*]
74 ; CHECK-NEXT: unreachable
77 %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
78 filter [3 x i32*] zeroinitializer
80 ; CHECK: %d = landingpad
81 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
82 ; CHECK-NEXT: unreachable
85 %e = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
87 filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
89 ; CHECK: %e = landingpad
91 ; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
92 ; CHECK-NEXT: unreachable
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]
99 ; CHECK: %f = landingpad
100 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
101 ; CHECK-NEXT: unreachable
104 %g = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
105 filter [1 x i32*] [i32* @T1]
107 filter [2 x i32*] [i32* @T2, i32* @T1]
109 ; CHECK: %g = landingpad
110 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
111 ; CHECK-NEXT: catch i32* @T3
112 ; CHECK-NEXT: unreachable
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
119 ; CHECK: %h = landingpad
120 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
121 ; CHECK-NEXT: unreachable
124 %i = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
126 filter [0 x i32*] zeroinitializer
128 ; CHECK: %i = landingpad
130 ; CHECK-NEXT: unreachable
133 define void @foo_cxx() {
134 ; CHECK-LABEL: @foo_cxx(
136 to label %cont.a unwind label %lpad.a
139 to label %cont.b unwind label %lpad.b
142 to label %cont.c unwind label %lpad.c
145 to label %cont.d unwind label %lpad.d
150 %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
154 ; CHECK: %a = landingpad
156 ; CHECK-NEXT: unreachable
159 %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
160 filter [1 x i32*] zeroinitializer
162 ; CHECK: %b = landingpad
163 ; CHECK-NEXT: cleanup
164 ; CHECK-NEXT: unreachable
167 %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
168 filter [2 x i32*] [i32* @T1, i32* null]
170 ; CHECK: %c = landingpad
171 ; CHECK-NEXT: cleanup
172 ; CHECK-NEXT: unreachable
175 %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
179 ; CHECK: %d = landingpad
181 ; CHECK-NEXT: unreachable
184 define void @foo_objc() {
185 ; CHECK-LABEL: @foo_objc(
187 to label %cont.a unwind label %lpad.a
190 to label %cont.b unwind label %lpad.b
193 to label %cont.c unwind label %lpad.c
196 to label %cont.d unwind label %lpad.d
201 %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
205 ; CHECK: %a = landingpad
207 ; CHECK-NEXT: unreachable
210 %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
211 filter [1 x i32*] zeroinitializer
213 ; CHECK: %b = landingpad
214 ; CHECK-NEXT: cleanup
215 ; CHECK-NEXT: unreachable
218 %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
219 filter [2 x i32*] [i32* @T1, i32* null]
221 ; CHECK: %c = landingpad
222 ; CHECK-NEXT: cleanup
223 ; CHECK-NEXT: unreachable
226 %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
230 ; CHECK: %d = landingpad
232 ; CHECK-NEXT: unreachable