1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -disable-output -jump-threading 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker%class.E = type { i32 (...)**, %class.C } 4*9880d681SAndroid Build Coastguard Worker%class.C = type { %class.A } 5*9880d681SAndroid Build Coastguard Worker%class.A = type { i32 } 6*9880d681SAndroid Build Coastguard Worker%class.D = type { %class.F } 7*9880d681SAndroid Build Coastguard Worker%class.F = type { %class.E } 8*9880d681SAndroid Build Coastguard Worker%class.B = type { %class.D* } 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@_ZTV1D = unnamed_addr constant [3 x i8*] [i8* null, i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1D to i8*), i8* bitcast (void (%class.D*)* @_ZN1D7doApplyEv to i8*)] 11*9880d681SAndroid Build Coastguard Worker@_ZTI1D = external unnamed_addr constant { i8*, i8*, i8* } 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine void @_ZN15EditCommandImpl5applyEv(%class.E* %this) uwtable align 2 { 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker %0 = bitcast %class.E* %this to void (%class.E*)*** 16*9880d681SAndroid Build Coastguard Worker %vtable = load void (%class.E*)**, void (%class.E*)*** %0, align 8 17*9880d681SAndroid Build Coastguard Worker %1 = load void (%class.E*)*, void (%class.E*)** %vtable, align 8 18*9880d681SAndroid Build Coastguard Worker call void %1(%class.E* %this) 19*9880d681SAndroid Build Coastguard Worker ret void 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1DC1Ev(%class.D* nocapture %this) unnamed_addr uwtable align 2 { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker call void @_ZN24CompositeEditCommandImplC2Ev() 25*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds %class.D, %class.D* %this, i64 0, i32 0, i32 0, i32 0 26*9880d681SAndroid Build Coastguard Worker store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1D, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8 27*9880d681SAndroid Build Coastguard Worker ret void 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1DC2Ev(%class.D* nocapture %this) unnamed_addr uwtable align 2 { 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker call void @_ZN24CompositeEditCommandImplC2Ev() 33*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds %class.D, %class.D* %this, i64 0, i32 0, i32 0, i32 0 34*9880d681SAndroid Build Coastguard Worker store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1D, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8 35*9880d681SAndroid Build Coastguard Worker ret void 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdeclare void @_ZN24CompositeEditCommandImplC2Ev() #1 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1D7doApplyEv(%class.D* nocapture %this) unnamed_addr nounwind readnone uwtable align 2 { 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine void @_Z3fn1v() uwtable personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 46*9880d681SAndroid Build Coastguard Workerentry: 47*9880d681SAndroid Build Coastguard Worker %call = call noalias i8* @_Znwm() #8 48*9880d681SAndroid Build Coastguard Worker invoke void @_ZN24CompositeEditCommandImplC2Ev() 49*9880d681SAndroid Build Coastguard Worker to label %_ZN1DC1Ev.exit unwind label %lpad 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker_ZN1DC1Ev.exit: ; preds = %entry 52*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %call to i32 (...)*** 53*9880d681SAndroid Build Coastguard Worker store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1D, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8 54*9880d681SAndroid Build Coastguard Worker %_ref.i.i.i = getelementptr inbounds i8, i8* %call, i64 8 55*9880d681SAndroid Build Coastguard Worker %1 = bitcast i8* %_ref.i.i.i to i32* 56*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* %1, align 4 57*9880d681SAndroid Build Coastguard Worker %inc.i.i.i = add nsw i32 %2, 1 58*9880d681SAndroid Build Coastguard Worker store i32 %inc.i.i.i, i32* %1, align 4 59*9880d681SAndroid Build Coastguard Worker %3 = bitcast i8* %call to %class.D* 60*9880d681SAndroid Build Coastguard Worker invoke void @_ZN1D7doApplyEv(%class.D* %3) 61*9880d681SAndroid Build Coastguard Worker to label %_ZN15EditCommandImpl5applyEv.exit unwind label %lpad1 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker_ZN15EditCommandImpl5applyEv.exit: ; preds = %_ZN1DC1Ev.exit 64*9880d681SAndroid Build Coastguard Worker invoke void @_ZN1D16deleteKeyPressedEv() 65*9880d681SAndroid Build Coastguard Worker to label %invoke.cont7 unwind label %lpad1 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerinvoke.cont7: ; preds = %_ZN15EditCommandImpl5applyEv.exit 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerlpad: ; preds = %entry 71*9880d681SAndroid Build Coastguard Worker %4 = landingpad { i8*, i32 } 72*9880d681SAndroid Build Coastguard Worker cleanup 73*9880d681SAndroid Build Coastguard Worker call void @_ZdlPv() #9 74*9880d681SAndroid Build Coastguard Worker unreachable 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerlpad1: ; preds = %_ZN1DC1Ev.exit, %_ZN15EditCommandImpl5applyEv.exit 77*9880d681SAndroid Build Coastguard Worker %5 = landingpad { i8*, i32 } 78*9880d681SAndroid Build Coastguard Worker cleanup 79*9880d681SAndroid Build Coastguard Worker %6 = load i32, i32* %1, align 4 80*9880d681SAndroid Build Coastguard Worker %tobool.i.i.i = icmp eq i32 %6, 0 81*9880d681SAndroid Build Coastguard Worker br i1 %tobool.i.i.i, label %_ZN1BI1DED1Ev.exit, label %if.then.i.i.i 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerif.then.i.i.i: ; preds = %lpad1 84*9880d681SAndroid Build Coastguard Worker br i1 undef, label %_ZN1BI1DED1Ev.exit, label %delete.notnull.i.i.i 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdelete.notnull.i.i.i: ; preds = %if.then.i.i.i 87*9880d681SAndroid Build Coastguard Worker call void @_ZdlPv() #9 88*9880d681SAndroid Build Coastguard Worker unreachable 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker_ZN1BI1DED1Ev.exit: ; preds = %lpad1, %if.then.i.i.i 91*9880d681SAndroid Build Coastguard Worker resume { i8*, i32 } undef 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerterminate.lpad: ; No predecessors! 94*9880d681SAndroid Build Coastguard Worker %7 = landingpad { i8*, i32 } 95*9880d681SAndroid Build Coastguard Worker catch i8* null 96*9880d681SAndroid Build Coastguard Worker unreachable 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1BI1DEC1EPS0_(%class.B* nocapture %this, %class.D* %p1) unnamed_addr uwtable align 2 { 100*9880d681SAndroid Build Coastguard Workerentry: 101*9880d681SAndroid Build Coastguard Worker %m_ptr.i = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0 102*9880d681SAndroid Build Coastguard Worker store %class.D* %p1, %class.D** %m_ptr.i, align 8 103*9880d681SAndroid Build Coastguard Worker %_ref.i.i = getelementptr inbounds %class.D, %class.D* %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 104*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %_ref.i.i, align 4 105*9880d681SAndroid Build Coastguard Worker %inc.i.i = add nsw i32 %0, 1 106*9880d681SAndroid Build Coastguard Worker store i32 %inc.i.i, i32* %_ref.i.i, align 4 107*9880d681SAndroid Build Coastguard Worker ret void 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @_Znwm() 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...) 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdeclare void @_ZdlPv() 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdefine %class.D* @_ZN1BI1DEptEv(%class.B* nocapture readonly %this) nounwind readonly uwtable align 2 { 117*9880d681SAndroid Build Coastguard Workerentry: 118*9880d681SAndroid Build Coastguard Worker %m_ptr = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0 119*9880d681SAndroid Build Coastguard Worker %0 = load %class.D*, %class.D** %m_ptr, align 8 120*9880d681SAndroid Build Coastguard Worker ret %class.D* %0 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdeclare void @_ZN1D16deleteKeyPressedEv() 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1BI1DED1Ev(%class.B* nocapture readonly %this) unnamed_addr uwtable align 2 { 126*9880d681SAndroid Build Coastguard Workerentry: 127*9880d681SAndroid Build Coastguard Worker %m_ptr.i = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0 128*9880d681SAndroid Build Coastguard Worker %0 = load %class.D*, %class.D** %m_ptr.i, align 8 129*9880d681SAndroid Build Coastguard Worker %_ref.i.i = getelementptr inbounds %class.D, %class.D* %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 130*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %_ref.i.i, align 4 131*9880d681SAndroid Build Coastguard Worker %tobool.i.i = icmp eq i32 %1, 0 132*9880d681SAndroid Build Coastguard Worker br i1 %tobool.i.i, label %_ZN1BI1DED2Ev.exit, label %if.then.i.i 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerif.then.i.i: ; preds = %entry 135*9880d681SAndroid Build Coastguard Worker br i1 undef, label %_ZN1BI1DED2Ev.exit, label %delete.notnull.i.i 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdelete.notnull.i.i: ; preds = %if.then.i.i 138*9880d681SAndroid Build Coastguard Worker call void @_ZdlPv() #9 139*9880d681SAndroid Build Coastguard Worker unreachable 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker_ZN1BI1DED2Ev.exit: ; preds = %entry, %if.then.i.i 142*9880d681SAndroid Build Coastguard Worker ret void 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdeclare hidden void @__clang_call_terminate() 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1BI1DED2Ev(%class.B* nocapture readonly %this) unnamed_addr uwtable align 2 { 148*9880d681SAndroid Build Coastguard Workerentry: 149*9880d681SAndroid Build Coastguard Worker %m_ptr = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0 150*9880d681SAndroid Build Coastguard Worker %0 = load %class.D*, %class.D** %m_ptr, align 8 151*9880d681SAndroid Build Coastguard Worker %_ref.i = getelementptr inbounds %class.D, %class.D* %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 152*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %_ref.i, align 4 153*9880d681SAndroid Build Coastguard Worker %tobool.i = icmp eq i32 %1, 0 154*9880d681SAndroid Build Coastguard Worker br i1 %tobool.i, label %_ZN1AI1CE5derefEv.exit, label %if.then.i 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerif.then.i: ; preds = %entry 157*9880d681SAndroid Build Coastguard Worker br i1 undef, label %_ZN1AI1CE5derefEv.exit, label %delete.notnull.i 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdelete.notnull.i: ; preds = %if.then.i 160*9880d681SAndroid Build Coastguard Worker call void @_ZdlPv() #9 161*9880d681SAndroid Build Coastguard Worker unreachable 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker_ZN1AI1CE5derefEv.exit: ; preds = %entry, %if.then.i 164*9880d681SAndroid Build Coastguard Worker ret void 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1AI1CE5derefEv(%class.A* nocapture readonly %this) nounwind uwtable align 2 { 168*9880d681SAndroid Build Coastguard Workerentry: 169*9880d681SAndroid Build Coastguard Worker %_ref = getelementptr inbounds %class.A, %class.A* %this, i64 0, i32 0 170*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %_ref, align 4 171*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %0, 0 172*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 175*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.end, label %delete.notnull 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdelete.notnull: ; preds = %if.then 178*9880d681SAndroid Build Coastguard Worker call void @_ZdlPv() #9 179*9880d681SAndroid Build Coastguard Worker unreachable 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 182*9880d681SAndroid Build Coastguard Worker ret void 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1BI1DEC2EPS0_(%class.B* nocapture %this, %class.D* %p1) unnamed_addr uwtable align 2 { 186*9880d681SAndroid Build Coastguard Workerentry: 187*9880d681SAndroid Build Coastguard Worker %m_ptr = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0 188*9880d681SAndroid Build Coastguard Worker store %class.D* %p1, %class.D** %m_ptr, align 8 189*9880d681SAndroid Build Coastguard Worker %_ref.i = getelementptr inbounds %class.D, %class.D* %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0 190*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %_ref.i, align 4 191*9880d681SAndroid Build Coastguard Worker %inc.i = add nsw i32 %0, 1 192*9880d681SAndroid Build Coastguard Worker store i32 %inc.i, i32* %_ref.i, align 4 193*9880d681SAndroid Build Coastguard Worker ret void 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdefine void @_ZN1AI1CE3refEv(%class.A* nocapture %this) nounwind uwtable align 2 { 197*9880d681SAndroid Build Coastguard Workerentry: 198*9880d681SAndroid Build Coastguard Worker %_ref = getelementptr inbounds %class.A, %class.A* %this, i64 0, i32 0 199*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %_ref, align 4 200*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 201*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %_ref, align 4 202*9880d681SAndroid Build Coastguard Worker ret void 203*9880d681SAndroid Build Coastguard Worker} 204