@@ -18831,44 +18831,66 @@ X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
18831
18831
return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
18832
18832
}
18833
18833
18834
- static SDValue
18835
- GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18836
- SDValue *InGlue, const EVT PtrVT, unsigned ReturnReg,
18837
- unsigned char OperandFlags, bool LocalDynamic = false) {
18834
+ static SDValue GetTLSADDR(SelectionDAG &DAG, GlobalAddressSDNode *GA,
18835
+ const EVT PtrVT, unsigned ReturnReg,
18836
+ unsigned char OperandFlags,
18837
+ bool LoadGlobalBaseReg = false,
18838
+ bool LocalDynamic = false) {
18838
18839
MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
18839
18840
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
18840
18841
SDLoc dl(GA);
18841
18842
SDValue TGA;
18842
18843
bool UseTLSDESC = DAG.getTarget().useTLSDESC();
18844
+ SDValue Chain = DAG.getEntryNode();
18845
+ SDValue Ret;
18843
18846
if (LocalDynamic && UseTLSDESC) {
18844
18847
TGA = DAG.getTargetExternalSymbol("_TLS_MODULE_BASE_", PtrVT, OperandFlags);
18845
18848
auto UI = TGA->use_begin();
18846
18849
// Reuse existing GetTLSADDR node if we can find it.
18847
- if (UI != TGA->use_end())
18848
- return SDValue(*UI->use_begin()->use_begin(), 0);
18850
+ if (UI != TGA->use_end()) {
18851
+ // TLSDESC uses TGA.
18852
+ auto TLSDescOp = UI;
18853
+ assert(TLSDescOp->getOpcode() == X86ISD::TLSDESC &&
18854
+ "Unexpected TLSDESC DAG");
18855
+ // CALLSEQ_END uses TGA via a chain and glue.
18856
+ auto *CallSeqEndOp = TLSDescOp->getGluedUser();
18857
+ assert(CallSeqEndOp && CallSeqEndOp->getOpcode() == ISD::CALLSEQ_END &&
18858
+ "Unexpected TLSDESC DAG");
18859
+ // CopyFromReg uses CALLSEQ_END via a chain and glue.
18860
+ auto *CopyFromRegOp = CallSeqEndOp->getGluedUser();
18861
+ assert(CopyFromRegOp && CopyFromRegOp->getOpcode() == ISD::CopyFromReg &&
18862
+ "Unexpected TLSDESC DAG");
18863
+ Ret = SDValue(CopyFromRegOp, 0);
18864
+ }
18849
18865
} else {
18850
18866
TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, GA->getValueType(0),
18851
18867
GA->getOffset(), OperandFlags);
18852
18868
}
18853
18869
18854
- X86ISD::NodeType CallType = UseTLSDESC ? X86ISD::TLSDESC
18855
- : LocalDynamic ? X86ISD::TLSBASEADDR
18856
- : X86ISD::TLSADDR;
18870
+ if (!Ret) {
18871
+ X86ISD::NodeType CallType = UseTLSDESC ? X86ISD::TLSDESC
18872
+ : LocalDynamic ? X86ISD::TLSBASEADDR
18873
+ : X86ISD::TLSADDR;
18857
18874
18858
- if (InGlue) {
18859
- SDValue Ops[] = { Chain, TGA, *InGlue };
18860
- Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18861
- } else {
18862
- SDValue Ops[] = { Chain, TGA };
18863
- Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18864
- }
18875
+ Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
18876
+ if (LoadGlobalBaseReg) {
18877
+ SDValue InGlue;
18878
+ Chain = DAG.getCopyToReg(Chain, dl, X86::EBX,
18879
+ DAG.getNode(X86ISD::GlobalBaseReg, dl, PtrVT),
18880
+ InGlue);
18881
+ InGlue = Chain.getValue(1);
18882
+ Chain = DAG.getNode(CallType, dl, NodeTys, {Chain, TGA, InGlue});
18883
+ } else {
18884
+ Chain = DAG.getNode(CallType, dl, NodeTys, {Chain, TGA});
18885
+ }
18886
+ Chain = DAG.getCALLSEQ_END(Chain, 0, 0, Chain.getValue(1), dl);
18865
18887
18866
- // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
18867
- MFI.setAdjustsStack(true);
18868
- MFI.setHasCalls(true);
18888
+ // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
18889
+ MFI.setHasCalls(true);
18869
18890
18870
- SDValue Glue = Chain.getValue(1);
18871
- SDValue Ret = DAG.getCopyFromReg(Chain, dl, ReturnReg, PtrVT, Glue);
18891
+ SDValue Glue = Chain.getValue(1);
18892
+ Ret = DAG.getCopyFromReg(Chain, dl, ReturnReg, PtrVT, Glue);
18893
+ }
18872
18894
18873
18895
if (!UseTLSDESC)
18874
18896
return Ret;
@@ -18887,30 +18909,22 @@ GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18887
18909
static SDValue
18888
18910
LowerToTLSGeneralDynamicModel32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18889
18911
const EVT PtrVT) {
18890
- SDValue InGlue;
18891
- SDLoc dl(GA); // ? function entry point might be better
18892
- SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
18893
- DAG.getNode(X86ISD::GlobalBaseReg,
18894
- SDLoc(), PtrVT), InGlue);
18895
- InGlue = Chain.getValue(1);
18896
-
18897
- return GetTLSADDR(DAG, Chain, GA, &InGlue, PtrVT, X86::EAX, X86II::MO_TLSGD);
18912
+ return GetTLSADDR(DAG, GA, PtrVT, X86::EAX, X86II::MO_TLSGD,
18913
+ /*LoadGlobalBaseReg=*/true);
18898
18914
}
18899
18915
18900
18916
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit LP64
18901
18917
static SDValue
18902
18918
LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18903
18919
const EVT PtrVT) {
18904
- return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT,
18905
- X86::RAX, X86II::MO_TLSGD);
18920
+ return GetTLSADDR(DAG, GA, PtrVT, X86::RAX, X86II::MO_TLSGD);
18906
18921
}
18907
18922
18908
18923
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit ILP32
18909
18924
static SDValue
18910
18925
LowerToTLSGeneralDynamicModelX32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18911
18926
const EVT PtrVT) {
18912
- return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT,
18913
- X86::EAX, X86II::MO_TLSGD);
18927
+ return GetTLSADDR(DAG, GA, PtrVT, X86::EAX, X86II::MO_TLSGD);
18914
18928
}
18915
18929
18916
18930
static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
@@ -18919,22 +18933,20 @@ static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
18919
18933
SDLoc dl(GA);
18920
18934
18921
18935
// Get the start address of the TLS block for this module.
18922
- X86MachineFunctionInfo *MFI = DAG.getMachineFunction()
18923
- .getInfo<X86MachineFunctionInfo>();
18936
+ X86MachineFunctionInfo *MFI =
18937
+ DAG.getMachineFunction() .getInfo<X86MachineFunctionInfo>();
18924
18938
MFI->incNumLocalDynamicTLSAccesses();
18925
18939
18926
18940
SDValue Base;
18927
18941
if (Is64Bit) {
18928
18942
unsigned ReturnReg = Is64BitLP64 ? X86::RAX : X86::EAX;
18929
- Base = GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT, ReturnReg,
18930
- X86II::MO_TLSLD, /*LocalDynamic=*/true);
18943
+ Base = GetTLSADDR(DAG, GA, PtrVT, ReturnReg, X86II::MO_TLSLD,
18944
+ /*LoadGlobalBaseReg=*/false,
18945
+ /*LocalDynamic=*/true);
18931
18946
} else {
18932
- SDValue InGlue;
18933
- SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
18934
- DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT), InGlue);
18935
- InGlue = Chain.getValue(1);
18936
- Base = GetTLSADDR(DAG, Chain, GA, &InGlue, PtrVT, X86::EAX,
18937
- X86II::MO_TLSLDM, /*LocalDynamic=*/true);
18947
+ Base = GetTLSADDR(DAG, GA, PtrVT, X86::EAX, X86II::MO_TLSLDM,
18948
+ /*LoadGlobalBaseReg=*/true,
18949
+ /*LocalDynamic=*/true);
18938
18950
}
18939
18951
18940
18952
// Note: the CleanupLocalDynamicTLSPass will remove redundant computations
@@ -36059,36 +36071,6 @@ X86TargetLowering::EmitLoweredCatchRet(MachineInstr &MI,
36059
36071
return BB;
36060
36072
}
36061
36073
36062
- MachineBasicBlock *
36063
- X86TargetLowering::EmitLoweredTLSAddr(MachineInstr &MI,
36064
- MachineBasicBlock *BB) const {
36065
- // So, here we replace TLSADDR with the sequence:
36066
- // adjust_stackdown -> TLSADDR -> adjust_stackup.
36067
- // We need this because TLSADDR is lowered into calls
36068
- // inside MC, therefore without the two markers shrink-wrapping
36069
- // may push the prologue/epilogue pass them.
36070
- const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
36071
- const MIMetadata MIMD(MI);
36072
- MachineFunction &MF = *BB->getParent();
36073
-
36074
- // Emit CALLSEQ_START right before the instruction.
36075
- MF.getFrameInfo().setAdjustsStack(true);
36076
- unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
36077
- MachineInstrBuilder CallseqStart =
36078
- BuildMI(MF, MIMD, TII.get(AdjStackDown)).addImm(0).addImm(0).addImm(0);
36079
- BB->insert(MachineBasicBlock::iterator(MI), CallseqStart);
36080
-
36081
- // Emit CALLSEQ_END right after the instruction.
36082
- // We don't call erase from parent because we want to keep the
36083
- // original instruction around.
36084
- unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
36085
- MachineInstrBuilder CallseqEnd =
36086
- BuildMI(MF, MIMD, TII.get(AdjStackUp)).addImm(0).addImm(0);
36087
- BB->insertAfter(MachineBasicBlock::iterator(MI), CallseqEnd);
36088
-
36089
- return BB;
36090
- }
36091
-
36092
36074
MachineBasicBlock *
36093
36075
X86TargetLowering::EmitLoweredTLSCall(MachineInstr &MI,
36094
36076
MachineBasicBlock *BB) const {
@@ -37091,16 +37073,8 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
37091
37073
return X86::TMM0_TMM1 + Imm / 2;
37092
37074
};
37093
37075
switch (MI.getOpcode()) {
37094
- default: llvm_unreachable("Unexpected instr type to insert");
37095
- case X86::TLS_addr32:
37096
- case X86::TLS_addr64:
37097
- case X86::TLS_addrX32:
37098
- case X86::TLS_base_addr32:
37099
- case X86::TLS_base_addr64:
37100
- case X86::TLS_base_addrX32:
37101
- case X86::TLS_desc32:
37102
- case X86::TLS_desc64:
37103
- return EmitLoweredTLSAddr(MI, BB);
37076
+ default:
37077
+ llvm_unreachable("Unexpected instr type to insert");
37104
37078
case X86::INDIRECT_THUNK_CALL32:
37105
37079
case X86::INDIRECT_THUNK_CALL64:
37106
37080
case X86::INDIRECT_THUNK_TCRETURN32:
0 commit comments