mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Provide a function that ensures MBB numbering is dense and inorder. This
can be used by MachineFunctionPasses who need this property. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30706 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -224,8 +224,16 @@ public:
|
||||
}
|
||||
|
||||
/// getNumBlockIDs - Return the number of MBB ID's allocated.
|
||||
///
|
||||
unsigned getNumBlockIDs() const { return MBBNumbering.size(); }
|
||||
|
||||
/// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
|
||||
/// recomputes them. This guarantees that the MBB numbers are sequential,
|
||||
/// dense, and match the ordering of the blocks within the function. If a
|
||||
/// specific MachineBasicBlock is specified, only that block and those after
|
||||
/// it are renumbered.
|
||||
void RenumberBlocks(MachineBasicBlock *MBBFrom = 0);
|
||||
|
||||
/// print - Print out the MachineFunction in a format suitable for debugging
|
||||
/// to the specified stream.
|
||||
///
|
||||
|
@@ -132,6 +132,53 @@ MachineFunction::~MachineFunction() {
|
||||
delete[] UsedPhysRegs;
|
||||
}
|
||||
|
||||
|
||||
/// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
|
||||
/// recomputes them. This guarantees that the MBB numbers are sequential,
|
||||
/// dense, and match the ordering of the blocks within the function. If a
|
||||
/// specific MachineBasicBlock is specified, only that block and those after
|
||||
/// it are renumbered.
|
||||
void MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) {
|
||||
if (empty()) { MBBNumbering.clear(); return; }
|
||||
MachineFunction::iterator MBBI, E = end();
|
||||
if (MBB == 0)
|
||||
MBBI = begin();
|
||||
else
|
||||
MBBI = MBB;
|
||||
|
||||
// Figure out the block number this should have.
|
||||
unsigned BlockNo = 0;
|
||||
if (MBB != &front()) {
|
||||
MachineFunction::iterator I = MBB;
|
||||
--I;
|
||||
BlockNo = I->getNumber()+1;
|
||||
}
|
||||
|
||||
for (; MBBI != E; ++MBBI, ++BlockNo) {
|
||||
if (MBBI->getNumber() != (int)BlockNo) {
|
||||
// Remove use of the old number.
|
||||
if (MBBI->getNumber() != -1) {
|
||||
assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
|
||||
"MBB number mismatch!");
|
||||
MBBNumbering[MBBI->getNumber()] = 0;
|
||||
}
|
||||
|
||||
// If BlockNo is already taken, set that block's number to -1.
|
||||
if (MBBNumbering[BlockNo])
|
||||
MBBNumbering[BlockNo]->setNumber(-1);
|
||||
|
||||
MBBNumbering[BlockNo] = MBBI;
|
||||
MBBI->setNumber(BlockNo);
|
||||
}
|
||||
}
|
||||
|
||||
// Okay, all the blocks are renumbered. If we have compactified the block
|
||||
// numbering, shrink MBBNumbering now.
|
||||
assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
|
||||
MBBNumbering.resize(BlockNo);
|
||||
}
|
||||
|
||||
|
||||
void MachineFunction::dump() const { print(std::cerr); }
|
||||
|
||||
void MachineFunction::print(std::ostream &OS) const {
|
||||
|
Reference in New Issue
Block a user