@@ -18831,44 +18831,66 @@ X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
1883118831 return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
1883218832}
1883318833
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) {
1883818839 MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
1883918840 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
1884018841 SDLoc dl(GA);
1884118842 SDValue TGA;
1884218843 bool UseTLSDESC = DAG.getTarget().useTLSDESC();
18844+ SDValue Chain = DAG.getEntryNode();
18845+ SDValue Ret;
1884318846 if (LocalDynamic && UseTLSDESC) {
1884418847 TGA = DAG.getTargetExternalSymbol("_TLS_MODULE_BASE_", PtrVT, OperandFlags);
1884518848 auto UI = TGA->use_begin();
1884618849 // 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+ }
1884918865 } else {
1885018866 TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, GA->getValueType(0),
1885118867 GA->getOffset(), OperandFlags);
1885218868 }
1885318869
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;
1885718874
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);
1886518887
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);
1886918890
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+ }
1887218894
1887318895 if (!UseTLSDESC)
1887418896 return Ret;
@@ -18887,30 +18909,22 @@ GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
1888718909static SDValue
1888818910LowerToTLSGeneralDynamicModel32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
1888918911 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);
1889818914}
1889918915
1890018916// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit LP64
1890118917static SDValue
1890218918LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
1890318919 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);
1890618921}
1890718922
1890818923// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit ILP32
1890918924static SDValue
1891018925LowerToTLSGeneralDynamicModelX32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
1891118926 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);
1891418928}
1891518929
1891618930static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
@@ -18919,22 +18933,20 @@ static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
1891918933 SDLoc dl(GA);
1892018934
1892118935 // 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>();
1892418938 MFI->incNumLocalDynamicTLSAccesses();
1892518939
1892618940 SDValue Base;
1892718941 if (Is64Bit) {
1892818942 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);
1893118946 } 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);
1893818950 }
1893918951
1894018952 // Note: the CleanupLocalDynamicTLSPass will remove redundant computations
@@ -36059,36 +36071,6 @@ X86TargetLowering::EmitLoweredCatchRet(MachineInstr &MI,
3605936071 return BB;
3606036072}
3606136073
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-
3609236074MachineBasicBlock *
3609336075X86TargetLowering::EmitLoweredTLSCall(MachineInstr &MI,
3609436076 MachineBasicBlock *BB) const {
@@ -37091,16 +37073,8 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
3709137073 return X86::TMM0_TMM1 + Imm / 2;
3709237074 };
3709337075 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");
3710437078 case X86::INDIRECT_THUNK_CALL32:
3710537079 case X86::INDIRECT_THUNK_CALL64:
3710637080 case X86::INDIRECT_THUNK_TCRETURN32:
0 commit comments