1*09467b48Spatrick //===---- ReachingDefAnalysis.cpp - Reaching Def Analysis ---*- C++ -*-----===// 2*09467b48Spatrick // 3*09467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*09467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*09467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*09467b48Spatrick // 7*09467b48Spatrick //===----------------------------------------------------------------------===// 8*09467b48Spatrick 9*09467b48Spatrick #include "llvm/CodeGen/LivePhysRegs.h" 10*09467b48Spatrick #include "llvm/CodeGen/ReachingDefAnalysis.h" 11*09467b48Spatrick #include "llvm/CodeGen/TargetRegisterInfo.h" 12*09467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h" 13*09467b48Spatrick #include "llvm/Support/Debug.h" 14*09467b48Spatrick 15*09467b48Spatrick using namespace llvm; 16*09467b48Spatrick 17*09467b48Spatrick #define DEBUG_TYPE "reaching-deps-analysis" 18*09467b48Spatrick 19*09467b48Spatrick char ReachingDefAnalysis::ID = 0; 20*09467b48Spatrick INITIALIZE_PASS(ReachingDefAnalysis, DEBUG_TYPE, "ReachingDefAnalysis", false, 21*09467b48Spatrick true) 22*09467b48Spatrick 23*09467b48Spatrick void ReachingDefAnalysis::enterBasicBlock( 24*09467b48Spatrick const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 25*09467b48Spatrick 26*09467b48Spatrick MachineBasicBlock *MBB = TraversedMBB.MBB; 27*09467b48Spatrick unsigned MBBNumber = MBB->getNumber(); 28*09467b48Spatrick assert(MBBNumber < MBBReachingDefs.size() && 29*09467b48Spatrick "Unexpected basic block number."); 30*09467b48Spatrick MBBReachingDefs[MBBNumber].resize(NumRegUnits); 31*09467b48Spatrick 32*09467b48Spatrick // Reset instruction counter in each basic block. 33*09467b48Spatrick CurInstr = 0; 34*09467b48Spatrick 35*09467b48Spatrick // Set up LiveRegs to represent registers entering MBB. 36*09467b48Spatrick // Default values are 'nothing happened a long time ago'. 37*09467b48Spatrick if (LiveRegs.empty()) 38*09467b48Spatrick LiveRegs.assign(NumRegUnits, ReachingDefDefaultVal); 39*09467b48Spatrick 40*09467b48Spatrick // This is the entry block. 41*09467b48Spatrick if (MBB->pred_empty()) { 42*09467b48Spatrick for (const auto &LI : MBB->liveins()) { 43*09467b48Spatrick for (MCRegUnitIterator Unit(LI.PhysReg, TRI); Unit.isValid(); ++Unit) { 44*09467b48Spatrick // Treat function live-ins as if they were defined just before the first 45*09467b48Spatrick // instruction. Usually, function arguments are set up immediately 46*09467b48Spatrick // before the call. 47*09467b48Spatrick LiveRegs[*Unit] = -1; 48*09467b48Spatrick MBBReachingDefs[MBBNumber][*Unit].push_back(LiveRegs[*Unit]); 49*09467b48Spatrick } 50*09467b48Spatrick } 51*09467b48Spatrick LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n"); 52*09467b48Spatrick return; 53*09467b48Spatrick } 54*09467b48Spatrick 55*09467b48Spatrick // Try to coalesce live-out registers from predecessors. 56*09467b48Spatrick for (MachineBasicBlock *pred : MBB->predecessors()) { 57*09467b48Spatrick assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() && 58*09467b48Spatrick "Should have pre-allocated MBBInfos for all MBBs"); 59*09467b48Spatrick const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()]; 60*09467b48Spatrick // Incoming is null if this is a backedge from a BB 61*09467b48Spatrick // we haven't processed yet 62*09467b48Spatrick if (Incoming.empty()) 63*09467b48Spatrick continue; 64*09467b48Spatrick 65*09467b48Spatrick for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) { 66*09467b48Spatrick // Use the most recent predecessor def for each register. 67*09467b48Spatrick LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]); 68*09467b48Spatrick if ((LiveRegs[Unit] != ReachingDefDefaultVal)) 69*09467b48Spatrick MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]); 70*09467b48Spatrick } 71*09467b48Spatrick } 72*09467b48Spatrick 73*09467b48Spatrick LLVM_DEBUG(dbgs() << printMBBReference(*MBB) 74*09467b48Spatrick << (!TraversedMBB.IsDone ? ": incomplete\n" 75*09467b48Spatrick : ": all preds known\n")); 76*09467b48Spatrick } 77*09467b48Spatrick 78*09467b48Spatrick void ReachingDefAnalysis::leaveBasicBlock( 79*09467b48Spatrick const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 80*09467b48Spatrick assert(!LiveRegs.empty() && "Must enter basic block first."); 81*09467b48Spatrick unsigned MBBNumber = TraversedMBB.MBB->getNumber(); 82*09467b48Spatrick assert(MBBNumber < MBBOutRegsInfos.size() && 83*09467b48Spatrick "Unexpected basic block number."); 84*09467b48Spatrick // Save register clearances at end of MBB - used by enterBasicBlock(). 85*09467b48Spatrick MBBOutRegsInfos[MBBNumber] = LiveRegs; 86*09467b48Spatrick 87*09467b48Spatrick // While processing the basic block, we kept `Def` relative to the start 88*09467b48Spatrick // of the basic block for convenience. However, future use of this information 89*09467b48Spatrick // only cares about the clearance from the end of the block, so adjust 90*09467b48Spatrick // everything to be relative to the end of the basic block. 91*09467b48Spatrick for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber]) 92*09467b48Spatrick OutLiveReg -= CurInstr; 93*09467b48Spatrick LiveRegs.clear(); 94*09467b48Spatrick } 95*09467b48Spatrick 96*09467b48Spatrick void ReachingDefAnalysis::processDefs(MachineInstr *MI) { 97*09467b48Spatrick assert(!MI->isDebugInstr() && "Won't process debug instructions"); 98*09467b48Spatrick 99*09467b48Spatrick unsigned MBBNumber = MI->getParent()->getNumber(); 100*09467b48Spatrick assert(MBBNumber < MBBReachingDefs.size() && 101*09467b48Spatrick "Unexpected basic block number."); 102*09467b48Spatrick const MCInstrDesc &MCID = MI->getDesc(); 103*09467b48Spatrick for (unsigned i = 0, 104*09467b48Spatrick e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs(); 105*09467b48Spatrick i != e; ++i) { 106*09467b48Spatrick MachineOperand &MO = MI->getOperand(i); 107*09467b48Spatrick if (!MO.isReg() || !MO.getReg()) 108*09467b48Spatrick continue; 109*09467b48Spatrick if (MO.isUse()) 110*09467b48Spatrick continue; 111*09467b48Spatrick for (MCRegUnitIterator Unit(MO.getReg(), TRI); Unit.isValid(); ++Unit) { 112*09467b48Spatrick // This instruction explicitly defines the current reg unit. 113*09467b48Spatrick LLVM_DEBUG(dbgs() << printReg(MO.getReg(), TRI) << ":\t" << CurInstr 114*09467b48Spatrick << '\t' << *MI); 115*09467b48Spatrick 116*09467b48Spatrick // How many instructions since this reg unit was last written? 117*09467b48Spatrick LiveRegs[*Unit] = CurInstr; 118*09467b48Spatrick MBBReachingDefs[MBBNumber][*Unit].push_back(CurInstr); 119*09467b48Spatrick } 120*09467b48Spatrick } 121*09467b48Spatrick InstIds[MI] = CurInstr; 122*09467b48Spatrick ++CurInstr; 123*09467b48Spatrick } 124*09467b48Spatrick 125*09467b48Spatrick void ReachingDefAnalysis::processBasicBlock( 126*09467b48Spatrick const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 127*09467b48Spatrick enterBasicBlock(TraversedMBB); 128*09467b48Spatrick for (MachineInstr &MI : *TraversedMBB.MBB) { 129*09467b48Spatrick if (!MI.isDebugInstr()) 130*09467b48Spatrick processDefs(&MI); 131*09467b48Spatrick } 132*09467b48Spatrick leaveBasicBlock(TraversedMBB); 133*09467b48Spatrick } 134*09467b48Spatrick 135*09467b48Spatrick bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) { 136*09467b48Spatrick MF = &mf; 137*09467b48Spatrick TRI = MF->getSubtarget().getRegisterInfo(); 138*09467b48Spatrick 139*09467b48Spatrick LiveRegs.clear(); 140*09467b48Spatrick NumRegUnits = TRI->getNumRegUnits(); 141*09467b48Spatrick 142*09467b48Spatrick MBBReachingDefs.resize(mf.getNumBlockIDs()); 143*09467b48Spatrick 144*09467b48Spatrick LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n"); 145*09467b48Spatrick 146*09467b48Spatrick // Initialize the MBBOutRegsInfos 147*09467b48Spatrick MBBOutRegsInfos.resize(mf.getNumBlockIDs()); 148*09467b48Spatrick 149*09467b48Spatrick // Traverse the basic blocks. 150*09467b48Spatrick LoopTraversal Traversal; 151*09467b48Spatrick LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf); 152*09467b48Spatrick for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) { 153*09467b48Spatrick processBasicBlock(TraversedMBB); 154*09467b48Spatrick } 155*09467b48Spatrick 156*09467b48Spatrick // Sorting all reaching defs found for a ceartin reg unit in a given BB. 157*09467b48Spatrick for (MBBDefsInfo &MBBDefs : MBBReachingDefs) { 158*09467b48Spatrick for (MBBRegUnitDefs &RegUnitDefs : MBBDefs) 159*09467b48Spatrick llvm::sort(RegUnitDefs); 160*09467b48Spatrick } 161*09467b48Spatrick 162*09467b48Spatrick return false; 163*09467b48Spatrick } 164*09467b48Spatrick 165*09467b48Spatrick void ReachingDefAnalysis::releaseMemory() { 166*09467b48Spatrick // Clear the internal vectors. 167*09467b48Spatrick MBBOutRegsInfos.clear(); 168*09467b48Spatrick MBBReachingDefs.clear(); 169*09467b48Spatrick InstIds.clear(); 170*09467b48Spatrick } 171*09467b48Spatrick 172*09467b48Spatrick int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, int PhysReg) { 173*09467b48Spatrick assert(InstIds.count(MI) && "Unexpected machine instuction."); 174*09467b48Spatrick int InstId = InstIds[MI]; 175*09467b48Spatrick int DefRes = ReachingDefDefaultVal; 176*09467b48Spatrick unsigned MBBNumber = MI->getParent()->getNumber(); 177*09467b48Spatrick assert(MBBNumber < MBBReachingDefs.size() && 178*09467b48Spatrick "Unexpected basic block number."); 179*09467b48Spatrick int LatestDef = ReachingDefDefaultVal; 180*09467b48Spatrick for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) { 181*09467b48Spatrick for (int Def : MBBReachingDefs[MBBNumber][*Unit]) { 182*09467b48Spatrick if (Def >= InstId) 183*09467b48Spatrick break; 184*09467b48Spatrick DefRes = Def; 185*09467b48Spatrick } 186*09467b48Spatrick LatestDef = std::max(LatestDef, DefRes); 187*09467b48Spatrick } 188*09467b48Spatrick return LatestDef; 189*09467b48Spatrick } 190*09467b48Spatrick 191*09467b48Spatrick MachineInstr* ReachingDefAnalysis::getReachingMIDef(MachineInstr *MI, int PhysReg) { 192*09467b48Spatrick return getInstFromId(MI->getParent(), getReachingDef(MI, PhysReg)); 193*09467b48Spatrick } 194*09467b48Spatrick 195*09467b48Spatrick bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B, 196*09467b48Spatrick int PhysReg) { 197*09467b48Spatrick MachineBasicBlock *ParentA = A->getParent(); 198*09467b48Spatrick MachineBasicBlock *ParentB = B->getParent(); 199*09467b48Spatrick if (ParentA != ParentB) 200*09467b48Spatrick return false; 201*09467b48Spatrick 202*09467b48Spatrick return getReachingDef(A, PhysReg) == getReachingDef(B, PhysReg); 203*09467b48Spatrick } 204*09467b48Spatrick 205*09467b48Spatrick MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB, 206*09467b48Spatrick int InstId) { 207*09467b48Spatrick assert(static_cast<size_t>(MBB->getNumber()) < MBBReachingDefs.size() && 208*09467b48Spatrick "Unexpected basic block number."); 209*09467b48Spatrick assert(InstId < static_cast<int>(MBB->size()) && 210*09467b48Spatrick "Unexpected instruction id."); 211*09467b48Spatrick 212*09467b48Spatrick if (InstId < 0) 213*09467b48Spatrick return nullptr; 214*09467b48Spatrick 215*09467b48Spatrick for (auto &MI : *MBB) { 216*09467b48Spatrick if (InstIds.count(&MI) && InstIds[&MI] == InstId) 217*09467b48Spatrick return &MI; 218*09467b48Spatrick } 219*09467b48Spatrick return nullptr; 220*09467b48Spatrick } 221*09467b48Spatrick 222*09467b48Spatrick int ReachingDefAnalysis::getClearance(MachineInstr *MI, MCPhysReg PhysReg) { 223*09467b48Spatrick assert(InstIds.count(MI) && "Unexpected machine instuction."); 224*09467b48Spatrick return InstIds[MI] - getReachingDef(MI, PhysReg); 225*09467b48Spatrick } 226*09467b48Spatrick 227*09467b48Spatrick void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def, int PhysReg, 228*09467b48Spatrick SmallVectorImpl<MachineInstr*> &Uses) { 229*09467b48Spatrick MachineBasicBlock *MBB = Def->getParent(); 230*09467b48Spatrick MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def); 231*09467b48Spatrick while (++MI != MBB->end()) { 232*09467b48Spatrick // If/when we find a new reaching def, we know that there's no more uses 233*09467b48Spatrick // of 'Def'. 234*09467b48Spatrick if (getReachingMIDef(&*MI, PhysReg) != Def) 235*09467b48Spatrick return; 236*09467b48Spatrick 237*09467b48Spatrick for (auto &MO : MI->operands()) { 238*09467b48Spatrick if (!MO.isReg() || !MO.isUse() || MO.getReg() != PhysReg) 239*09467b48Spatrick continue; 240*09467b48Spatrick 241*09467b48Spatrick Uses.push_back(&*MI); 242*09467b48Spatrick if (MO.isKill()) 243*09467b48Spatrick return; 244*09467b48Spatrick } 245*09467b48Spatrick } 246*09467b48Spatrick } 247*09467b48Spatrick 248*09467b48Spatrick unsigned ReachingDefAnalysis::getNumUses(MachineInstr *Def, int PhysReg) { 249*09467b48Spatrick SmallVector<MachineInstr*, 4> Uses; 250*09467b48Spatrick getReachingLocalUses(Def, PhysReg, Uses); 251*09467b48Spatrick return Uses.size(); 252*09467b48Spatrick } 253*09467b48Spatrick 254*09467b48Spatrick bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI, int PhysReg) { 255*09467b48Spatrick MachineBasicBlock *MBB = MI->getParent(); 256*09467b48Spatrick LivePhysRegs LiveRegs(*TRI); 257*09467b48Spatrick LiveRegs.addLiveOuts(*MBB); 258*09467b48Spatrick 259*09467b48Spatrick // Yes if the register is live out of the basic block. 260*09467b48Spatrick if (LiveRegs.contains(PhysReg)) 261*09467b48Spatrick return true; 262*09467b48Spatrick 263*09467b48Spatrick // Walk backwards through the block to see if the register is live at some 264*09467b48Spatrick // point. 265*09467b48Spatrick for (auto Last = MBB->rbegin(), End = MBB->rend(); Last != End; ++Last) { 266*09467b48Spatrick LiveRegs.stepBackward(*Last); 267*09467b48Spatrick if (LiveRegs.contains(PhysReg)) 268*09467b48Spatrick return InstIds[&*Last] > InstIds[MI]; 269*09467b48Spatrick } 270*09467b48Spatrick return false; 271*09467b48Spatrick } 272*09467b48Spatrick 273*09467b48Spatrick bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI, int PhysReg) { 274*09467b48Spatrick MachineBasicBlock *MBB = MI->getParent(); 275*09467b48Spatrick LivePhysRegs LiveRegs(*TRI); 276*09467b48Spatrick LiveRegs.addLiveOuts(*MBB); 277*09467b48Spatrick if (!LiveRegs.contains(PhysReg)) 278*09467b48Spatrick return false; 279*09467b48Spatrick 280*09467b48Spatrick MachineInstr *Last = &MBB->back(); 281*09467b48Spatrick int Def = getReachingDef(MI, PhysReg); 282*09467b48Spatrick if (getReachingDef(Last, PhysReg) != Def) 283*09467b48Spatrick return false; 284*09467b48Spatrick 285*09467b48Spatrick // Finally check that the last instruction doesn't redefine the register. 286*09467b48Spatrick for (auto &MO : Last->operands()) 287*09467b48Spatrick if (MO.isReg() && MO.isDef() && MO.getReg() == PhysReg) 288*09467b48Spatrick return false; 289*09467b48Spatrick 290*09467b48Spatrick return true; 291*09467b48Spatrick } 292*09467b48Spatrick 293*09467b48Spatrick MachineInstr* ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB, 294*09467b48Spatrick int PhysReg) { 295*09467b48Spatrick LivePhysRegs LiveRegs(*TRI); 296*09467b48Spatrick LiveRegs.addLiveOuts(*MBB); 297*09467b48Spatrick if (!LiveRegs.contains(PhysReg)) 298*09467b48Spatrick return nullptr; 299*09467b48Spatrick 300*09467b48Spatrick MachineInstr *Last = &MBB->back(); 301*09467b48Spatrick int Def = getReachingDef(Last, PhysReg); 302*09467b48Spatrick for (auto &MO : Last->operands()) 303*09467b48Spatrick if (MO.isReg() && MO.isDef() && MO.getReg() == PhysReg) 304*09467b48Spatrick return Last; 305*09467b48Spatrick 306*09467b48Spatrick return Def < 0 ? nullptr : getInstFromId(MBB, Def); 307*09467b48Spatrick } 308*09467b48Spatrick 309*09467b48Spatrick MachineInstr *ReachingDefAnalysis::getInstWithUseBefore(MachineInstr *MI, 310*09467b48Spatrick int PhysReg) { 311*09467b48Spatrick auto I = MachineBasicBlock::reverse_iterator(MI); 312*09467b48Spatrick auto E = MI->getParent()->rend(); 313*09467b48Spatrick I++; 314*09467b48Spatrick 315*09467b48Spatrick for ( ; I != E; I++) 316*09467b48Spatrick for (auto &MO : I->operands()) 317*09467b48Spatrick if (MO.isReg() && MO.isUse() && MO.getReg() == PhysReg) 318*09467b48Spatrick return &*I; 319*09467b48Spatrick 320*09467b48Spatrick return nullptr; 321*09467b48Spatrick } 322*09467b48Spatrick 323*09467b48Spatrick void ReachingDefAnalysis::getAllInstWithUseBefore(MachineInstr *MI, 324*09467b48Spatrick int PhysReg, SmallVectorImpl<MachineInstr*> &Uses) { 325*09467b48Spatrick MachineInstr *Use = nullptr; 326*09467b48Spatrick MachineInstr *Pos = MI; 327*09467b48Spatrick 328*09467b48Spatrick while ((Use = getInstWithUseBefore(Pos, PhysReg))) { 329*09467b48Spatrick Uses.push_back(Use); 330*09467b48Spatrick Pos = Use; 331*09467b48Spatrick } 332*09467b48Spatrick } 333