1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm -mtriple=armv4t-unknown-linux-gnueabi | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; PR 7433 3*9880d681SAndroid Build Coastguard Worker; XFAIL: * 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker%0 = type { i8*, i8* } 6*9880d681SAndroid Build Coastguard Worker%1 = type { i8*, i8*, i8* } 7*9880d681SAndroid Build Coastguard Worker%"class.llvm::Record" = type { i32, %"class.std::basic_string", %"class.llvm::SMLoc", %"class.std::vector", %"class.std::vector", %"class.std::vector" } 8*9880d681SAndroid Build Coastguard Worker%"class.llvm::RecordVal" = type { %"class.std::basic_string", %"struct.llvm::Init"*, i32, %"struct.llvm::Init"* } 9*9880d681SAndroid Build Coastguard Worker%"class.llvm::SMLoc" = type { i8* } 10*9880d681SAndroid Build Coastguard Worker%"class.llvm::StringInit" = type { [8 x i8], %"class.std::basic_string" } 11*9880d681SAndroid Build Coastguard Worker%"class.std::basic_string" = type { %"class.llvm::SMLoc" } 12*9880d681SAndroid Build Coastguard Worker%"class.std::vector" = type { [12 x i8] } 13*9880d681SAndroid Build Coastguard Worker%"struct.llvm::Init" = type { i32 (...)** } 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker@_ZTIN4llvm5RecTyE = external constant %0 ; <%0*> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker@_ZTIN4llvm4InitE = external constant %0 ; <%0*> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker@_ZTIN4llvm11RecordRecTyE = external constant %1 ; <%1*> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker@.str8 = external constant [47 x i8] ; <[47 x i8]*> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker@_ZTIN4llvm9UnsetInitE = external constant %1 ; <%1*> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker@.str51 = external constant [45 x i8] ; <[45 x i8]*> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker@__PRETTY_FUNCTION__._ZNK4llvm7VarInit12getFieldInitERNS_6RecordEPKNS_9RecordValERKSs = external constant [116 x i8] ; <[116 x i8]*> [#uses=1] 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker@_ZN4llvm9RecordValC1ERKSsPNS_5RecTyEj = alias void (%"class.llvm::RecordVal"*, %"class.std::basic_string"*, %"struct.llvm::Init"*, i32), void (%"class.llvm::RecordVal"*, %"class.std::basic_string"*, %"struct.llvm::Init"*, i32)* @_ZN4llvm9RecordValC2ERKSsPNS_5RecTyEj ; <void (%"class.llvm::RecordVal"*, %"class.std::basic_string"*, %"struct.llvm::Init"*, i32)*> [#uses=0] 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdeclare i8* @__dynamic_cast(i8*, i8*, i8*, i32) 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdeclare void @__assert_fail(i8*, i8*, i32, i8*) noreturn 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdeclare void @_ZN4llvm9RecordValC2ERKSsPNS_5RecTyEj(%"class.llvm::RecordVal"*, %"class.std::basic_string"*, %"struct.llvm::Init"*, i32) align 2 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine %"struct.llvm::Init"* @_ZNK4llvm7VarInit12getFieldInitERNS_6RecordEPKNS_9RecordValERKSs(%"class.llvm::StringInit"* %this, %"class.llvm::Record"* %R, %"class.llvm::RecordVal"* %RV, %"class.std::basic_string"* %FieldName) align 2 { 32*9880d681SAndroid Build Coastguard Worker;CHECK: ldmia sp!, {r4, r5, r6, r7, r8, lr} 33*9880d681SAndroid Build Coastguard Worker;CHECK: bx r12 @ TAILCALL 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker %.loc = alloca i32 ; <i32*> [#uses=2] 36*9880d681SAndroid Build Coastguard Worker %tmp.i = getelementptr inbounds %"class.llvm::StringInit", %"class.llvm::StringInit"* %this, i32 0, i32 0, i32 4 ; <i8*> [#uses=1] 37*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %tmp.i to %"struct.llvm::Init"** ; <%"struct.llvm::Init"**> [#uses=1] 38*9880d681SAndroid Build Coastguard Worker %tmp2.i = load %"struct.llvm::Init"*, %"struct.llvm::Init"** %0 ; <%"struct.llvm::Init"*> [#uses=2] 39*9880d681SAndroid Build Coastguard Worker %1 = icmp eq %"struct.llvm::Init"* %tmp2.i, null ; <i1> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker br i1 %1, label %entry.return_crit_edge, label %tmpbb 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerentry.return_crit_edge: ; preds = %entry 43*9880d681SAndroid Build Coastguard Worker br label %return 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workertmpbb: ; preds = %entry 46*9880d681SAndroid Build Coastguard Worker %2 = bitcast %"struct.llvm::Init"* %tmp2.i to i8* ; <i8*> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker %3 = tail call i8* @__dynamic_cast(i8* %2, i8* bitcast (%0* @_ZTIN4llvm5RecTyE to i8*), i8* bitcast (%1* @_ZTIN4llvm11RecordRecTyE to i8*), i32 -1) ; <i8*> [#uses=1] 48*9880d681SAndroid Build Coastguard Worker %phitmp = icmp eq i8* %3, null ; <i1> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker br i1 %phitmp, label %.return_crit_edge, label %if.then 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker.return_crit_edge: ; preds = %tmpbb 52*9880d681SAndroid Build Coastguard Worker br label %return 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %tmpbb 55*9880d681SAndroid Build Coastguard Worker %tmp2.i.i.i.i = getelementptr inbounds %"class.llvm::StringInit", %"class.llvm::StringInit"* %this, i32 0, i32 1, i32 0, i32 0 ; <i8**> [#uses=1] 56*9880d681SAndroid Build Coastguard Worker %tmp3.i.i.i.i = load i8*, i8** %tmp2.i.i.i.i ; <i8*> [#uses=2] 57*9880d681SAndroid Build Coastguard Worker %arrayidx.i.i.i.i = getelementptr inbounds i8, i8* %tmp3.i.i.i.i, i32 -12 ; <i8*> [#uses=1] 58*9880d681SAndroid Build Coastguard Worker %tmp.i.i.i = bitcast i8* %arrayidx.i.i.i.i to i32* ; <i32*> [#uses=1] 59*9880d681SAndroid Build Coastguard Worker %tmp2.i.i.i = load i32, i32* %tmp.i.i.i ; <i32> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker %tmp.i5 = getelementptr inbounds %"class.llvm::Record", %"class.llvm::Record"* %R, i32 0, i32 4 ; <%"class.std::vector"*> [#uses=1] 61*9880d681SAndroid Build Coastguard Worker %tmp2.i.i = getelementptr inbounds %"class.llvm::Record", %"class.llvm::Record"* %R, i32 0, i32 4, i32 0, i32 4 ; <i8*> [#uses=1] 62*9880d681SAndroid Build Coastguard Worker %4 = bitcast i8* %tmp2.i.i to %"class.llvm::RecordVal"** ; <%"class.llvm::RecordVal"**> [#uses=1] 63*9880d681SAndroid Build Coastguard Worker %tmp3.i.i6 = load %"class.llvm::RecordVal"*, %"class.llvm::RecordVal"** %4 ; <%"class.llvm::RecordVal"*> [#uses=1] 64*9880d681SAndroid Build Coastguard Worker %tmp5.i.i = bitcast %"class.std::vector"* %tmp.i5 to %"class.llvm::RecordVal"** ; <%"class.llvm::RecordVal"**> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker %tmp6.i.i = load %"class.llvm::RecordVal"*, %"class.llvm::RecordVal"** %tmp5.i.i ; <%"class.llvm::RecordVal"*> [#uses=5] 66*9880d681SAndroid Build Coastguard Worker %sub.ptr.lhs.cast.i.i = ptrtoint %"class.llvm::RecordVal"* %tmp3.i.i6 to i32 ; <i32> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker %sub.ptr.rhs.cast.i.i = ptrtoint %"class.llvm::RecordVal"* %tmp6.i.i to i32 ; <i32> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker %sub.ptr.sub.i.i = sub i32 %sub.ptr.lhs.cast.i.i, %sub.ptr.rhs.cast.i.i ; <i32> [#uses=1] 69*9880d681SAndroid Build Coastguard Worker %sub.ptr.div.i.i = ashr i32 %sub.ptr.sub.i.i, 4 ; <i32> [#uses=1] 70*9880d681SAndroid Build Coastguard Worker br label %codeRepl 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard WorkercodeRepl: ; preds = %if.then 73*9880d681SAndroid Build Coastguard Worker %targetBlock = call i1 @_ZNK4llvm7VarInit12getFieldInitERNS_6RecordEPKNS_9RecordValERKSs_for.cond.i(i32 %sub.ptr.div.i.i, %"class.llvm::RecordVal"* %tmp6.i.i, i32 %tmp2.i.i.i, i8* %tmp3.i.i.i.i, i32* %.loc) ; <i1> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker %.reload = load i32, i32* %.loc ; <i32> [#uses=3] 75*9880d681SAndroid Build Coastguard Worker br i1 %targetBlock, label %for.cond.i.return_crit_edge, label %_ZN4llvm6Record8getValueENS_9StringRefE.exit 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerfor.cond.i.return_crit_edge: ; preds = %codeRepl 78*9880d681SAndroid Build Coastguard Worker br label %return 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker_ZN4llvm6Record8getValueENS_9StringRefE.exit: ; preds = %codeRepl 81*9880d681SAndroid Build Coastguard Worker %add.ptr.i.i = getelementptr inbounds %"class.llvm::RecordVal", %"class.llvm::RecordVal"* %tmp6.i.i, i32 %.reload ; <%"class.llvm::RecordVal"*> [#uses=2] 82*9880d681SAndroid Build Coastguard Worker %tobool5 = icmp eq %"class.llvm::RecordVal"* %add.ptr.i.i, null ; <i1> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker br i1 %tobool5, label %_ZN4llvm6Record8getValueENS_9StringRefE.exit.return_crit_edge, label %if.then6 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker_ZN4llvm6Record8getValueENS_9StringRefE.exit.return_crit_edge: ; preds = %_ZN4llvm6Record8getValueENS_9StringRefE.exit 86*9880d681SAndroid Build Coastguard Worker br label %return 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerif.then6: ; preds = %_ZN4llvm6Record8getValueENS_9StringRefE.exit 89*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq %"class.llvm::RecordVal"* %add.ptr.i.i, %RV ; <i1> [#uses=1] 90*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then6.if.end_crit_edge, label %land.lhs.true 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerif.then6.if.end_crit_edge: ; preds = %if.then6 93*9880d681SAndroid Build Coastguard Worker br label %if.end 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerland.lhs.true: ; preds = %if.then6 96*9880d681SAndroid Build Coastguard Worker %tobool10 = icmp eq %"class.llvm::RecordVal"* %RV, null ; <i1> [#uses=1] 97*9880d681SAndroid Build Coastguard Worker br i1 %tobool10, label %lor.lhs.false, label %land.lhs.true.return_crit_edge 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerland.lhs.true.return_crit_edge: ; preds = %land.lhs.true 100*9880d681SAndroid Build Coastguard Worker br label %return 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerlor.lhs.false: ; preds = %land.lhs.true 103*9880d681SAndroid Build Coastguard Worker %tmp.i3 = getelementptr inbounds %"class.llvm::RecordVal", %"class.llvm::RecordVal"* %tmp6.i.i, i32 %.reload, i32 3 ; <%"struct.llvm::Init"**> [#uses=1] 104*9880d681SAndroid Build Coastguard Worker %tmp2.i4 = load %"struct.llvm::Init"*, %"struct.llvm::Init"** %tmp.i3 ; <%"struct.llvm::Init"*> [#uses=2] 105*9880d681SAndroid Build Coastguard Worker %5 = icmp eq %"struct.llvm::Init"* %tmp2.i4, null ; <i1> [#uses=1] 106*9880d681SAndroid Build Coastguard Worker br i1 %5, label %lor.lhs.false.if.end_crit_edge, label %tmpbb1 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerlor.lhs.false.if.end_crit_edge: ; preds = %lor.lhs.false 109*9880d681SAndroid Build Coastguard Worker br label %if.end 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workertmpbb1: ; preds = %lor.lhs.false 112*9880d681SAndroid Build Coastguard Worker %6 = bitcast %"struct.llvm::Init"* %tmp2.i4 to i8* ; <i8*> [#uses=1] 113*9880d681SAndroid Build Coastguard Worker %7 = tail call i8* @__dynamic_cast(i8* %6, i8* bitcast (%0* @_ZTIN4llvm4InitE to i8*), i8* bitcast (%1* @_ZTIN4llvm9UnsetInitE to i8*), i32 -1) ; <i8*> [#uses=1] 114*9880d681SAndroid Build Coastguard Worker %phitmp32 = icmp eq i8* %7, null ; <i1> [#uses=1] 115*9880d681SAndroid Build Coastguard Worker br i1 %phitmp32, label %.if.end_crit_edge, label %.return_crit_edge1 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker.return_crit_edge1: ; preds = %tmpbb1 118*9880d681SAndroid Build Coastguard Worker br label %return 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker.if.end_crit_edge: ; preds = %tmpbb1 121*9880d681SAndroid Build Coastguard Worker br label %if.end 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %.if.end_crit_edge, %lor.lhs.false.if.end_crit_edge, %if.then6.if.end_crit_edge 124*9880d681SAndroid Build Coastguard Worker %tmp.i1 = getelementptr inbounds %"class.llvm::RecordVal", %"class.llvm::RecordVal"* %tmp6.i.i, i32 %.reload, i32 3 ; <%"struct.llvm::Init"**> [#uses=1] 125*9880d681SAndroid Build Coastguard Worker %tmp2.i2 = load %"struct.llvm::Init"*, %"struct.llvm::Init"** %tmp.i1 ; <%"struct.llvm::Init"*> [#uses=3] 126*9880d681SAndroid Build Coastguard Worker %8 = bitcast %"class.llvm::StringInit"* %this to %"struct.llvm::Init"* ; <%"struct.llvm::Init"*> [#uses=1] 127*9880d681SAndroid Build Coastguard Worker %cmp19 = icmp eq %"struct.llvm::Init"* %tmp2.i2, %8 ; <i1> [#uses=1] 128*9880d681SAndroid Build Coastguard Worker br i1 %cmp19, label %cond.false, label %cond.end 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workercond.false: ; preds = %if.end 131*9880d681SAndroid Build Coastguard Worker tail call void @__assert_fail(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str51, i32 0, i32 0), i8* getelementptr inbounds ([47 x i8], [47 x i8]* @.str8, i32 0, i32 0), i32 1141, i8* getelementptr inbounds ([116 x i8], [116 x i8]* @__PRETTY_FUNCTION__._ZNK4llvm7VarInit12getFieldInitERNS_6RecordEPKNS_9RecordValERKSs, i32 0, i32 0)) noreturn 132*9880d681SAndroid Build Coastguard Worker unreachable 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workercond.end: ; preds = %if.end 135*9880d681SAndroid Build Coastguard Worker %9 = bitcast %"struct.llvm::Init"* %tmp2.i2 to %"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)*** ; <%"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)***> [#uses=1] 136*9880d681SAndroid Build Coastguard Worker %10 = load %"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)**, %"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)*** %9 ; <%"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)**> [#uses=1] 137*9880d681SAndroid Build Coastguard Worker %vfn = getelementptr inbounds %"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)*, %"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)** %10, i32 8 ; <%"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)**> [#uses=1] 138*9880d681SAndroid Build Coastguard Worker %11 = load %"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)*, %"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)** %vfn ; <%"struct.llvm::Init"* (%"struct.llvm::Init"*, %"class.llvm::Record"*, %"class.llvm::RecordVal"*, %"class.std::basic_string"*)*> [#uses=1] 139*9880d681SAndroid Build Coastguard Worker %call25 = tail call %"struct.llvm::Init"* %11(%"struct.llvm::Init"* %tmp2.i2, %"class.llvm::Record"* %R, %"class.llvm::RecordVal"* %RV, %"class.std::basic_string"* %FieldName) ; <%"struct.llvm::Init"*> [#uses=1] 140*9880d681SAndroid Build Coastguard Worker ret %"struct.llvm::Init"* %call25 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %.return_crit_edge1, %land.lhs.true.return_crit_edge, %_ZN4llvm6Record8getValueENS_9StringRefE.exit.return_crit_edge, %for.cond.i.return_crit_edge, %.return_crit_edge, %entry.return_crit_edge 143*9880d681SAndroid Build Coastguard Worker ret %"struct.llvm::Init"* null 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdeclare i1 @_ZNK4llvm7VarInit12getFieldInitERNS_6RecordEPKNS_9RecordValERKSs_for.cond.i(i32, %"class.llvm::RecordVal"*, i32, i8*, i32*) 147