[llvm-commits] CVS: llvm/lib/CodeGen/MachineFunction.cpp

Chris Lattner sabre at nondot.org
Tue Oct 3 14:19:13 CDT 2006



Changes in directory llvm/lib/CodeGen:

MachineFunction.cpp updated: 1.100 -> 1.101
---
Log message:

Provide a function that ensures MBB numbering is dense and inorder.  This 
can be used by MachineFunctionPasses who need this property.


---
Diffs of the changes:  (+47 -0)

 MachineFunction.cpp |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+)


Index: llvm/lib/CodeGen/MachineFunction.cpp
diff -u llvm/lib/CodeGen/MachineFunction.cpp:1.100 llvm/lib/CodeGen/MachineFunction.cpp:1.101
--- llvm/lib/CodeGen/MachineFunction.cpp:1.100	Thu Sep 14 02:41:12 2006
+++ llvm/lib/CodeGen/MachineFunction.cpp	Tue Oct  3 14:18:57 2006
@@ -132,6 +132,53 @@
   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 {






More information about the llvm-commits mailing list