1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...) 5*9880d681SAndroid Build Coastguard Workerdeclare void @fn() 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 9*9880d681SAndroid Build Coastguard Workerdefine void @test1() personality i32 (...)* @__gxx_personality_v0 { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: entry: 12*9880d681SAndroid Build Coastguard Worker; CHECK: to label %invoke2 unwind label %lpad2 13*9880d681SAndroid Build Coastguard Worker invoke void @fn() 14*9880d681SAndroid Build Coastguard Worker to label %invoke2 unwind label %lpad1 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerinvoke2: 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: invoke2: 18*9880d681SAndroid Build Coastguard Worker; CHECK: to label %invoke.cont unwind label %lpad2 19*9880d681SAndroid Build Coastguard Worker invoke void @fn() 20*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad2 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerinvoke.cont: 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerlpad1: 26*9880d681SAndroid Build Coastguard Worker %exn = landingpad {i8*, i32} 27*9880d681SAndroid Build Coastguard Worker cleanup 28*9880d681SAndroid Build Coastguard Worker br label %shared_resume 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerlpad2: 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lpad2: 32*9880d681SAndroid Build Coastguard Worker; CHECK: landingpad { i8*, i32 } 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cleanup 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @fn() 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 36*9880d681SAndroid Build Coastguard Worker %exn2 = landingpad {i8*, i32} 37*9880d681SAndroid Build Coastguard Worker cleanup 38*9880d681SAndroid Build Coastguard Worker br label %shared_resume 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workershared_resume: 41*9880d681SAndroid Build Coastguard Worker call void @fn() 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; Don't trigger if blocks aren't the same/empty 46*9880d681SAndroid Build Coastguard Workerdefine void @neg1() personality i32 (...)* @__gxx_personality_v0 { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @neg1 48*9880d681SAndroid Build Coastguard Workerentry: 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: entry: 50*9880d681SAndroid Build Coastguard Worker; CHECK: to label %invoke2 unwind label %lpad1 51*9880d681SAndroid Build Coastguard Worker invoke void @fn() 52*9880d681SAndroid Build Coastguard Worker to label %invoke2 unwind label %lpad1 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerinvoke2: 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: invoke2: 56*9880d681SAndroid Build Coastguard Worker; CHECK: to label %invoke.cont unwind label %lpad2 57*9880d681SAndroid Build Coastguard Worker invoke void @fn() 58*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad2 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerinvoke.cont: 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerlpad1: 64*9880d681SAndroid Build Coastguard Worker %exn = landingpad {i8*, i32} 65*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 66*9880d681SAndroid Build Coastguard Worker call void @fn() 67*9880d681SAndroid Build Coastguard Worker br label %shared_resume 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerlpad2: 70*9880d681SAndroid Build Coastguard Worker %exn2 = landingpad {i8*, i32} 71*9880d681SAndroid Build Coastguard Worker cleanup 72*9880d681SAndroid Build Coastguard Worker br label %shared_resume 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workershared_resume: 75*9880d681SAndroid Build Coastguard Worker call void @fn() 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; Should not trigger when the landing pads are not the exact same 80*9880d681SAndroid Build Coastguard Workerdefine void @neg2() personality i32 (...)* @__gxx_personality_v0 { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @neg2 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: entry: 84*9880d681SAndroid Build Coastguard Worker; CHECK: to label %invoke2 unwind label %lpad1 85*9880d681SAndroid Build Coastguard Worker invoke void @fn() 86*9880d681SAndroid Build Coastguard Worker to label %invoke2 unwind label %lpad1 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerinvoke2: 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: invoke2: 90*9880d681SAndroid Build Coastguard Worker; CHECK: to label %invoke.cont unwind label %lpad2 91*9880d681SAndroid Build Coastguard Worker invoke void @fn() 92*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %lpad2 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerinvoke.cont: 95*9880d681SAndroid Build Coastguard Worker ret void 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerlpad1: 98*9880d681SAndroid Build Coastguard Worker %exn = landingpad {i8*, i32} 99*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 100*9880d681SAndroid Build Coastguard Worker br label %shared_resume 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerlpad2: 103*9880d681SAndroid Build Coastguard Worker %exn2 = landingpad {i8*, i32} 104*9880d681SAndroid Build Coastguard Worker cleanup 105*9880d681SAndroid Build Coastguard Worker br label %shared_resume 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workershared_resume: 108*9880d681SAndroid Build Coastguard Worker call void @fn() 109*9880d681SAndroid Build Coastguard Worker ret void 110*9880d681SAndroid Build Coastguard Worker} 111