Skip to content

Commit 79abe3e

Browse files
committed
fixup! fixup! [X86] Insert CALLSEQ when lowering GlobalTLSAddress for ELF targets
Reorganize how previously generated TLS base addresses are reused
1 parent 1a33a3a commit 79abe3e

File tree

1 file changed

+30
-31
lines changed

1 file changed

+30
-31
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18841,6 +18841,7 @@ static SDValue GetTLSADDR(SelectionDAG &DAG, SDValue Chain,
1884118841
SDLoc dl(GA);
1884218842
SDValue TGA;
1884318843
bool UseTLSDESC = DAG.getTarget().useTLSDESC();
18844+
SDValue Ret;
1884418845
if (LocalDynamic && UseTLSDESC) {
1884518846
TGA = DAG.getTargetExternalSymbol("_TLS_MODULE_BASE_", PtrVT, OperandFlags);
1884618847
auto UI = TGA->use_begin();
@@ -18851,48 +18852,46 @@ static SDValue GetTLSADDR(SelectionDAG &DAG, SDValue Chain,
1885118852
assert(TLSDescOp->getOpcode() == X86ISD::TLSDESC &&
1885218853
"Unexpected TLSDESC DAG");
1885318854
// 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 &&
1885618857
"Unexpected TLSDESC DAG");
1885718858
// 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 &&
1886018861
"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);
1886618863
}
1886718864
} else {
1886818865
TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, GA->getValueType(0),
1886918866
GA->getOffset(), OperandFlags);
1887018867
}
1887118868

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);
1889018888

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);
1889318891

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+
}
1889618895

1889718896
if (!UseTLSDESC)
1889818897
return Ret;

0 commit comments

Comments
 (0)