Skip to content

[ReachingDefAnalysis][NFC] Replace MCRegister with Register #123626

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 18 additions & 21 deletions llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,24 +177,23 @@ class ReachingDefAnalysis : public MachineFunctionPass {

/// Provides the instruction id of the closest reaching def instruction of
/// Reg that reaches MI, relative to the begining of MI's basic block.
int getReachingDef(MachineInstr *MI, MCRegister Reg) const;
int getReachingDef(MachineInstr *MI, Register Reg) const;

/// Return whether A and B use the same def of Reg.
bool hasSameReachingDef(MachineInstr *A, MachineInstr *B,
MCRegister Reg) const;
bool hasSameReachingDef(MachineInstr *A, MachineInstr *B, Register Reg) const;

/// Return whether the reaching def for MI also is live out of its parent
/// block.
bool isReachingDefLiveOut(MachineInstr *MI, MCRegister Reg) const;
bool isReachingDefLiveOut(MachineInstr *MI, Register Reg) const;

/// Return the local MI that produces the live out value for Reg, or
/// nullptr for a non-live out or non-local def.
MachineInstr *getLocalLiveOutMIDef(MachineBasicBlock *MBB,
MCRegister Reg) const;
Register Reg) const;

/// If a single MachineInstr creates the reaching definition, then return it.
/// Otherwise return null.
MachineInstr *getUniqueReachingMIDef(MachineInstr *MI, MCRegister Reg) const;
MachineInstr *getUniqueReachingMIDef(MachineInstr *MI, Register Reg) const;

/// If a single MachineInstr creates the reaching definition, for MIs operand
/// at Idx, then return it. Otherwise return null.
Expand All @@ -206,43 +205,42 @@ class ReachingDefAnalysis : public MachineFunctionPass {

/// Provide whether the register has been defined in the same basic block as,
/// and before, MI.
bool hasLocalDefBefore(MachineInstr *MI, MCRegister Reg) const;
bool hasLocalDefBefore(MachineInstr *MI, Register Reg) const;

/// Return whether the given register is used after MI, whether it's a local
/// use or a live out.
bool isRegUsedAfter(MachineInstr *MI, MCRegister Reg) const;
bool isRegUsedAfter(MachineInstr *MI, Register Reg) const;

/// Return whether the given register is defined after MI.
bool isRegDefinedAfter(MachineInstr *MI, MCRegister Reg) const;
bool isRegDefinedAfter(MachineInstr *MI, Register Reg) const;

/// Provides the clearance - the number of instructions since the closest
/// reaching def instuction of Reg that reaches MI.
int getClearance(MachineInstr *MI, MCRegister Reg) const;
int getClearance(MachineInstr *MI, Register Reg) const;

/// Provides the uses, in the same block as MI, of register that MI defines.
/// This does not consider live-outs.
void getReachingLocalUses(MachineInstr *MI, MCRegister Reg,
void getReachingLocalUses(MachineInstr *MI, Register Reg,
InstSet &Uses) const;

/// Search MBB for a definition of Reg and insert it into Defs. If no
/// definition is found, recursively search the predecessor blocks for them.
void getLiveOuts(MachineBasicBlock *MBB, MCRegister Reg, InstSet &Defs,
void getLiveOuts(MachineBasicBlock *MBB, Register Reg, InstSet &Defs,
BlockSet &VisitedBBs) const;
void getLiveOuts(MachineBasicBlock *MBB, MCRegister Reg, InstSet &Defs) const;
void getLiveOuts(MachineBasicBlock *MBB, Register Reg, InstSet &Defs) const;

/// For the given block, collect the instructions that use the live-in
/// value of the provided register. Return whether the value is still
/// live on exit.
bool getLiveInUses(MachineBasicBlock *MBB, MCRegister Reg,
InstSet &Uses) const;
bool getLiveInUses(MachineBasicBlock *MBB, Register Reg, InstSet &Uses) const;

/// Collect the users of the value stored in Reg, which is defined
/// by MI.
void getGlobalUses(MachineInstr *MI, MCRegister Reg, InstSet &Uses) const;
void getGlobalUses(MachineInstr *MI, Register Reg, InstSet &Uses) const;

/// Collect all possible definitions of the value stored in Reg, which is
/// used by MI.
void getGlobalReachingDefs(MachineInstr *MI, MCRegister Reg,
void getGlobalReachingDefs(MachineInstr *MI, Register Reg,
InstSet &Defs) const;

/// Return whether From can be moved forwards to just before To.
Expand All @@ -267,13 +265,12 @@ class ReachingDefAnalysis : public MachineFunctionPass {

/// Return whether a MachineInstr could be inserted at MI and safely define
/// the given register without affecting the program.
bool isSafeToDefRegAt(MachineInstr *MI, MCRegister Reg) const;
bool isSafeToDefRegAt(MachineInstr *MI, Register Reg) const;

/// Return whether a MachineInstr could be inserted at MI and safely define
/// the given register without affecting the program, ignoring any effects
/// on the provided instructions.
bool isSafeToDefRegAt(MachineInstr *MI, MCRegister Reg,
InstSet &Ignore) const;
bool isSafeToDefRegAt(MachineInstr *MI, Register Reg, InstSet &Ignore) const;

private:
/// Set up LiveRegs by merging predecessor live-out values.
Expand Down Expand Up @@ -308,7 +305,7 @@ class ReachingDefAnalysis : public MachineFunctionPass {

/// Provides the instruction of the closest reaching def instruction of
/// Reg that reaches MI, relative to the begining of MI's basic block.
MachineInstr *getReachingLocalMIDef(MachineInstr *MI, MCRegister Reg) const;
MachineInstr *getReachingLocalMIDef(MachineInstr *MI, Register Reg) const;
};

} // namespace llvm
Expand Down
49 changes: 22 additions & 27 deletions llvm/lib/CodeGen/ReachingDefAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ static bool isValidRegUse(const MachineOperand &MO) {
return isValidReg(MO) && MO.isUse();
}

static bool isValidRegUseOf(const MachineOperand &MO, MCRegister Reg,
static bool isValidRegUseOf(const MachineOperand &MO, Register Reg,
const TargetRegisterInfo *TRI) {
if (!isValidRegUse(MO))
return false;
Expand All @@ -41,7 +41,7 @@ static bool isValidRegDef(const MachineOperand &MO) {
return isValidReg(MO) && MO.isDef();
}

static bool isValidRegDefOf(const MachineOperand &MO, MCRegister Reg,
static bool isValidRegDefOf(const MachineOperand &MO, Register Reg,
const TargetRegisterInfo *TRI) {
if (!isValidRegDef(MO))
return false;
Expand Down Expand Up @@ -260,8 +260,7 @@ void ReachingDefAnalysis::traverse() {
#endif
}

int ReachingDefAnalysis::getReachingDef(MachineInstr *MI,
MCRegister Reg) const {
int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const {
assert(InstIds.count(MI) && "Unexpected machine instuction.");
int InstId = InstIds.lookup(MI);
int DefRes = ReachingDefDefaultVal;
Expand All @@ -281,14 +280,14 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI,
}

MachineInstr *ReachingDefAnalysis::getReachingLocalMIDef(MachineInstr *MI,
MCRegister Reg) const {
Register Reg) const {
return hasLocalDefBefore(MI, Reg)
? getInstFromId(MI->getParent(), getReachingDef(MI, Reg))
: nullptr;
}

bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B,
MCRegister Reg) const {
Register Reg) const {
MachineBasicBlock *ParentA = A->getParent();
MachineBasicBlock *ParentB = B->getParent();
if (ParentA != ParentB)
Expand Down Expand Up @@ -317,18 +316,17 @@ MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB,
return nullptr;
}

int ReachingDefAnalysis::getClearance(MachineInstr *MI, MCRegister Reg) const {
int ReachingDefAnalysis::getClearance(MachineInstr *MI, Register Reg) const {
assert(InstIds.count(MI) && "Unexpected machine instuction.");
return InstIds.lookup(MI) - getReachingDef(MI, Reg);
}

bool ReachingDefAnalysis::hasLocalDefBefore(MachineInstr *MI,
MCRegister Reg) const {
Register Reg) const {
return getReachingDef(MI, Reg) >= 0;
}

void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def,
MCRegister Reg,
void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def, Register Reg,
InstSet &Uses) const {
MachineBasicBlock *MBB = Def->getParent();
MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def);
Expand All @@ -352,7 +350,7 @@ void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def,
}
}

bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB, MCRegister Reg,
bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB, Register Reg,
InstSet &Uses) const {
for (MachineInstr &MI :
instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) {
Expand All @@ -370,7 +368,7 @@ bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB, MCRegister Reg,
return isReachingDefLiveOut(&*Last, Reg);
}

void ReachingDefAnalysis::getGlobalUses(MachineInstr *MI, MCRegister Reg,
void ReachingDefAnalysis::getGlobalUses(MachineInstr *MI, Register Reg,
InstSet &Uses) const {
MachineBasicBlock *MBB = MI->getParent();

Expand All @@ -395,8 +393,7 @@ void ReachingDefAnalysis::getGlobalUses(MachineInstr *MI, MCRegister Reg,
}
}

void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr *MI,
MCRegister Reg,
void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr *MI, Register Reg,
InstSet &Defs) const {
if (auto *Def = getUniqueReachingMIDef(MI, Reg)) {
Defs.insert(Def);
Expand All @@ -407,13 +404,13 @@ void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr *MI,
getLiveOuts(MBB, Reg, Defs);
}

void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, MCRegister Reg,
void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, Register Reg,
InstSet &Defs) const {
SmallPtrSet<MachineBasicBlock*, 2> VisitedBBs;
getLiveOuts(MBB, Reg, Defs, VisitedBBs);
}

void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, MCRegister Reg,
void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, Register Reg,
InstSet &Defs,
BlockSet &VisitedBBs) const {
if (VisitedBBs.count(MBB))
Expand All @@ -432,9 +429,8 @@ void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, MCRegister Reg,
getLiveOuts(Pred, Reg, Defs, VisitedBBs);
}

MachineInstr *
ReachingDefAnalysis::getUniqueReachingMIDef(MachineInstr *MI,
MCRegister Reg) const {
MachineInstr *ReachingDefAnalysis::getUniqueReachingMIDef(MachineInstr *MI,
Register Reg) const {
// If there's a local def before MI, return it.
MachineInstr *LocalDef = getReachingLocalMIDef(MI, Reg);
if (LocalDef && InstIds.lookup(LocalDef) < InstIds.lookup(MI))
Expand Down Expand Up @@ -465,8 +461,7 @@ MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI,
return getUniqueReachingMIDef(MI, MO.getReg());
}

bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI,
MCRegister Reg) const {
bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI, Register Reg) const {
MachineBasicBlock *MBB = MI->getParent();
LiveRegUnits LiveRegs(*TRI);
LiveRegs.addLiveOuts(*MBB);
Expand All @@ -487,7 +482,7 @@ bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI,
}

bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr *MI,
MCRegister Reg) const {
Register Reg) const {
MachineBasicBlock *MBB = MI->getParent();
auto Last = MBB->getLastNonDebugInstr();
if (Last != MBB->end() &&
Expand All @@ -501,7 +496,7 @@ bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr *MI,
}

bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
MCRegister Reg) const {
Register Reg) const {
MachineBasicBlock *MBB = MI->getParent();
LiveRegUnits LiveRegs(*TRI);
LiveRegs.addLiveOuts(*MBB);
Expand All @@ -522,7 +517,7 @@ bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
}

MachineInstr *ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
MCRegister Reg) const {
Register Reg) const {
LiveRegUnits LiveRegs(*TRI);
LiveRegs.addLiveOuts(*MBB);
if (LiveRegs.available(Reg))
Expand Down Expand Up @@ -646,7 +641,7 @@ ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &Visited,
void ReachingDefAnalysis::collectKilledOperands(MachineInstr *MI,
InstSet &Dead) const {
Dead.insert(MI);
auto IsDead = [this, &Dead](MachineInstr *Def, MCRegister Reg) {
auto IsDead = [this, &Dead](MachineInstr *Def, Register Reg) {
if (mayHaveSideEffects(*Def))
return false;

Expand Down Expand Up @@ -676,12 +671,12 @@ void ReachingDefAnalysis::collectKilledOperands(MachineInstr *MI,
}

bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI,
MCRegister Reg) const {
Register Reg) const {
SmallPtrSet<MachineInstr*, 1> Ignore;
return isSafeToDefRegAt(MI, Reg, Ignore);
}

bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, MCRegister Reg,
bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, Register Reg,
InstSet &Ignore) const {
// Check for any uses of the register after MI.
if (isRegUsedAfter(MI, Reg)) {
Expand Down
Loading