@@ -18828,10 +18828,11 @@ X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
18828
18828
return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
18829
18829
}
18830
18830
18831
- static SDValue
18832
- GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18833
- SDValue *InGlue, const EVT PtrVT, unsigned ReturnReg,
18834
- unsigned char OperandFlags, bool LocalDynamic = false) {
18831
+ static SDValue GetTLSADDR(SelectionDAG &DAG, SDValue Chain,
18832
+ GlobalAddressSDNode *GA, const EVT PtrVT,
18833
+ unsigned ReturnReg, unsigned char OperandFlags,
18834
+ bool LoadGlobalBaseReg = false,
18835
+ bool LocalDynamic = false) {
18835
18836
MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
18836
18837
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
18837
18838
SDLoc dl(GA);
@@ -18841,8 +18842,25 @@ GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18841
18842
TGA = DAG.getTargetExternalSymbol("_TLS_MODULE_BASE_", PtrVT, OperandFlags);
18842
18843
auto UI = TGA->use_begin();
18843
18844
// Reuse existing GetTLSADDR node if we can find it.
18844
- if (UI != TGA->use_end())
18845
- return SDValue(*UI->use_begin()->use_begin(), 0);
18845
+ if (UI != TGA->use_end()) {
18846
+ // TLSDESC uses TGA.
18847
+ auto TLSDescOp = UI;
18848
+ assert(TLSDescOp->getOpcode() == X86ISD::TLSDESC &&
18849
+ "Unexpected TLSDESC DAG");
18850
+ // CALLSEQ_END uses TGA via a chain and glue.
18851
+ auto CallSeqEndOp = TLSDescOp->use_begin();
18852
+ assert(CallSeqEndOp->getOpcode() == ISD::CALLSEQ_END &&
18853
+ "Unexpected TLSDESC DAG");
18854
+ // CopyFromReg uses CALLSEQ_END via a chain and glue.
18855
+ auto CopyFromRegOp = CallSeqEndOp->use_begin();
18856
+ assert(CopyFromRegOp->getOpcode() == ISD::CopyFromReg &&
18857
+ "Unexpected TLSDESC DAG");
18858
+ // The Add generated at the final return of this function uses
18859
+ // CopyFromReg.
18860
+ auto AddOp = CopyFromRegOp->use_begin();
18861
+ assert(AddOp->getOpcode() == ISD::ADD && "Unexpected TLSDESC DAG");
18862
+ return SDValue(*AddOp, 0);
18863
+ }
18846
18864
} else {
18847
18865
TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, GA->getValueType(0),
18848
18866
GA->getOffset(), OperandFlags);
@@ -18852,13 +18870,20 @@ GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18852
18870
: LocalDynamic ? X86ISD::TLSBASEADDR
18853
18871
: X86ISD::TLSADDR;
18854
18872
18855
- if (InGlue) {
18856
- SDValue Ops[] = { Chain, TGA, *InGlue };
18873
+ Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
18874
+ if (LoadGlobalBaseReg) {
18875
+ SDValue InGlue;
18876
+ Chain = DAG.getCopyToReg(Chain, dl, X86::EBX,
18877
+ DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT),
18878
+ InGlue);
18879
+ InGlue = Chain.getValue(1);
18880
+ SDValue Ops[] = {Chain, TGA, InGlue};
18857
18881
Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18858
18882
} else {
18859
- SDValue Ops[] = { Chain, TGA };
18883
+ SDValue Ops[] = {Chain, TGA};
18860
18884
Chain = DAG.getNode(CallType, dl, NodeTys, Ops);
18861
18885
}
18886
+ Chain = DAG.getCALLSEQ_END(Chain, 0, 0, Chain.getValue(1), dl);
18862
18887
18863
18888
// TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
18864
18889
MFI.setAdjustsStack(true);
@@ -18884,30 +18909,24 @@ GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18884
18909
static SDValue
18885
18910
LowerToTLSGeneralDynamicModel32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18886
18911
const EVT PtrVT) {
18887
- SDValue InGlue;
18888
- SDLoc dl(GA); // ? function entry point might be better
18889
- SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
18890
- DAG.getNode(X86ISD::GlobalBaseReg,
18891
- SDLoc(), PtrVT), InGlue);
18892
- InGlue = Chain.getValue(1);
18893
-
18894
- return GetTLSADDR(DAG, Chain, GA, &InGlue, PtrVT, X86::EAX, X86II::MO_TLSGD);
18912
+ return GetTLSADDR(DAG, DAG.getEntryNode(), GA, PtrVT, X86::EAX,
18913
+ X86II::MO_TLSGD, /*LoadGlobalBaseReg=*/true);
18895
18914
}
18896
18915
18897
18916
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit LP64
18898
18917
static SDValue
18899
18918
LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18900
18919
const EVT PtrVT) {
18901
- return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT ,
18902
- X86::RAX, X86II::MO_TLSGD);
18920
+ return GetTLSADDR(DAG, DAG.getEntryNode(), GA, PtrVT, X86::RAX ,
18921
+ X86II::MO_TLSGD);
18903
18922
}
18904
18923
18905
18924
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit ILP32
18906
18925
static SDValue
18907
18926
LowerToTLSGeneralDynamicModelX32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18908
18927
const EVT PtrVT) {
18909
- return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT ,
18910
- X86::EAX, X86II::MO_TLSGD);
18928
+ return GetTLSADDR(DAG, DAG.getEntryNode(), GA, PtrVT, X86::EAX ,
18929
+ X86II::MO_TLSGD);
18911
18930
}
18912
18931
18913
18932
static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
@@ -18916,22 +18935,20 @@ static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
18916
18935
SDLoc dl(GA);
18917
18936
18918
18937
// Get the start address of the TLS block for this module.
18919
- X86MachineFunctionInfo *MFI = DAG.getMachineFunction()
18920
- .getInfo<X86MachineFunctionInfo>();
18938
+ X86MachineFunctionInfo *MFI =
18939
+ DAG.getMachineFunction() .getInfo<X86MachineFunctionInfo>();
18921
18940
MFI->incNumLocalDynamicTLSAccesses();
18922
18941
18923
18942
SDValue Base;
18924
18943
if (Is64Bit) {
18925
18944
unsigned ReturnReg = Is64BitLP64 ? X86::RAX : X86::EAX;
18926
- Base = GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT, ReturnReg,
18927
- X86II::MO_TLSLD, /*LocalDynamic=*/true);
18945
+ Base = GetTLSADDR(DAG, DAG.getEntryNode(), GA, PtrVT, ReturnReg,
18946
+ X86II::MO_TLSLD, /*LoadGlobalBaseReg=*/false,
18947
+ /*LocalDynamic=*/true);
18928
18948
} else {
18929
- SDValue InGlue;
18930
- SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
18931
- DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT), InGlue);
18932
- InGlue = Chain.getValue(1);
18933
- Base = GetTLSADDR(DAG, Chain, GA, &InGlue, PtrVT, X86::EAX,
18934
- X86II::MO_TLSLDM, /*LocalDynamic=*/true);
18949
+ Base = GetTLSADDR(DAG, DAG.getEntryNode(), GA, PtrVT, X86::EAX,
18950
+ X86II::MO_TLSLDM, /*LoadGlobalBaseReg=*/true,
18951
+ /*LocalDynamic=*/true);
18935
18952
}
18936
18953
18937
18954
// Note: the CleanupLocalDynamicTLSPass will remove redundant computations
@@ -36002,36 +36019,6 @@ X86TargetLowering::EmitLoweredCatchRet(MachineInstr &MI,
36002
36019
return BB;
36003
36020
}
36004
36021
36005
- MachineBasicBlock *
36006
- X86TargetLowering::EmitLoweredTLSAddr(MachineInstr &MI,
36007
- MachineBasicBlock *BB) const {
36008
- // So, here we replace TLSADDR with the sequence:
36009
- // adjust_stackdown -> TLSADDR -> adjust_stackup.
36010
- // We need this because TLSADDR is lowered into calls
36011
- // inside MC, therefore without the two markers shrink-wrapping
36012
- // may push the prologue/epilogue pass them.
36013
- const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
36014
- const MIMetadata MIMD(MI);
36015
- MachineFunction &MF = *BB->getParent();
36016
-
36017
- // Emit CALLSEQ_START right before the instruction.
36018
- MF.getFrameInfo().setAdjustsStack(true);
36019
- unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
36020
- MachineInstrBuilder CallseqStart =
36021
- BuildMI(MF, MIMD, TII.get(AdjStackDown)).addImm(0).addImm(0).addImm(0);
36022
- BB->insert(MachineBasicBlock::iterator(MI), CallseqStart);
36023
-
36024
- // Emit CALLSEQ_END right after the instruction.
36025
- // We don't call erase from parent because we want to keep the
36026
- // original instruction around.
36027
- unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
36028
- MachineInstrBuilder CallseqEnd =
36029
- BuildMI(MF, MIMD, TII.get(AdjStackUp)).addImm(0).addImm(0);
36030
- BB->insertAfter(MachineBasicBlock::iterator(MI), CallseqEnd);
36031
-
36032
- return BB;
36033
- }
36034
-
36035
36022
MachineBasicBlock *
36036
36023
X86TargetLowering::EmitLoweredTLSCall(MachineInstr &MI,
36037
36024
MachineBasicBlock *BB) const {
@@ -37030,16 +37017,8 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
37030
37017
return X86::TMM0 + Imm;
37031
37018
};
37032
37019
switch (MI.getOpcode()) {
37033
- default: llvm_unreachable("Unexpected instr type to insert");
37034
- case X86::TLS_addr32:
37035
- case X86::TLS_addr64:
37036
- case X86::TLS_addrX32:
37037
- case X86::TLS_base_addr32:
37038
- case X86::TLS_base_addr64:
37039
- case X86::TLS_base_addrX32:
37040
- case X86::TLS_desc32:
37041
- case X86::TLS_desc64:
37042
- return EmitLoweredTLSAddr(MI, BB);
37020
+ default:
37021
+ llvm_unreachable("Unexpected instr type to insert");
37043
37022
case X86::INDIRECT_THUNK_CALL32:
37044
37023
case X86::INDIRECT_THUNK_CALL64:
37045
37024
case X86::INDIRECT_THUNK_TCRETURN32:
0 commit comments