forked from OSchip/llvm-project
[NFC][RDA] Break-up initialization code
Separate out the initialization code from the loop traversal so that the analysis can be reset and re-run by a user.
This commit is contained in:
parent
083717cf49
commit
659500c0c9
|
@ -37,6 +37,7 @@ class ReachingDefAnalysis : public MachineFunctionPass {
|
||||||
private:
|
private:
|
||||||
MachineFunction *MF;
|
MachineFunction *MF;
|
||||||
const TargetRegisterInfo *TRI;
|
const TargetRegisterInfo *TRI;
|
||||||
|
LoopTraversal::TraversalOrder TraversedMBBOrder;
|
||||||
unsigned NumRegUnits;
|
unsigned NumRegUnits;
|
||||||
/// Instruction that defined each register, relative to the beginning of the
|
/// Instruction that defined each register, relative to the beginning of the
|
||||||
/// current basic block. When a LiveRegsDefInfo is used to represent a
|
/// current basic block. When a LiveRegsDefInfo is used to represent a
|
||||||
|
@ -93,6 +94,15 @@ public:
|
||||||
MachineFunctionProperties::Property::TracksLiveness);
|
MachineFunctionProperties::Property::TracksLiveness);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Re-run the analysis.
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
/// Initialize data structures.
|
||||||
|
void init();
|
||||||
|
|
||||||
|
/// Traverse the machine function, mapping definitions.
|
||||||
|
void traverse();
|
||||||
|
|
||||||
/// Provides the instruction id of the closest reaching def instruction of
|
/// Provides the instruction id of the closest reaching def instruction of
|
||||||
/// PhysReg that reaches MI, relative to the begining of MI's basic block.
|
/// PhysReg that reaches MI, relative to the begining of MI's basic block.
|
||||||
int getReachingDef(MachineInstr *MI, int PhysReg) const;
|
int getReachingDef(MachineInstr *MI, int PhysReg) const;
|
||||||
|
|
|
@ -136,30 +136,9 @@ void ReachingDefAnalysis::processBasicBlock(
|
||||||
bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) {
|
bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) {
|
||||||
MF = &mf;
|
MF = &mf;
|
||||||
TRI = MF->getSubtarget().getRegisterInfo();
|
TRI = MF->getSubtarget().getRegisterInfo();
|
||||||
|
|
||||||
LiveRegs.clear();
|
|
||||||
NumRegUnits = TRI->getNumRegUnits();
|
|
||||||
|
|
||||||
MBBReachingDefs.resize(mf.getNumBlockIDs());
|
|
||||||
|
|
||||||
LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n");
|
LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n");
|
||||||
|
init();
|
||||||
// Initialize the MBBOutRegsInfos
|
traverse();
|
||||||
MBBOutRegsInfos.resize(mf.getNumBlockIDs());
|
|
||||||
|
|
||||||
// Traverse the basic blocks.
|
|
||||||
LoopTraversal Traversal;
|
|
||||||
LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf);
|
|
||||||
for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) {
|
|
||||||
processBasicBlock(TraversedMBB);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sorting all reaching defs found for a ceartin reg unit in a given BB.
|
|
||||||
for (MBBDefsInfo &MBBDefs : MBBReachingDefs) {
|
|
||||||
for (MBBRegUnitDefs &RegUnitDefs : MBBDefs)
|
|
||||||
llvm::sort(RegUnitDefs);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,6 +147,33 @@ void ReachingDefAnalysis::releaseMemory() {
|
||||||
MBBOutRegsInfos.clear();
|
MBBOutRegsInfos.clear();
|
||||||
MBBReachingDefs.clear();
|
MBBReachingDefs.clear();
|
||||||
InstIds.clear();
|
InstIds.clear();
|
||||||
|
LiveRegs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReachingDefAnalysis::reset() {
|
||||||
|
releaseMemory();
|
||||||
|
init();
|
||||||
|
traverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReachingDefAnalysis::init() {
|
||||||
|
NumRegUnits = TRI->getNumRegUnits();
|
||||||
|
MBBReachingDefs.resize(MF->getNumBlockIDs());
|
||||||
|
// Initialize the MBBOutRegsInfos
|
||||||
|
MBBOutRegsInfos.resize(MF->getNumBlockIDs());
|
||||||
|
LoopTraversal Traversal;
|
||||||
|
TraversedMBBOrder = Traversal.traverse(*MF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReachingDefAnalysis::traverse() {
|
||||||
|
// Traverse the basic blocks.
|
||||||
|
for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder)
|
||||||
|
processBasicBlock(TraversedMBB);
|
||||||
|
// Sorting all reaching defs found for a ceartin reg unit in a given BB.
|
||||||
|
for (MBBDefsInfo &MBBDefs : MBBReachingDefs) {
|
||||||
|
for (MBBRegUnitDefs &RegUnitDefs : MBBDefs)
|
||||||
|
llvm::sort(RegUnitDefs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, int PhysReg) const {
|
int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, int PhysReg) const {
|
||||||
|
|
Loading…
Reference in New Issue