289 lines · plain
1; RUN: opt < %s -passes=instcombine -S | FileCheck %s2 3@T1 = external constant i324@T2 = external constant i325@T3 = external constant i326 7declare i32 @generic_personality(i32, i64, ptr, ptr)8declare i32 @__gxx_personality_v0(i32, i64, ptr, ptr)9declare i32 @__objc_personality_v0(i32, i64, ptr, ptr)10declare i32 @__C_specific_handler(...)11 12declare void @bar()13 14define void @foo_generic() personality ptr @generic_personality {15; CHECK-LABEL: @foo_generic(16 invoke void @bar()17 to label %cont.a unwind label %lpad.a18cont.a:19 invoke void @bar()20 to label %cont.b unwind label %lpad.b21cont.b:22 invoke void @bar()23 to label %cont.c unwind label %lpad.c24cont.c:25 invoke void @bar()26 to label %cont.d unwind label %lpad.d27cont.d:28 invoke void @bar()29 to label %cont.e unwind label %lpad.e30cont.e:31 invoke void @bar()32 to label %cont.f unwind label %lpad.f33cont.f:34 invoke void @bar()35 to label %cont.g unwind label %lpad.g36cont.g:37 invoke void @bar()38 to label %cont.h unwind label %lpad.h39cont.h:40 invoke void @bar()41 to label %cont.i unwind label %lpad.i42cont.i:43 ret void44 45lpad.a:46 %a = landingpad { ptr, i32 }47 catch ptr @T148 catch ptr @T249 catch ptr @T150 catch ptr @T251 unreachable52; CHECK: %a = landingpad53; CHECK-NEXT: @T154; CHECK-NEXT: @T255; CHECK-NEXT: unreachable56 57lpad.b:58 %b = landingpad { ptr, i32 }59 filter [0 x ptr] zeroinitializer60 catch ptr @T161 unreachable62; CHECK: %b = landingpad63; CHECK-NEXT: filter64; CHECK-NEXT: unreachable65 66lpad.c:67 %c = landingpad { ptr, i32 }68 catch ptr @T169 filter [1 x ptr] [ptr @T1]70 catch ptr @T271 unreachable72; Caught types should not be removed from filters73; CHECK: %c = landingpad74; CHECK-NEXT: catch ptr @T175; CHECK-NEXT: filter [1 x ptr] [ptr @T1]76; CHECK-NEXT: catch ptr @T2 77; CHECK-NEXT: unreachable78 79lpad.d:80 %d = landingpad { ptr, i32 }81 filter [3 x ptr] zeroinitializer82 unreachable83; CHECK: %d = landingpad84; CHECK-NEXT: filter [1 x ptr] zeroinitializer85; CHECK-NEXT: unreachable86 87lpad.e:88 %e = landingpad { ptr, i32 }89 catch ptr @T190 filter [3 x ptr] [ptr @T1, ptr @T2, ptr @T2]91 unreachable92; Caught types should not be removed from filters93; CHECK: %e = landingpad94; CHECK-NEXT: catch ptr @T195; CHECK-NEXT: filter [2 x ptr] [ptr @T1, ptr @T2]96; CHECK-NEXT: unreachable97 98lpad.f:99 %f = landingpad { ptr, i32 }100 filter [2 x ptr] [ptr @T2, ptr @T1]101 filter [1 x ptr] [ptr @T1]102 unreachable103; CHECK: %f = landingpad104; CHECK-NEXT: filter [1 x ptr] [ptr @T1]105; CHECK-NEXT: unreachable106 107lpad.g:108 %g = landingpad { ptr, i32 }109 filter [1 x ptr] [ptr @T1]110 catch ptr @T3111 filter [2 x ptr] [ptr @T2, ptr @T1]112 unreachable113; CHECK: %g = landingpad114; CHECK-NEXT: filter [1 x ptr] [ptr @T1]115; CHECK-NEXT: catch ptr @T3116; CHECK-NEXT: unreachable117 118lpad.h:119 %h = landingpad { ptr, i32 }120 filter [2 x ptr] [ptr @T1, ptr null]121 filter [1 x ptr] zeroinitializer122 unreachable123; CHECK: %h = landingpad124; CHECK-NEXT: filter [1 x ptr] zeroinitializer125; CHECK-NEXT: unreachable126 127lpad.i:128 %i = landingpad { ptr, i32 }129 cleanup130 filter [0 x ptr] zeroinitializer131 unreachable132; CHECK: %i = landingpad133; CHECK-NEXT: filter134; CHECK-NEXT: unreachable135}136 137define void @foo_cxx() personality ptr @__gxx_personality_v0 {138; CHECK-LABEL: @foo_cxx(139 invoke void @bar()140 to label %cont.a unwind label %lpad.a141cont.a:142 invoke void @bar()143 to label %cont.b unwind label %lpad.b144cont.b:145 invoke void @bar()146 to label %cont.c unwind label %lpad.c147cont.c:148 invoke void @bar()149 to label %cont.d unwind label %lpad.d150cont.d:151 ret void152 153lpad.a:154 %a = landingpad { ptr, i32 }155 catch ptr null156 catch ptr @T1157 unreachable158; CHECK: %a = landingpad159; CHECK-NEXT: null160; CHECK-NEXT: unreachable161 162lpad.b:163 %b = landingpad { ptr, i32 }164 filter [1 x ptr] zeroinitializer165 unreachable166; CHECK: %b = landingpad167; CHECK-NEXT: cleanup168; CHECK-NEXT: unreachable169 170lpad.c:171 %c = landingpad { ptr, i32 }172 filter [2 x ptr] [ptr @T1, ptr null]173 unreachable174; CHECK: %c = landingpad175; CHECK-NEXT: cleanup176; CHECK-NEXT: unreachable177 178lpad.d:179 %d = landingpad { ptr, i32 }180 cleanup181 catch ptr null182 unreachable183; CHECK: %d = landingpad184; CHECK-NEXT: null185; CHECK-NEXT: unreachable186}187 188define void @foo_objc() personality ptr @__objc_personality_v0 {189; CHECK-LABEL: @foo_objc(190 invoke void @bar()191 to label %cont.a unwind label %lpad.a192cont.a:193 invoke void @bar()194 to label %cont.b unwind label %lpad.b195cont.b:196 invoke void @bar()197 to label %cont.c unwind label %lpad.c198cont.c:199 invoke void @bar()200 to label %cont.d unwind label %lpad.d201cont.d:202 ret void203 204lpad.a:205 %a = landingpad { ptr, i32 }206 catch ptr null207 catch ptr @T1208 unreachable209; CHECK: %a = landingpad210; CHECK-NEXT: null211; CHECK-NEXT: unreachable212 213lpad.b:214 %b = landingpad { ptr, i32 }215 filter [1 x ptr] zeroinitializer216 unreachable217; CHECK: %b = landingpad218; CHECK-NEXT: cleanup219; CHECK-NEXT: unreachable220 221lpad.c:222 %c = landingpad { ptr, i32 }223 filter [2 x ptr] [ptr @T1, ptr null]224 unreachable225; CHECK: %c = landingpad226; CHECK-NEXT: cleanup227; CHECK-NEXT: unreachable228 229lpad.d:230 %d = landingpad { ptr, i32 }231 cleanup232 catch ptr null233 unreachable234; CHECK: %d = landingpad235; CHECK-NEXT: null236; CHECK-NEXT: unreachable237}238 239define void @foo_seh() personality ptr @__C_specific_handler {240; CHECK-LABEL: @foo_seh(241 invoke void @bar()242 to label %cont.a unwind label %lpad.a243cont.a:244 invoke void @bar()245 to label %cont.b unwind label %lpad.b246cont.b:247 invoke void @bar()248 to label %cont.c unwind label %lpad.c249cont.c:250 invoke void @bar()251 to label %cont.d unwind label %lpad.d252cont.d:253 ret void254 255lpad.a:256 %a = landingpad { ptr, i32 }257 catch ptr null258 catch ptr @T1259 unreachable260; CHECK: %a = landingpad261; CHECK-NEXT: null262; CHECK-NEXT: unreachable263 264lpad.b:265 %b = landingpad { ptr, i32 }266 filter [1 x ptr] zeroinitializer267 unreachable268; CHECK: %b = landingpad269; CHECK-NEXT: cleanup270; CHECK-NEXT: unreachable271 272lpad.c:273 %c = landingpad { ptr, i32 }274 filter [2 x ptr] [ptr @T1, ptr null]275 unreachable276; CHECK: %c = landingpad277; CHECK-NEXT: cleanup278; CHECK-NEXT: unreachable279 280lpad.d:281 %d = landingpad { ptr, i32 }282 cleanup283 catch ptr null284 unreachable285; CHECK: %d = landingpad286; CHECK-NEXT: null287; CHECK-NEXT: unreachable288}289