aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/ReachingDefAnalysis.cpp
diff options
context:
space:
mode:
authorKazu Hirata <kazu@google.com>2024-09-29 19:37:53 -0700
committerGitHub <noreply@github.com>2024-09-29 19:37:53 -0700
commit64f2bff12b8ac40c79004ffacf46a5294600d219 (patch)
tree4469517ea4809955a29dd8d13add053344d7db8f /llvm/lib/CodeGen/ReachingDefAnalysis.cpp
parent1efd1227b2042b865afb7c5a260f2d96927bf911 (diff)
downloadllvm-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.cpp40
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.");