109467b48Spatrick //===---- ReachingDefAnalysis.cpp - Reaching Def Analysis ---*- C++ -*-----===// 209467b48Spatrick // 309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609467b48Spatrick // 709467b48Spatrick //===----------------------------------------------------------------------===// 809467b48Spatrick 9097a140dSpatrick #include "llvm/ADT/SmallSet.h" 10*73471bf0Spatrick #include "llvm/ADT/SetOperations.h" 1109467b48Spatrick #include "llvm/CodeGen/LivePhysRegs.h" 1209467b48Spatrick #include "llvm/CodeGen/ReachingDefAnalysis.h" 1309467b48Spatrick #include "llvm/CodeGen/TargetRegisterInfo.h" 1409467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h" 1509467b48Spatrick #include "llvm/Support/Debug.h" 1609467b48Spatrick 1709467b48Spatrick using namespace llvm; 1809467b48Spatrick 1909467b48Spatrick #define DEBUG_TYPE "reaching-deps-analysis" 2009467b48Spatrick 2109467b48Spatrick char ReachingDefAnalysis::ID = 0; 2209467b48Spatrick INITIALIZE_PASS(ReachingDefAnalysis, DEBUG_TYPE, "ReachingDefAnalysis", false, 2309467b48Spatrick true) 2409467b48Spatrick 25097a140dSpatrick static bool isValidReg(const MachineOperand &MO) { 26097a140dSpatrick return MO.isReg() && MO.getReg(); 27097a140dSpatrick } 2809467b48Spatrick 29097a140dSpatrick static bool isValidRegUse(const MachineOperand &MO) { 30097a140dSpatrick return isValidReg(MO) && MO.isUse(); 31097a140dSpatrick } 32097a140dSpatrick 33*73471bf0Spatrick static bool isValidRegUseOf(const MachineOperand &MO, MCRegister PhysReg) { 34097a140dSpatrick return isValidRegUse(MO) && MO.getReg() == PhysReg; 35097a140dSpatrick } 36097a140dSpatrick 37097a140dSpatrick static bool isValidRegDef(const MachineOperand &MO) { 38097a140dSpatrick return isValidReg(MO) && MO.isDef(); 39097a140dSpatrick } 40097a140dSpatrick 41*73471bf0Spatrick static bool isValidRegDefOf(const MachineOperand &MO, MCRegister PhysReg) { 42097a140dSpatrick return isValidRegDef(MO) && MO.getReg() == PhysReg; 43097a140dSpatrick } 44097a140dSpatrick 45097a140dSpatrick void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock *MBB) { 4609467b48Spatrick unsigned MBBNumber = MBB->getNumber(); 4709467b48Spatrick assert(MBBNumber < MBBReachingDefs.size() && 4809467b48Spatrick "Unexpected basic block number."); 4909467b48Spatrick MBBReachingDefs[MBBNumber].resize(NumRegUnits); 5009467b48Spatrick 5109467b48Spatrick // Reset instruction counter in each basic block. 5209467b48Spatrick CurInstr = 0; 5309467b48Spatrick 5409467b48Spatrick // Set up LiveRegs to represent registers entering MBB. 5509467b48Spatrick // Default values are 'nothing happened a long time ago'. 5609467b48Spatrick if (LiveRegs.empty()) 5709467b48Spatrick LiveRegs.assign(NumRegUnits, ReachingDefDefaultVal); 5809467b48Spatrick 5909467b48Spatrick // This is the entry block. 6009467b48Spatrick if (MBB->pred_empty()) { 6109467b48Spatrick for (const auto &LI : MBB->liveins()) { 6209467b48Spatrick for (MCRegUnitIterator Unit(LI.PhysReg, TRI); Unit.isValid(); ++Unit) { 6309467b48Spatrick // Treat function live-ins as if they were defined just before the first 6409467b48Spatrick // instruction. Usually, function arguments are set up immediately 6509467b48Spatrick // before the call. 66097a140dSpatrick if (LiveRegs[*Unit] != -1) { 6709467b48Spatrick LiveRegs[*Unit] = -1; 68097a140dSpatrick MBBReachingDefs[MBBNumber][*Unit].push_back(-1); 69097a140dSpatrick } 7009467b48Spatrick } 7109467b48Spatrick } 7209467b48Spatrick LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n"); 7309467b48Spatrick return; 7409467b48Spatrick } 7509467b48Spatrick 7609467b48Spatrick // Try to coalesce live-out registers from predecessors. 7709467b48Spatrick for (MachineBasicBlock *pred : MBB->predecessors()) { 7809467b48Spatrick assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() && 7909467b48Spatrick "Should have pre-allocated MBBInfos for all MBBs"); 8009467b48Spatrick const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()]; 8109467b48Spatrick // Incoming is null if this is a backedge from a BB 8209467b48Spatrick // we haven't processed yet 8309467b48Spatrick if (Incoming.empty()) 8409467b48Spatrick continue; 8509467b48Spatrick 86097a140dSpatrick // Find the most recent reaching definition from a predecessor. 87097a140dSpatrick for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) 8809467b48Spatrick LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]); 89097a140dSpatrick } 90097a140dSpatrick 91097a140dSpatrick // Insert the most recent reaching definition we found. 92097a140dSpatrick for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) 93097a140dSpatrick if (LiveRegs[Unit] != ReachingDefDefaultVal) 9409467b48Spatrick MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]); 9509467b48Spatrick } 9609467b48Spatrick 97097a140dSpatrick void ReachingDefAnalysis::leaveBasicBlock(MachineBasicBlock *MBB) { 9809467b48Spatrick assert(!LiveRegs.empty() && "Must enter basic block first."); 99097a140dSpatrick unsigned MBBNumber = MBB->getNumber(); 10009467b48Spatrick assert(MBBNumber < MBBOutRegsInfos.size() && 10109467b48Spatrick "Unexpected basic block number."); 10209467b48Spatrick // Save register clearances at end of MBB - used by enterBasicBlock(). 10309467b48Spatrick MBBOutRegsInfos[MBBNumber] = LiveRegs; 10409467b48Spatrick 10509467b48Spatrick // While processing the basic block, we kept `Def` relative to the start 10609467b48Spatrick // of the basic block for convenience. However, future use of this information 10709467b48Spatrick // only cares about the clearance from the end of the block, so adjust 10809467b48Spatrick // everything to be relative to the end of the basic block. 10909467b48Spatrick for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber]) 110097a140dSpatrick if (OutLiveReg != ReachingDefDefaultVal) 11109467b48Spatrick OutLiveReg -= CurInstr; 11209467b48Spatrick LiveRegs.clear(); 11309467b48Spatrick } 11409467b48Spatrick 11509467b48Spatrick void ReachingDefAnalysis::processDefs(MachineInstr *MI) { 11609467b48Spatrick assert(!MI->isDebugInstr() && "Won't process debug instructions"); 11709467b48Spatrick 11809467b48Spatrick unsigned MBBNumber = MI->getParent()->getNumber(); 11909467b48Spatrick assert(MBBNumber < MBBReachingDefs.size() && 12009467b48Spatrick "Unexpected basic block number."); 121097a140dSpatrick 122097a140dSpatrick for (auto &MO : MI->operands()) { 123097a140dSpatrick if (!isValidRegDef(MO)) 12409467b48Spatrick continue; 125*73471bf0Spatrick for (MCRegUnitIterator Unit(MO.getReg().asMCReg(), TRI); Unit.isValid(); 126*73471bf0Spatrick ++Unit) { 12709467b48Spatrick // This instruction explicitly defines the current reg unit. 128*73471bf0Spatrick LLVM_DEBUG(dbgs() << printRegUnit(*Unit, TRI) << ":\t" << CurInstr 12909467b48Spatrick << '\t' << *MI); 13009467b48Spatrick 13109467b48Spatrick // How many instructions since this reg unit was last written? 132097a140dSpatrick if (LiveRegs[*Unit] != CurInstr) { 13309467b48Spatrick LiveRegs[*Unit] = CurInstr; 13409467b48Spatrick MBBReachingDefs[MBBNumber][*Unit].push_back(CurInstr); 13509467b48Spatrick } 13609467b48Spatrick } 137097a140dSpatrick } 13809467b48Spatrick InstIds[MI] = CurInstr; 13909467b48Spatrick ++CurInstr; 14009467b48Spatrick } 14109467b48Spatrick 142097a140dSpatrick void ReachingDefAnalysis::reprocessBasicBlock(MachineBasicBlock *MBB) { 143097a140dSpatrick unsigned MBBNumber = MBB->getNumber(); 144097a140dSpatrick assert(MBBNumber < MBBReachingDefs.size() && 145097a140dSpatrick "Unexpected basic block number."); 146097a140dSpatrick 147097a140dSpatrick // Count number of non-debug instructions for end of block adjustment. 148*73471bf0Spatrick auto NonDbgInsts = 149*73471bf0Spatrick instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end()); 150*73471bf0Spatrick int NumInsts = std::distance(NonDbgInsts.begin(), NonDbgInsts.end()); 151097a140dSpatrick 152097a140dSpatrick // When reprocessing a block, the only thing we need to do is check whether 153097a140dSpatrick // there is now a more recent incoming reaching definition from a predecessor. 154097a140dSpatrick for (MachineBasicBlock *pred : MBB->predecessors()) { 155097a140dSpatrick assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() && 156097a140dSpatrick "Should have pre-allocated MBBInfos for all MBBs"); 157097a140dSpatrick const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()]; 158097a140dSpatrick // Incoming may be empty for dead predecessors. 159097a140dSpatrick if (Incoming.empty()) 160097a140dSpatrick continue; 161097a140dSpatrick 162097a140dSpatrick for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) { 163097a140dSpatrick int Def = Incoming[Unit]; 164097a140dSpatrick if (Def == ReachingDefDefaultVal) 165097a140dSpatrick continue; 166097a140dSpatrick 167097a140dSpatrick auto Start = MBBReachingDefs[MBBNumber][Unit].begin(); 168097a140dSpatrick if (Start != MBBReachingDefs[MBBNumber][Unit].end() && *Start < 0) { 169097a140dSpatrick if (*Start >= Def) 170097a140dSpatrick continue; 171097a140dSpatrick 172097a140dSpatrick // Update existing reaching def from predecessor to a more recent one. 173097a140dSpatrick *Start = Def; 174097a140dSpatrick } else { 175097a140dSpatrick // Insert new reaching def from predecessor. 176097a140dSpatrick MBBReachingDefs[MBBNumber][Unit].insert(Start, Def); 177097a140dSpatrick } 178097a140dSpatrick 179097a140dSpatrick // Update reaching def at end of of BB. Keep in mind that these are 180097a140dSpatrick // adjusted relative to the end of the basic block. 181097a140dSpatrick if (MBBOutRegsInfos[MBBNumber][Unit] < Def - NumInsts) 182097a140dSpatrick MBBOutRegsInfos[MBBNumber][Unit] = Def - NumInsts; 183097a140dSpatrick } 184097a140dSpatrick } 185097a140dSpatrick } 186097a140dSpatrick 18709467b48Spatrick void ReachingDefAnalysis::processBasicBlock( 18809467b48Spatrick const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 189097a140dSpatrick MachineBasicBlock *MBB = TraversedMBB.MBB; 190097a140dSpatrick LLVM_DEBUG(dbgs() << printMBBReference(*MBB) 191097a140dSpatrick << (!TraversedMBB.IsDone ? ": incomplete\n" 192097a140dSpatrick : ": all preds known\n")); 193097a140dSpatrick 194097a140dSpatrick if (!TraversedMBB.PrimaryPass) { 195097a140dSpatrick // Reprocess MBB that is part of a loop. 196097a140dSpatrick reprocessBasicBlock(MBB); 197097a140dSpatrick return; 198097a140dSpatrick } 199097a140dSpatrick 200097a140dSpatrick enterBasicBlock(MBB); 201*73471bf0Spatrick for (MachineInstr &MI : 202*73471bf0Spatrick instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) 20309467b48Spatrick processDefs(&MI); 204097a140dSpatrick leaveBasicBlock(MBB); 20509467b48Spatrick } 20609467b48Spatrick 20709467b48Spatrick bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) { 20809467b48Spatrick MF = &mf; 20909467b48Spatrick TRI = MF->getSubtarget().getRegisterInfo(); 21009467b48Spatrick LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n"); 211097a140dSpatrick init(); 212097a140dSpatrick traverse(); 21309467b48Spatrick return false; 21409467b48Spatrick } 21509467b48Spatrick 21609467b48Spatrick void ReachingDefAnalysis::releaseMemory() { 21709467b48Spatrick // Clear the internal vectors. 21809467b48Spatrick MBBOutRegsInfos.clear(); 21909467b48Spatrick MBBReachingDefs.clear(); 22009467b48Spatrick InstIds.clear(); 221097a140dSpatrick LiveRegs.clear(); 22209467b48Spatrick } 22309467b48Spatrick 224097a140dSpatrick void ReachingDefAnalysis::reset() { 225097a140dSpatrick releaseMemory(); 226097a140dSpatrick init(); 227097a140dSpatrick traverse(); 228097a140dSpatrick } 229097a140dSpatrick 230097a140dSpatrick void ReachingDefAnalysis::init() { 231097a140dSpatrick NumRegUnits = TRI->getNumRegUnits(); 232097a140dSpatrick MBBReachingDefs.resize(MF->getNumBlockIDs()); 233097a140dSpatrick // Initialize the MBBOutRegsInfos 234097a140dSpatrick MBBOutRegsInfos.resize(MF->getNumBlockIDs()); 235097a140dSpatrick LoopTraversal Traversal; 236097a140dSpatrick TraversedMBBOrder = Traversal.traverse(*MF); 237097a140dSpatrick } 238097a140dSpatrick 239097a140dSpatrick void ReachingDefAnalysis::traverse() { 240097a140dSpatrick // Traverse the basic blocks. 241097a140dSpatrick for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) 242097a140dSpatrick processBasicBlock(TraversedMBB); 243097a140dSpatrick #ifndef NDEBUG 244097a140dSpatrick // Make sure reaching defs are sorted and unique. 245097a140dSpatrick for (MBBDefsInfo &MBBDefs : MBBReachingDefs) { 246097a140dSpatrick for (MBBRegUnitDefs &RegUnitDefs : MBBDefs) { 247097a140dSpatrick int LastDef = ReachingDefDefaultVal; 248097a140dSpatrick for (int Def : RegUnitDefs) { 249097a140dSpatrick assert(Def > LastDef && "Defs must be sorted and unique"); 250097a140dSpatrick LastDef = Def; 251097a140dSpatrick } 252097a140dSpatrick } 253097a140dSpatrick } 254097a140dSpatrick #endif 255097a140dSpatrick } 256097a140dSpatrick 257*73471bf0Spatrick int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, 258*73471bf0Spatrick MCRegister PhysReg) const { 25909467b48Spatrick assert(InstIds.count(MI) && "Unexpected machine instuction."); 260097a140dSpatrick int InstId = InstIds.lookup(MI); 26109467b48Spatrick int DefRes = ReachingDefDefaultVal; 26209467b48Spatrick unsigned MBBNumber = MI->getParent()->getNumber(); 26309467b48Spatrick assert(MBBNumber < MBBReachingDefs.size() && 26409467b48Spatrick "Unexpected basic block number."); 26509467b48Spatrick int LatestDef = ReachingDefDefaultVal; 26609467b48Spatrick for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) { 26709467b48Spatrick for (int Def : MBBReachingDefs[MBBNumber][*Unit]) { 26809467b48Spatrick if (Def >= InstId) 26909467b48Spatrick break; 27009467b48Spatrick DefRes = Def; 27109467b48Spatrick } 27209467b48Spatrick LatestDef = std::max(LatestDef, DefRes); 27309467b48Spatrick } 27409467b48Spatrick return LatestDef; 27509467b48Spatrick } 27609467b48Spatrick 277*73471bf0Spatrick MachineInstr * 278*73471bf0Spatrick ReachingDefAnalysis::getReachingLocalMIDef(MachineInstr *MI, 279*73471bf0Spatrick MCRegister PhysReg) const { 280*73471bf0Spatrick return hasLocalDefBefore(MI, PhysReg) 281*73471bf0Spatrick ? getInstFromId(MI->getParent(), getReachingDef(MI, PhysReg)) 282*73471bf0Spatrick : nullptr; 28309467b48Spatrick } 28409467b48Spatrick 28509467b48Spatrick bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B, 286*73471bf0Spatrick MCRegister PhysReg) const { 28709467b48Spatrick MachineBasicBlock *ParentA = A->getParent(); 28809467b48Spatrick MachineBasicBlock *ParentB = B->getParent(); 28909467b48Spatrick if (ParentA != ParentB) 29009467b48Spatrick return false; 29109467b48Spatrick 29209467b48Spatrick return getReachingDef(A, PhysReg) == getReachingDef(B, PhysReg); 29309467b48Spatrick } 29409467b48Spatrick 29509467b48Spatrick MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB, 296097a140dSpatrick int InstId) const { 29709467b48Spatrick assert(static_cast<size_t>(MBB->getNumber()) < MBBReachingDefs.size() && 29809467b48Spatrick "Unexpected basic block number."); 29909467b48Spatrick assert(InstId < static_cast<int>(MBB->size()) && 30009467b48Spatrick "Unexpected instruction id."); 30109467b48Spatrick 30209467b48Spatrick if (InstId < 0) 30309467b48Spatrick return nullptr; 30409467b48Spatrick 30509467b48Spatrick for (auto &MI : *MBB) { 306097a140dSpatrick auto F = InstIds.find(&MI); 307097a140dSpatrick if (F != InstIds.end() && F->second == InstId) 30809467b48Spatrick return &MI; 30909467b48Spatrick } 310097a140dSpatrick 31109467b48Spatrick return nullptr; 31209467b48Spatrick } 31309467b48Spatrick 314*73471bf0Spatrick int ReachingDefAnalysis::getClearance(MachineInstr *MI, 315*73471bf0Spatrick MCRegister PhysReg) const { 31609467b48Spatrick assert(InstIds.count(MI) && "Unexpected machine instuction."); 317097a140dSpatrick return InstIds.lookup(MI) - getReachingDef(MI, PhysReg); 318097a140dSpatrick } 319097a140dSpatrick 320*73471bf0Spatrick bool ReachingDefAnalysis::hasLocalDefBefore(MachineInstr *MI, 321*73471bf0Spatrick MCRegister PhysReg) const { 322097a140dSpatrick return getReachingDef(MI, PhysReg) >= 0; 32309467b48Spatrick } 32409467b48Spatrick 325*73471bf0Spatrick void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def, 326*73471bf0Spatrick MCRegister PhysReg, 327097a140dSpatrick InstSet &Uses) const { 32809467b48Spatrick MachineBasicBlock *MBB = Def->getParent(); 32909467b48Spatrick MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def); 33009467b48Spatrick while (++MI != MBB->end()) { 331097a140dSpatrick if (MI->isDebugInstr()) 332097a140dSpatrick continue; 333097a140dSpatrick 33409467b48Spatrick // If/when we find a new reaching def, we know that there's no more uses 33509467b48Spatrick // of 'Def'. 336097a140dSpatrick if (getReachingLocalMIDef(&*MI, PhysReg) != Def) 33709467b48Spatrick return; 33809467b48Spatrick 33909467b48Spatrick for (auto &MO : MI->operands()) { 340097a140dSpatrick if (!isValidRegUseOf(MO, PhysReg)) 34109467b48Spatrick continue; 34209467b48Spatrick 343097a140dSpatrick Uses.insert(&*MI); 34409467b48Spatrick if (MO.isKill()) 34509467b48Spatrick return; 34609467b48Spatrick } 34709467b48Spatrick } 34809467b48Spatrick } 34909467b48Spatrick 350*73471bf0Spatrick bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB, 351*73471bf0Spatrick MCRegister PhysReg, 352097a140dSpatrick InstSet &Uses) const { 353*73471bf0Spatrick for (MachineInstr &MI : 354*73471bf0Spatrick instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) { 355097a140dSpatrick for (auto &MO : MI.operands()) { 356097a140dSpatrick if (!isValidRegUseOf(MO, PhysReg)) 357097a140dSpatrick continue; 358097a140dSpatrick if (getReachingDef(&MI, PhysReg) >= 0) 359097a140dSpatrick return false; 360097a140dSpatrick Uses.insert(&MI); 361097a140dSpatrick } 362097a140dSpatrick } 363*73471bf0Spatrick auto Last = MBB->getLastNonDebugInstr(); 364*73471bf0Spatrick if (Last == MBB->end()) 365*73471bf0Spatrick return true; 366*73471bf0Spatrick return isReachingDefLiveOut(&*Last, PhysReg); 36709467b48Spatrick } 36809467b48Spatrick 369*73471bf0Spatrick void ReachingDefAnalysis::getGlobalUses(MachineInstr *MI, MCRegister PhysReg, 370097a140dSpatrick InstSet &Uses) const { 371097a140dSpatrick MachineBasicBlock *MBB = MI->getParent(); 372097a140dSpatrick 373097a140dSpatrick // Collect the uses that each def touches within the block. 374097a140dSpatrick getReachingLocalUses(MI, PhysReg, Uses); 375097a140dSpatrick 376097a140dSpatrick // Handle live-out values. 377097a140dSpatrick if (auto *LiveOut = getLocalLiveOutMIDef(MI->getParent(), PhysReg)) { 378097a140dSpatrick if (LiveOut != MI) 379097a140dSpatrick return; 380097a140dSpatrick 381*73471bf0Spatrick SmallVector<MachineBasicBlock *, 4> ToVisit(MBB->successors()); 382097a140dSpatrick SmallPtrSet<MachineBasicBlock*, 4>Visited; 383097a140dSpatrick while (!ToVisit.empty()) { 384097a140dSpatrick MachineBasicBlock *MBB = ToVisit.back(); 385097a140dSpatrick ToVisit.pop_back(); 386097a140dSpatrick if (Visited.count(MBB) || !MBB->isLiveIn(PhysReg)) 387097a140dSpatrick continue; 388097a140dSpatrick if (getLiveInUses(MBB, PhysReg, Uses)) 389*73471bf0Spatrick llvm::append_range(ToVisit, MBB->successors()); 390097a140dSpatrick Visited.insert(MBB); 391097a140dSpatrick } 392097a140dSpatrick } 393097a140dSpatrick } 394097a140dSpatrick 395*73471bf0Spatrick void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr *MI, 396*73471bf0Spatrick MCRegister PhysReg, 397097a140dSpatrick InstSet &Defs) const { 398*73471bf0Spatrick if (auto *Def = getUniqueReachingMIDef(MI, PhysReg)) { 399*73471bf0Spatrick Defs.insert(Def); 400*73471bf0Spatrick return; 401*73471bf0Spatrick } 402*73471bf0Spatrick 403*73471bf0Spatrick for (auto *MBB : MI->getParent()->predecessors()) 404*73471bf0Spatrick getLiveOuts(MBB, PhysReg, Defs); 405*73471bf0Spatrick } 406*73471bf0Spatrick 407*73471bf0Spatrick void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, 408*73471bf0Spatrick MCRegister PhysReg, InstSet &Defs) const { 409097a140dSpatrick SmallPtrSet<MachineBasicBlock*, 2> VisitedBBs; 410097a140dSpatrick getLiveOuts(MBB, PhysReg, Defs, VisitedBBs); 411097a140dSpatrick } 412097a140dSpatrick 413*73471bf0Spatrick void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, 414*73471bf0Spatrick MCRegister PhysReg, InstSet &Defs, 415*73471bf0Spatrick BlockSet &VisitedBBs) const { 416097a140dSpatrick if (VisitedBBs.count(MBB)) 417097a140dSpatrick return; 418097a140dSpatrick 419097a140dSpatrick VisitedBBs.insert(MBB); 420097a140dSpatrick LivePhysRegs LiveRegs(*TRI); 421097a140dSpatrick LiveRegs.addLiveOuts(*MBB); 422097a140dSpatrick if (!LiveRegs.contains(PhysReg)) 423097a140dSpatrick return; 424097a140dSpatrick 425097a140dSpatrick if (auto *Def = getLocalLiveOutMIDef(MBB, PhysReg)) 426097a140dSpatrick Defs.insert(Def); 427097a140dSpatrick else 428097a140dSpatrick for (auto *Pred : MBB->predecessors()) 429097a140dSpatrick getLiveOuts(Pred, PhysReg, Defs, VisitedBBs); 430097a140dSpatrick } 431097a140dSpatrick 432*73471bf0Spatrick MachineInstr * 433*73471bf0Spatrick ReachingDefAnalysis::getUniqueReachingMIDef(MachineInstr *MI, 434*73471bf0Spatrick MCRegister PhysReg) const { 435097a140dSpatrick // If there's a local def before MI, return it. 436097a140dSpatrick MachineInstr *LocalDef = getReachingLocalMIDef(MI, PhysReg); 437097a140dSpatrick if (LocalDef && InstIds.lookup(LocalDef) < InstIds.lookup(MI)) 438097a140dSpatrick return LocalDef; 439097a140dSpatrick 440097a140dSpatrick SmallPtrSet<MachineInstr*, 2> Incoming; 441*73471bf0Spatrick MachineBasicBlock *Parent = MI->getParent(); 442*73471bf0Spatrick for (auto *Pred : Parent->predecessors()) 443*73471bf0Spatrick getLiveOuts(Pred, PhysReg, Incoming); 444097a140dSpatrick 445*73471bf0Spatrick // Check that we have a single incoming value and that it does not 446*73471bf0Spatrick // come from the same block as MI - since it would mean that the def 447*73471bf0Spatrick // is executed after MI. 448*73471bf0Spatrick if (Incoming.size() == 1 && (*Incoming.begin())->getParent() != Parent) 449097a140dSpatrick return *Incoming.begin(); 450*73471bf0Spatrick return nullptr; 451097a140dSpatrick } 452097a140dSpatrick 453097a140dSpatrick MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI, 454097a140dSpatrick unsigned Idx) const { 455097a140dSpatrick assert(MI->getOperand(Idx).isReg() && "Expected register operand"); 456097a140dSpatrick return getUniqueReachingMIDef(MI, MI->getOperand(Idx).getReg()); 457097a140dSpatrick } 458097a140dSpatrick 459097a140dSpatrick MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI, 460097a140dSpatrick MachineOperand &MO) const { 461097a140dSpatrick assert(MO.isReg() && "Expected register operand"); 462097a140dSpatrick return getUniqueReachingMIDef(MI, MO.getReg()); 463097a140dSpatrick } 464097a140dSpatrick 465*73471bf0Spatrick bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI, 466*73471bf0Spatrick MCRegister PhysReg) const { 46709467b48Spatrick MachineBasicBlock *MBB = MI->getParent(); 46809467b48Spatrick LivePhysRegs LiveRegs(*TRI); 46909467b48Spatrick LiveRegs.addLiveOuts(*MBB); 47009467b48Spatrick 47109467b48Spatrick // Yes if the register is live out of the basic block. 47209467b48Spatrick if (LiveRegs.contains(PhysReg)) 47309467b48Spatrick return true; 47409467b48Spatrick 47509467b48Spatrick // Walk backwards through the block to see if the register is live at some 47609467b48Spatrick // point. 477*73471bf0Spatrick for (MachineInstr &Last : 478*73471bf0Spatrick instructionsWithoutDebug(MBB->instr_rbegin(), MBB->instr_rend())) { 479*73471bf0Spatrick LiveRegs.stepBackward(Last); 48009467b48Spatrick if (LiveRegs.contains(PhysReg)) 481*73471bf0Spatrick return InstIds.lookup(&Last) > InstIds.lookup(MI); 48209467b48Spatrick } 48309467b48Spatrick return false; 48409467b48Spatrick } 48509467b48Spatrick 486097a140dSpatrick bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr *MI, 487*73471bf0Spatrick MCRegister PhysReg) const { 488097a140dSpatrick MachineBasicBlock *MBB = MI->getParent(); 489*73471bf0Spatrick auto Last = MBB->getLastNonDebugInstr(); 490*73471bf0Spatrick if (Last != MBB->end() && 491*73471bf0Spatrick getReachingDef(MI, PhysReg) != getReachingDef(&*Last, PhysReg)) 492097a140dSpatrick return true; 493097a140dSpatrick 494097a140dSpatrick if (auto *Def = getLocalLiveOutMIDef(MBB, PhysReg)) 495097a140dSpatrick return Def == getReachingLocalMIDef(MI, PhysReg); 496097a140dSpatrick 497097a140dSpatrick return false; 498097a140dSpatrick } 499097a140dSpatrick 500*73471bf0Spatrick bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI, 501*73471bf0Spatrick MCRegister PhysReg) const { 50209467b48Spatrick MachineBasicBlock *MBB = MI->getParent(); 50309467b48Spatrick LivePhysRegs LiveRegs(*TRI); 50409467b48Spatrick LiveRegs.addLiveOuts(*MBB); 50509467b48Spatrick if (!LiveRegs.contains(PhysReg)) 50609467b48Spatrick return false; 50709467b48Spatrick 508*73471bf0Spatrick auto Last = MBB->getLastNonDebugInstr(); 50909467b48Spatrick int Def = getReachingDef(MI, PhysReg); 510*73471bf0Spatrick if (Last != MBB->end() && getReachingDef(&*Last, PhysReg) != Def) 51109467b48Spatrick return false; 51209467b48Spatrick 51309467b48Spatrick // Finally check that the last instruction doesn't redefine the register. 51409467b48Spatrick for (auto &MO : Last->operands()) 515097a140dSpatrick if (isValidRegDefOf(MO, PhysReg)) 51609467b48Spatrick return false; 51709467b48Spatrick 51809467b48Spatrick return true; 51909467b48Spatrick } 52009467b48Spatrick 521*73471bf0Spatrick MachineInstr * 522*73471bf0Spatrick ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB, 523*73471bf0Spatrick MCRegister PhysReg) const { 52409467b48Spatrick LivePhysRegs LiveRegs(*TRI); 52509467b48Spatrick LiveRegs.addLiveOuts(*MBB); 52609467b48Spatrick if (!LiveRegs.contains(PhysReg)) 52709467b48Spatrick return nullptr; 52809467b48Spatrick 529*73471bf0Spatrick auto Last = MBB->getLastNonDebugInstr(); 530*73471bf0Spatrick if (Last == MBB->end()) 531*73471bf0Spatrick return nullptr; 532*73471bf0Spatrick 533*73471bf0Spatrick int Def = getReachingDef(&*Last, PhysReg); 53409467b48Spatrick for (auto &MO : Last->operands()) 535097a140dSpatrick if (isValidRegDefOf(MO, PhysReg)) 536*73471bf0Spatrick return &*Last; 53709467b48Spatrick 53809467b48Spatrick return Def < 0 ? nullptr : getInstFromId(MBB, Def); 53909467b48Spatrick } 54009467b48Spatrick 541097a140dSpatrick static bool mayHaveSideEffects(MachineInstr &MI) { 542097a140dSpatrick return MI.mayLoadOrStore() || MI.mayRaiseFPException() || 543097a140dSpatrick MI.hasUnmodeledSideEffects() || MI.isTerminator() || 544097a140dSpatrick MI.isCall() || MI.isBarrier() || MI.isBranch() || MI.isReturn(); 545097a140dSpatrick } 54609467b48Spatrick 547097a140dSpatrick // Can we safely move 'From' to just before 'To'? To satisfy this, 'From' must 548097a140dSpatrick // not define a register that is used by any instructions, after and including, 549097a140dSpatrick // 'To'. These instructions also must not redefine any of Froms operands. 550097a140dSpatrick template<typename Iterator> 551097a140dSpatrick bool ReachingDefAnalysis::isSafeToMove(MachineInstr *From, 552097a140dSpatrick MachineInstr *To) const { 553*73471bf0Spatrick if (From->getParent() != To->getParent() || From == To) 554097a140dSpatrick return false; 555097a140dSpatrick 556097a140dSpatrick SmallSet<int, 2> Defs; 557097a140dSpatrick // First check that From would compute the same value if moved. 558097a140dSpatrick for (auto &MO : From->operands()) { 559097a140dSpatrick if (!isValidReg(MO)) 560097a140dSpatrick continue; 561097a140dSpatrick if (MO.isDef()) 562097a140dSpatrick Defs.insert(MO.getReg()); 563097a140dSpatrick else if (!hasSameReachingDef(From, To, MO.getReg())) 564097a140dSpatrick return false; 565097a140dSpatrick } 566097a140dSpatrick 567097a140dSpatrick // Now walk checking that the rest of the instructions will compute the same 568097a140dSpatrick // value and that we're not overwriting anything. Don't move the instruction 569097a140dSpatrick // past any memory, control-flow or other ambiguous instructions. 570097a140dSpatrick for (auto I = ++Iterator(From), E = Iterator(To); I != E; ++I) { 571097a140dSpatrick if (mayHaveSideEffects(*I)) 572097a140dSpatrick return false; 57309467b48Spatrick for (auto &MO : I->operands()) 574097a140dSpatrick if (MO.isReg() && MO.getReg() && Defs.count(MO.getReg())) 575097a140dSpatrick return false; 576097a140dSpatrick } 577097a140dSpatrick return true; 57809467b48Spatrick } 57909467b48Spatrick 580097a140dSpatrick bool ReachingDefAnalysis::isSafeToMoveForwards(MachineInstr *From, 581097a140dSpatrick MachineInstr *To) const { 582*73471bf0Spatrick using Iterator = MachineBasicBlock::iterator; 583*73471bf0Spatrick // Walk forwards until we find the instruction. 584*73471bf0Spatrick for (auto I = Iterator(From), E = From->getParent()->end(); I != E; ++I) 585*73471bf0Spatrick if (&*I == To) 586*73471bf0Spatrick return isSafeToMove<Iterator>(From, To); 587*73471bf0Spatrick return false; 58809467b48Spatrick } 589097a140dSpatrick 590097a140dSpatrick bool ReachingDefAnalysis::isSafeToMoveBackwards(MachineInstr *From, 591097a140dSpatrick MachineInstr *To) const { 592*73471bf0Spatrick using Iterator = MachineBasicBlock::reverse_iterator; 593*73471bf0Spatrick // Walk backwards until we find the instruction. 594*73471bf0Spatrick for (auto I = Iterator(From), E = From->getParent()->rend(); I != E; ++I) 595*73471bf0Spatrick if (&*I == To) 596*73471bf0Spatrick return isSafeToMove<Iterator>(From, To); 597*73471bf0Spatrick return false; 598097a140dSpatrick } 599097a140dSpatrick 600097a140dSpatrick bool ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, 601097a140dSpatrick InstSet &ToRemove) const { 602097a140dSpatrick SmallPtrSet<MachineInstr*, 1> Ignore; 603097a140dSpatrick SmallPtrSet<MachineInstr*, 2> Visited; 604097a140dSpatrick return isSafeToRemove(MI, Visited, ToRemove, Ignore); 605097a140dSpatrick } 606097a140dSpatrick 607097a140dSpatrick bool 608097a140dSpatrick ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &ToRemove, 609097a140dSpatrick InstSet &Ignore) const { 610097a140dSpatrick SmallPtrSet<MachineInstr*, 2> Visited; 611097a140dSpatrick return isSafeToRemove(MI, Visited, ToRemove, Ignore); 612097a140dSpatrick } 613097a140dSpatrick 614097a140dSpatrick bool 615097a140dSpatrick ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &Visited, 616097a140dSpatrick InstSet &ToRemove, InstSet &Ignore) const { 617097a140dSpatrick if (Visited.count(MI) || Ignore.count(MI)) 618097a140dSpatrick return true; 619097a140dSpatrick else if (mayHaveSideEffects(*MI)) { 620097a140dSpatrick // Unless told to ignore the instruction, don't remove anything which has 621097a140dSpatrick // side effects. 622097a140dSpatrick return false; 623097a140dSpatrick } 624097a140dSpatrick 625097a140dSpatrick Visited.insert(MI); 626097a140dSpatrick for (auto &MO : MI->operands()) { 627097a140dSpatrick if (!isValidRegDef(MO)) 628097a140dSpatrick continue; 629097a140dSpatrick 630097a140dSpatrick SmallPtrSet<MachineInstr*, 4> Uses; 631097a140dSpatrick getGlobalUses(MI, MO.getReg(), Uses); 632097a140dSpatrick 633097a140dSpatrick for (auto I : Uses) { 634097a140dSpatrick if (Ignore.count(I) || ToRemove.count(I)) 635097a140dSpatrick continue; 636097a140dSpatrick if (!isSafeToRemove(I, Visited, ToRemove, Ignore)) 637097a140dSpatrick return false; 638097a140dSpatrick } 639097a140dSpatrick } 640097a140dSpatrick ToRemove.insert(MI); 641097a140dSpatrick return true; 642097a140dSpatrick } 643097a140dSpatrick 644097a140dSpatrick void ReachingDefAnalysis::collectKilledOperands(MachineInstr *MI, 645097a140dSpatrick InstSet &Dead) const { 646097a140dSpatrick Dead.insert(MI); 647*73471bf0Spatrick auto IsDead = [this, &Dead](MachineInstr *Def, MCRegister PhysReg) { 648*73471bf0Spatrick if (mayHaveSideEffects(*Def)) 649*73471bf0Spatrick return false; 650*73471bf0Spatrick 651097a140dSpatrick unsigned LiveDefs = 0; 652097a140dSpatrick for (auto &MO : Def->operands()) { 653097a140dSpatrick if (!isValidRegDef(MO)) 654097a140dSpatrick continue; 655097a140dSpatrick if (!MO.isDead()) 656097a140dSpatrick ++LiveDefs; 657097a140dSpatrick } 658097a140dSpatrick 659097a140dSpatrick if (LiveDefs > 1) 660097a140dSpatrick return false; 661097a140dSpatrick 662097a140dSpatrick SmallPtrSet<MachineInstr*, 4> Uses; 663097a140dSpatrick getGlobalUses(Def, PhysReg, Uses); 664*73471bf0Spatrick return llvm::set_is_subset(Uses, Dead); 665097a140dSpatrick }; 666097a140dSpatrick 667097a140dSpatrick for (auto &MO : MI->operands()) { 668097a140dSpatrick if (!isValidRegUse(MO)) 669097a140dSpatrick continue; 670097a140dSpatrick if (MachineInstr *Def = getMIOperand(MI, MO)) 671097a140dSpatrick if (IsDead(Def, MO.getReg())) 672097a140dSpatrick collectKilledOperands(Def, Dead); 673097a140dSpatrick } 674097a140dSpatrick } 675097a140dSpatrick 676097a140dSpatrick bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, 677*73471bf0Spatrick MCRegister PhysReg) const { 678097a140dSpatrick SmallPtrSet<MachineInstr*, 1> Ignore; 679097a140dSpatrick return isSafeToDefRegAt(MI, PhysReg, Ignore); 680097a140dSpatrick } 681097a140dSpatrick 682*73471bf0Spatrick bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, MCRegister PhysReg, 683097a140dSpatrick InstSet &Ignore) const { 684097a140dSpatrick // Check for any uses of the register after MI. 685097a140dSpatrick if (isRegUsedAfter(MI, PhysReg)) { 686097a140dSpatrick if (auto *Def = getReachingLocalMIDef(MI, PhysReg)) { 687097a140dSpatrick SmallPtrSet<MachineInstr*, 2> Uses; 688*73471bf0Spatrick getGlobalUses(Def, PhysReg, Uses); 689*73471bf0Spatrick if (!llvm::set_is_subset(Uses, Ignore)) 690097a140dSpatrick return false; 691097a140dSpatrick } else 692097a140dSpatrick return false; 693097a140dSpatrick } 694097a140dSpatrick 695097a140dSpatrick MachineBasicBlock *MBB = MI->getParent(); 696097a140dSpatrick // Check for any defs after MI. 697097a140dSpatrick if (isRegDefinedAfter(MI, PhysReg)) { 698097a140dSpatrick auto I = MachineBasicBlock::iterator(MI); 699097a140dSpatrick for (auto E = MBB->end(); I != E; ++I) { 700097a140dSpatrick if (Ignore.count(&*I)) 701097a140dSpatrick continue; 702097a140dSpatrick for (auto &MO : I->operands()) 703097a140dSpatrick if (isValidRegDefOf(MO, PhysReg)) 704097a140dSpatrick return false; 705097a140dSpatrick } 706097a140dSpatrick } 707097a140dSpatrick return true; 70809467b48Spatrick } 709