1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===-- AArch64CleanupLocalDynamicTLSPass.cpp ---------------------*- C++ -*-=// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Local-dynamic access to thread-local variables proceeds in three stages. 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1. The offset of this Module's thread-local area from TPIDR_EL0 is calculated 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// in much the same way as a general-dynamic TLS-descriptor access against 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// the special symbol _TLS_MODULE_BASE. 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 2. The variable's offset from _TLS_MODULE_BASE_ is calculated using 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// instructions with "dtprel" modifiers. 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 3. These two are added, together with TPIDR_EL0, to obtain the variable's 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// true address. 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This is only better than general-dynamic access to the variable if two or 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// more of the first stage TLS-descriptor calculations can be combined. This 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// pass looks through a function and performs such combinations. 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AArch64.h" 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AArch64InstrInfo.h" 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AArch64MachineFunctionInfo.h" 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AArch64TargetMachine.h" 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineDominators.h" 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunction.h" 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineFunctionPass.h" 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineInstrBuilder.h" 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/MachineRegisterInfo.h" 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace { 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct LDTLSCleanup : public MachineFunctionPass { 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static char ID; 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LDTLSCleanup() : MachineFunctionPass(ID) {} 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool runOnMachineFunction(MachineFunction &MF) override { 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>(); 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (AFI->getNumLocalDynamicTLSAccesses() < 2) { 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // No point folding accesses if there isn't at least two. 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineDominatorTree *DT = &getAnalysis<MachineDominatorTree>(); 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return VisitNode(DT->getRootNode(), 0); 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Visit the dominator subtree rooted at Node in pre-order. 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If TLSBaseAddrReg is non-null, then use that to replace any 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // TLS_base_addr instructions. Otherwise, create the register 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // when the first such instruction is seen, and then use it 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // as we encounter more instructions. 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool VisitNode(MachineDomTreeNode *Node, unsigned TLSBaseAddrReg) { 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock *BB = Node->getBlock(); 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool Changed = false; 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Traverse the current block. 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (MachineBasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ++I) { 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (I->getOpcode()) { 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case AArch64::TLSDESC_BLR: 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Make sure it's a local dynamic access. 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!I->getOperand(1).isSymbol() || 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines strcmp(I->getOperand(1).getSymbolName(), "_TLS_MODULE_BASE_")) 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (TLSBaseAddrReg) 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines I = replaceTLSBaseAddrCall(I, TLSBaseAddrReg); 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines I = setRegister(I, &TLSBaseAddrReg); 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Changed = true; 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Visit the children of this block in the dominator tree. 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (MachineDomTreeNode *N : *Node) { 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Changed |= VisitNode(N, TLSBaseAddrReg); 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Changed; 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Replace the TLS_base_addr instruction I with a copy from 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // TLSBaseAddrReg, returning the new instruction. 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *replaceTLSBaseAddrCall(MachineInstr *I, 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned TLSBaseAddrReg) { 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineFunction *MF = I->getParent()->getParent(); 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const AArch64TargetMachine *TM = 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static_cast<const AArch64TargetMachine *>(&MF->getTarget()); 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const AArch64InstrInfo *TII = TM->getInstrInfo(); 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Insert a Copy from TLSBaseAddrReg to x0, which is where the rest of the 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // code sequence assumes the address will be. 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineInstr *Copy = BuildMI(*I->getParent(), I, I->getDebugLoc(), 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TII->get(TargetOpcode::COPY), 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64::X0).addReg(TLSBaseAddrReg); 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Erase the TLS_base_addr instruction. 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines I->eraseFromParent(); 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Copy; 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Create a virtal register in *TLSBaseAddrReg, and populate it by 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // inserting a copy instruction after I. Returns the new instruction. 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *setRegister(MachineInstr *I, unsigned *TLSBaseAddrReg) { 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineFunction *MF = I->getParent()->getParent(); 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const AArch64TargetMachine *TM = 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static_cast<const AArch64TargetMachine *>(&MF->getTarget()); 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const AArch64InstrInfo *TII = TM->getInstrInfo(); 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Create a virtual register for the TLS base address. 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineRegisterInfo &RegInfo = MF->getRegInfo(); 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines *TLSBaseAddrReg = RegInfo.createVirtualRegister(&AArch64::GPR64RegClass); 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Insert a copy from X0 to TLSBaseAddrReg for later. 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *Next = I->getNextNode(); 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineInstr *Copy = BuildMI(*I->getParent(), Next, I->getDebugLoc(), 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TII->get(TargetOpcode::COPY), 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines *TLSBaseAddrReg).addReg(AArch64::X0); 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Copy; 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *getPassName() const override { 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return "Local Dynamic TLS Access Clean-up"; 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AU.setPreservesCFG(); 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AU.addRequired<MachineDominatorTree>(); 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineFunctionPass::getAnalysisUsage(AU); 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar LDTLSCleanup::ID = 0; 145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesFunctionPass *llvm::createAArch64CleanupLocalDynamicTLSPass() { 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new LDTLSCleanup(); 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 148