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