[llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp
Bill Wendling
isanbard at gmail.com
Tue Oct 3 00:20:36 PDT 2006
Changes in directory llvm/lib/CodeGen:
LiveVariables.cpp updated: 1.59 -> 1.60
---
Log message:
Fix for PR929: http://llvm.org/PR929 . The PHI nodes were being gone through for each instruction
in a successor block for every block...resulting in some O(N^k) algorithm
which wasn't very good for performance. Calculating this information up
front and keeping it in a map made it much faster.
---
Diffs of the changes: (+26 -21)
LiveVariables.cpp | 47 ++++++++++++++++++++++++++---------------------
1 files changed, 26 insertions(+), 21 deletions(-)
Index: llvm/lib/CodeGen/LiveVariables.cpp
diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.59 llvm/lib/CodeGen/LiveVariables.cpp:1.60
--- llvm/lib/CodeGen/LiveVariables.cpp:1.59 Tue Sep 5 15:19:27 2006
+++ llvm/lib/CodeGen/LiveVariables.cpp Tue Oct 3 02:20:20 2006
@@ -92,7 +92,6 @@
return std::binary_search(I->second.begin(), I->second.end(), Reg);
}
-
void LiveVariables::MarkVirtRegAliveInBlock(VarInfo &VRInfo,
MachineBasicBlock *MBB) {
unsigned BBNum = MBB->getNumber();
@@ -212,6 +211,8 @@
HandlePhysRegDef(I->first, 0);
}
+ analyzePHINodes(MF);
+
// Calculate live variable information in depth first order on the CFG of the
// function. This guarantees that we will see the definition of a virtual
// register before its uses due to dominance properties of SSA (except for PHI
@@ -288,26 +289,16 @@
// bottom of this basic block. We check all of our successor blocks to see
// if they have PHI nodes, and if so, we simulate an assignment at the end
// of the current block.
- for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(),
- E = MBB->succ_end(); SI != E; ++SI) {
- MachineBasicBlock *Succ = *SI;
-
- // PHI nodes are guaranteed to be at the top of the block...
- for (MachineBasicBlock::iterator MI = Succ->begin(), ME = Succ->end();
- MI != ME && MI->getOpcode() == TargetInstrInfo::PHI; ++MI) {
- for (unsigned i = 1; ; i += 2) {
- assert(MI->getNumOperands() > i+1 &&
- "Didn't find an entry for our predecessor??");
- if (MI->getOperand(i+1).getMachineBasicBlock() == MBB) {
- MachineOperand &MO = MI->getOperand(i);
- VarInfo &VRInfo = getVarInfo(MO.getReg());
- assert(VRInfo.DefInst && "Register use before def (or no def)!");
+ if (!PHIVarInfo[MBB].empty()) {
+ std::vector<unsigned>& VarInfoVec = PHIVarInfo[MBB];
- // Only mark it alive only in the block we are representing.
- MarkVirtRegAliveInBlock(VRInfo, MBB);
- break; // Found the PHI entry for this block.
- }
- }
+ for (std::vector<unsigned>::iterator I = VarInfoVec.begin(),
+ E = VarInfoVec.end(); I != E; ++I) {
+ VarInfo& VRInfo = getVarInfo(*I);
+ assert(VRInfo.DefInst && "Register use before def (or no def)!");
+
+ // Only mark it alive only in the block we are representing.
+ MarkVirtRegAliveInBlock(VRInfo, MBB);
}
}
@@ -362,6 +353,7 @@
assert(Visited.count(&*i) != 0 && "unreachable basic block found");
#endif
+ PHIVarInfo.clear();
return false;
}
@@ -450,4 +442,17 @@
RegistersDead.erase(I);
}
-
+/// analyzePHINodes - Gather information about the PHI nodes in here. In
+/// particular, we want to map the variable information of a virtual
+/// register which is used in a PHI node. We map that to the BB the vreg is
+/// coming from.
+///
+void LiveVariables::analyzePHINodes(const MachineFunction& Fn) {
+ for (MachineFunction::const_iterator I = Fn.begin(), E = Fn.end();
+ I != E; ++I)
+ for (MachineBasicBlock::const_iterator BBI = I->begin(), BBE = I->end();
+ BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI)
+ for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
+ PHIVarInfo[BBI->getOperand(i + 1).getMachineBasicBlock()].
+ push_back(BBI->getOperand(i).getReg());
+}
More information about the llvm-commits
mailing list