@@ -18841,6 +18841,7 @@ static SDValue GetTLSADDR(SelectionDAG &DAG, SDValue Chain,
18841
18841
SDLoc dl(GA);
18842
18842
SDValue TGA;
18843
18843
bool UseTLSDESC = DAG.getTarget().useTLSDESC();
18844
+ SDValue Ret;
18844
18845
if (LocalDynamic && UseTLSDESC) {
18845
18846
TGA = DAG.getTargetExternalSymbol("_TLS_MODULE_BASE_", PtrVT, OperandFlags);
18846
18847
auto UI = TGA->use_begin();
@@ -18851,48 +18852,46 @@ static SDValue GetTLSADDR(SelectionDAG &DAG, SDValue Chain,
18851
18852
assert(TLSDescOp->getOpcode() == X86ISD::TLSDESC &&
18852
18853
"Unexpected TLSDESC DAG");
18853
18854
// CALLSEQ_END uses TGA via a chain and glue.
18854
- auto CallSeqEndOp = TLSDescOp->use_begin ();
18855
- assert(CallSeqEndOp->getOpcode() == ISD::CALLSEQ_END &&
18855
+ auto * CallSeqEndOp = TLSDescOp->getGluedUser ();
18856
+ assert(CallSeqEndOp && CallSeqEndOp ->getOpcode() == ISD::CALLSEQ_END &&
18856
18857
"Unexpected TLSDESC DAG");
18857
18858
// CopyFromReg uses CALLSEQ_END via a chain and glue.
18858
- auto CopyFromRegOp = CallSeqEndOp->use_begin ();
18859
- assert(CopyFromRegOp->getOpcode() == ISD::CopyFromReg &&
18859
+ auto * CopyFromRegOp = CallSeqEndOp->getGluedUser ();
18860
+ assert(CopyFromRegOp && CopyFromRegOp ->getOpcode() == ISD::CopyFromReg &&
18860
18861
"Unexpected TLSDESC DAG");
18861
- // The Add generated at the final return of this function uses
18862
- // CopyFromReg.
18863
- auto AddOp = CopyFromRegOp->use_begin();
18864
- assert(AddOp->getOpcode() == ISD::ADD && "Unexpected TLSDESC DAG");
18865
- return SDValue(*AddOp, 0);
18862
+ Ret = SDValue(CopyFromRegOp, 0);
18866
18863
}
18867
18864
} else {
18868
18865
TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, GA->getValueType(0),
18869
18866
GA->getOffset(), OperandFlags);
18870
18867
}
18871
18868
18872
- X86ISD::NodeType CallType = UseTLSDESC ? X86ISD::TLSDESC
18873
- : LocalDynamic ? X86ISD::TLSBASEADDR
18874
- : X86ISD::TLSADDR;
18875
-
18876
- Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
18877
- if (LoadGlobalBaseReg) {
18878
- SDValue InGlue;
18879
- Chain =
18880
- DAG.getCopyToReg(Chain, dl, X86::EBX,
18881
- DAG.getNode(X86ISD::GlobalBaseReg, dl, PtrVT), InGlue);
18882
- InGlue = Chain.getValue(1);
18883
- SDValue Ops[] = {Chain, TGA, InGlue};
18884
- Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18885
- } else {
18886
- SDValue Ops[] = {Chain, TGA};
18887
- Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18888
- }
18889
- Chain = DAG.getCALLSEQ_END(Chain, 0, 0, Chain.getValue(1), dl);
18869
+ if (!Ret) {
18870
+ X86ISD::NodeType CallType = UseTLSDESC ? X86ISD::TLSDESC
18871
+ : LocalDynamic ? X86ISD::TLSBASEADDR
18872
+ : X86ISD::TLSADDR;
18873
+
18874
+ Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
18875
+ if (LoadGlobalBaseReg) {
18876
+ SDValue InGlue;
18877
+ Chain = DAG.getCopyToReg(Chain, dl, X86::EBX,
18878
+ DAG.getNode(X86ISD::GlobalBaseReg, dl, PtrVT),
18879
+ InGlue);
18880
+ InGlue = Chain.getValue(1);
18881
+ SDValue Ops[] = {Chain, TGA, InGlue};
18882
+ Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18883
+ } else {
18884
+ SDValue Ops[] = {Chain, TGA};
18885
+ Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18886
+ }
18887
+ Chain = DAG.getCALLSEQ_END(Chain, 0, 0, Chain.getValue(1), dl);
18890
18888
18891
- // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
18892
- MFI.setHasCalls(true);
18889
+ // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
18890
+ MFI.setHasCalls(true);
18893
18891
18894
- SDValue Glue = Chain.getValue(1);
18895
- SDValue Ret = DAG.getCopyFromReg(Chain, dl, ReturnReg, PtrVT, Glue);
18892
+ SDValue Glue = Chain.getValue(1);
18893
+ Ret = DAG.getCopyFromReg(Chain, dl, ReturnReg, PtrVT, Glue);
18894
+ }
18896
18895
18897
18896
if (!UseTLSDESC)
18898
18897
return Ret;
0 commit comments