diff options
author | Kazu Hirata <kazu@google.com> | 2024-09-29 19:37:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-29 19:37:53 -0700 |
commit | 64f2bff12b8ac40c79004ffacf46a5294600d219 (patch) | |
tree | 4469517ea4809955a29dd8d13add053344d7db8f /llvm/lib/CodeGen/ReachingDefAnalysis.cpp | |
parent | 1efd1227b2042b865afb7c5a260f2d96927bf911 (diff) | |
download | llvm-64f2bff12b8ac40c79004ffacf46a5294600d219.zip llvm-64f2bff12b8ac40c79004ffacf46a5294600d219.tar.gz llvm-64f2bff12b8ac40c79004ffacf46a5294600d219.tar.bz2 |
[ReachingDefAnalysis] Turn MBBReachingDefsInfo into a proper class (NFC) (#110432)
I'm trying to speed up the reaching def analysis by changing the
underlying data structure. Turning MBBReachingDefsInfo into a proper
class decouples the data structure and its users. This patch does not
change the existing three-dimensional vector structure.
---------
Co-authored-by: Nikita Popov <github@npopov.com>
Diffstat (limited to 'llvm/lib/CodeGen/ReachingDefAnalysis.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ReachingDefAnalysis.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp index 07fa928..0e8220e 100644 --- a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp +++ b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp @@ -50,9 +50,9 @@ static bool isValidRegDefOf(const MachineOperand &MO, MCRegister PhysReg, void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock *MBB) { unsigned MBBNumber = MBB->getNumber(); - assert(MBBNumber < MBBReachingDefs.size() && + assert(MBBNumber < MBBReachingDefs.numBlockIDs() && "Unexpected basic block number."); - MBBReachingDefs[MBBNumber].resize(NumRegUnits); + MBBReachingDefs.startBasicBlock(MBBNumber, NumRegUnits); // Reset instruction counter in each basic block. CurInstr = 0; @@ -71,7 +71,7 @@ void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock *MBB) { // before the call. if (LiveRegs[Unit] != -1) { LiveRegs[Unit] = -1; - MBBReachingDefs[MBBNumber][Unit].push_back(-1); + MBBReachingDefs.append(MBBNumber, Unit, -1); } } } @@ -97,7 +97,7 @@ void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock *MBB) { // Insert the most recent reaching definition we found. for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) if (LiveRegs[Unit] != ReachingDefDefaultVal) - MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]); + MBBReachingDefs.append(MBBNumber, Unit, LiveRegs[Unit]); } void ReachingDefAnalysis::leaveBasicBlock(MachineBasicBlock *MBB) { @@ -122,7 +122,7 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) { assert(!MI->isDebugInstr() && "Won't process debug instructions"); unsigned MBBNumber = MI->getParent()->getNumber(); - assert(MBBNumber < MBBReachingDefs.size() && + assert(MBBNumber < MBBReachingDefs.numBlockIDs() && "Unexpected basic block number."); for (auto &MO : MI->operands()) { @@ -136,7 +136,7 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) { // How many instructions since this reg unit was last written? if (LiveRegs[Unit] != CurInstr) { LiveRegs[Unit] = CurInstr; - MBBReachingDefs[MBBNumber][Unit].push_back(CurInstr); + MBBReachingDefs.append(MBBNumber, Unit, CurInstr); } } } @@ -146,7 +146,7 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) { void ReachingDefAnalysis::reprocessBasicBlock(MachineBasicBlock *MBB) { unsigned MBBNumber = MBB->getNumber(); - assert(MBBNumber < MBBReachingDefs.size() && + assert(MBBNumber < MBBReachingDefs.numBlockIDs() && "Unexpected basic block number."); // Count number of non-debug instructions for end of block adjustment. @@ -169,16 +169,16 @@ void ReachingDefAnalysis::reprocessBasicBlock(MachineBasicBlock *MBB) { if (Def == ReachingDefDefaultVal) continue; - auto Start = MBBReachingDefs[MBBNumber][Unit].begin(); - if (Start != MBBReachingDefs[MBBNumber][Unit].end() && *Start < 0) { - if (*Start >= Def) + auto Defs = MBBReachingDefs.defs(MBBNumber, Unit); + if (!Defs.empty() && Defs.front() < 0) { + if (Defs.front() >= Def) continue; // Update existing reaching def from predecessor to a more recent one. - *Start = Def; + MBBReachingDefs.replaceFront(MBBNumber, Unit, Def); } else { // Insert new reaching def from predecessor. - MBBReachingDefs[MBBNumber][Unit].insert(Start, Def); + MBBReachingDefs.prepend(MBBNumber, Unit, Def); } // Update reaching def at end of BB. Keep in mind that these are @@ -234,7 +234,7 @@ void ReachingDefAnalysis::reset() { void ReachingDefAnalysis::init() { NumRegUnits = TRI->getNumRegUnits(); - MBBReachingDefs.resize(MF->getNumBlockIDs()); + MBBReachingDefs.init(MF->getNumBlockIDs()); // Initialize the MBBOutRegsInfos MBBOutRegsInfos.resize(MF->getNumBlockIDs()); LoopTraversal Traversal; @@ -247,10 +247,11 @@ void ReachingDefAnalysis::traverse() { processBasicBlock(TraversedMBB); #ifndef NDEBUG // Make sure reaching defs are sorted and unique. - for (MBBDefsInfo &MBBDefs : MBBReachingDefs) { - for (MBBRegUnitDefs &RegUnitDefs : MBBDefs) { + for (unsigned MBBNumber = 0, NumBlockIDs = MF->getNumBlockIDs(); + MBBNumber != NumBlockIDs; ++MBBNumber) { + for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) { int LastDef = ReachingDefDefaultVal; - for (int Def : RegUnitDefs) { + for (int Def : MBBReachingDefs.defs(MBBNumber, Unit)) { assert(Def > LastDef && "Defs must be sorted and unique"); LastDef = Def; } @@ -265,11 +266,11 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, int InstId = InstIds.lookup(MI); int DefRes = ReachingDefDefaultVal; unsigned MBBNumber = MI->getParent()->getNumber(); - assert(MBBNumber < MBBReachingDefs.size() && + assert(MBBNumber < MBBReachingDefs.numBlockIDs() && "Unexpected basic block number."); int LatestDef = ReachingDefDefaultVal; for (MCRegUnit Unit : TRI->regunits(PhysReg)) { - for (int Def : MBBReachingDefs[MBBNumber][Unit]) { + for (int Def : MBBReachingDefs.defs(MBBNumber, Unit)) { if (Def >= InstId) break; DefRes = Def; @@ -299,7 +300,8 @@ bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B, MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB, int InstId) const { - assert(static_cast<size_t>(MBB->getNumber()) < MBBReachingDefs.size() && + assert(static_cast<size_t>(MBB->getNumber()) < + MBBReachingDefs.numBlockIDs() && "Unexpected basic block number."); assert(InstId < static_cast<int>(MBB->size()) && "Unexpected instruction id."); |