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*) 10declare i32 @__C_specific_handler(...) 11 12declare void @bar() 13 14define void @foo_generic() { 15; CHECK-LABEL: @foo_generic( 16 invoke void @bar() 17 to label %cont.a unwind label %lpad.a 18cont.a: 19 invoke void @bar() 20 to label %cont.b unwind label %lpad.b 21cont.b: 22 invoke void @bar() 23 to label %cont.c unwind label %lpad.c 24cont.c: 25 invoke void @bar() 26 to label %cont.d unwind label %lpad.d 27cont.d: 28 invoke void @bar() 29 to label %cont.e unwind label %lpad.e 30cont.e: 31 invoke void @bar() 32 to label %cont.f unwind label %lpad.f 33cont.f: 34 invoke void @bar() 35 to label %cont.g unwind label %lpad.g 36cont.g: 37 invoke void @bar() 38 to label %cont.h unwind label %lpad.h 39cont.h: 40 invoke void @bar() 41 to label %cont.i unwind label %lpad.i 42cont.i: 43 ret void 44 45lpad.a: 46 %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 57lpad.b: 58 %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 66lpad.c: 67 %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 77lpad.d: 78 %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 85lpad.e: 86 %e = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 95lpad.f: 96 %f = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 104lpad.g: 105 %g = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 115lpad.h: 116 %h = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 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 124lpad.i: 125 %i = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality 126 cleanup 127 filter [0 x i32*] zeroinitializer 128 unreachable 129; CHECK: %i = landingpad 130; CHECK-NEXT: filter 131; CHECK-NEXT: unreachable 132} 133 134define void @foo_cxx() { 135; CHECK-LABEL: @foo_cxx( 136 invoke void @bar() 137 to label %cont.a unwind label %lpad.a 138cont.a: 139 invoke void @bar() 140 to label %cont.b unwind label %lpad.b 141cont.b: 142 invoke void @bar() 143 to label %cont.c unwind label %lpad.c 144cont.c: 145 invoke void @bar() 146 to label %cont.d unwind label %lpad.d 147cont.d: 148 ret void 149 150lpad.a: 151 %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 152 catch i32* null 153 catch i32* @T1 154 unreachable 155; CHECK: %a = landingpad 156; CHECK-NEXT: null 157; CHECK-NEXT: unreachable 158 159lpad.b: 160 %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 161 filter [1 x i32*] zeroinitializer 162 unreachable 163; CHECK: %b = landingpad 164; CHECK-NEXT: cleanup 165; CHECK-NEXT: unreachable 166 167lpad.c: 168 %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 169 filter [2 x i32*] [i32* @T1, i32* null] 170 unreachable 171; CHECK: %c = landingpad 172; CHECK-NEXT: cleanup 173; CHECK-NEXT: unreachable 174 175lpad.d: 176 %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 177 cleanup 178 catch i32* null 179 unreachable 180; CHECK: %d = landingpad 181; CHECK-NEXT: null 182; CHECK-NEXT: unreachable 183} 184 185define void @foo_objc() { 186; CHECK-LABEL: @foo_objc( 187 invoke void @bar() 188 to label %cont.a unwind label %lpad.a 189cont.a: 190 invoke void @bar() 191 to label %cont.b unwind label %lpad.b 192cont.b: 193 invoke void @bar() 194 to label %cont.c unwind label %lpad.c 195cont.c: 196 invoke void @bar() 197 to label %cont.d unwind label %lpad.d 198cont.d: 199 ret void 200 201lpad.a: 202 %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 203 catch i32* null 204 catch i32* @T1 205 unreachable 206; CHECK: %a = landingpad 207; CHECK-NEXT: null 208; CHECK-NEXT: unreachable 209 210lpad.b: 211 %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 212 filter [1 x i32*] zeroinitializer 213 unreachable 214; CHECK: %b = landingpad 215; CHECK-NEXT: cleanup 216; CHECK-NEXT: unreachable 217 218lpad.c: 219 %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 220 filter [2 x i32*] [i32* @T1, i32* null] 221 unreachable 222; CHECK: %c = landingpad 223; CHECK-NEXT: cleanup 224; CHECK-NEXT: unreachable 225 226lpad.d: 227 %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 228 cleanup 229 catch i32* null 230 unreachable 231; CHECK: %d = landingpad 232; CHECK-NEXT: null 233; CHECK-NEXT: unreachable 234} 235 236define void @foo_seh() { 237; CHECK-LABEL: @foo_seh( 238 invoke void @bar() 239 to label %cont.a unwind label %lpad.a 240cont.a: 241 invoke void @bar() 242 to label %cont.b unwind label %lpad.b 243cont.b: 244 invoke void @bar() 245 to label %cont.c unwind label %lpad.c 246cont.c: 247 invoke void @bar() 248 to label %cont.d unwind label %lpad.d 249cont.d: 250 ret void 251 252lpad.a: 253 %a = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler 254 catch i32* null 255 catch i32* @T1 256 unreachable 257; CHECK: %a = landingpad 258; CHECK-NEXT: null 259; CHECK-NEXT: unreachable 260 261lpad.b: 262 %b = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler 263 filter [1 x i32*] zeroinitializer 264 unreachable 265; CHECK: %b = landingpad 266; CHECK-NEXT: cleanup 267; CHECK-NEXT: unreachable 268 269lpad.c: 270 %c = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler 271 filter [2 x i32*] [i32* @T1, i32* null] 272 unreachable 273; CHECK: %c = landingpad 274; CHECK-NEXT: cleanup 275; CHECK-NEXT: unreachable 276 277lpad.d: 278 %d = landingpad { i8*, i32 } personality i32 (...)* @__C_specific_handler 279 cleanup 280 catch i32* null 281 unreachable 282; CHECK: %d = landingpad 283; CHECK-NEXT: null 284; CHECK-NEXT: unreachable 285} 286