[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp
Owen Anderson
resistor at mac.com
Tue Jun 26 16:30:02 PDT 2007
Changes in directory llvm/lib/Transforms/Scalar:
GVNPRE.cpp updated: 1.58 -> 1.59
---
Log message:
1. Correct some comments and clean up some dead code.
2. When calculating ANTIC_IN, only iterate the changed blocks. For most average
inputs this is a small speedup, but for cases with unusual CFGs, this can be a significant win.
---
Diffs of the changes: (+27 -22)
GVNPRE.cpp | 49 +++++++++++++++++++++++++++----------------------
1 files changed, 27 insertions(+), 22 deletions(-)
Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.58 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.59
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.58 Mon Jun 25 13:25:31 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp Tue Jun 26 18:29:41 2007
@@ -377,7 +377,7 @@
SmallPtrSet<Value*, 32>& currExps,
SmallPtrSet<Value*, 32>& currTemps,
std::set<BasicBlock*>& visited);
- unsigned buildsets(Function& F);
+ void buildsets(Function& F);
void insertion_pre(Value* e, BasicBlock* BB,
std::map<BasicBlock*, Value*>& avail,
@@ -895,7 +895,7 @@
/// buildsets - Phase 1 of the main algorithm. Construct the AVAIL_OUT
/// and the ANTIC_IN sets.
-unsigned GVNPRE::buildsets(Function& F) {
+void GVNPRE::buildsets(Function& F) {
std::map<BasicBlock*, SmallPtrSet<Value*, 32> > generatedExpressions;
std::map<BasicBlock*, SmallPtrSet<PHINode*, 32> > generatedPhis;
std::map<BasicBlock*, SmallPtrSet<Value*, 32> > generatedTemporaries;
@@ -937,32 +937,42 @@
// Phase 1, Part 2: calculate ANTIC_IN
std::set<BasicBlock*> visited;
+ SmallPtrSet<BasicBlock*, 4> block_changed;
+ for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
+ block_changed.insert(FI);
bool changed = true;
unsigned iterations = 0;
+
while (changed) {
changed = false;
SmallPtrSet<Value*, 32> anticOut;
- // Top-down walk of the postdominator tree
+ // Postorder walk of the CFG
for (po_iterator<BasicBlock*> BBI = po_begin(&F.getEntryBlock()),
BBE = po_end(&F.getEntryBlock()); BBI != BBE; ++BBI) {
BasicBlock* BB = *BBI;
- if (BB == 0)
- continue;
- unsigned ret = buildsets_anticin(BB, anticOut,generatedExpressions[BB],
- generatedTemporaries[BB], visited);
-
- if (ret == 0) {
- changed = true;
- continue;
- } else {
- visited.insert(BB);
- if (ret == 2) {
- DOUT << "CHANGED: " << BB->getName() << "\n";
+ if (block_changed.count(BB) != 0) {
+ unsigned ret = buildsets_anticin(BB, anticOut,generatedExpressions[BB],
+ generatedTemporaries[BB], visited);
+
+ if (ret == 0) {
+ changed = true;
+ continue;
+ } else {
+ visited.insert(BB);
+
+ if (ret == 2)
+ for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
+ PI != PE; ++PI) {
+ block_changed.insert(*PI);
+ }
+ else
+ block_changed.erase(BB);
+
+ changed |= (ret == 2);
}
- changed |= (ret == 2);
}
}
@@ -970,8 +980,6 @@
}
DOUT << "ITERATIONS: " << iterations << "\n";
-
- return 0; // No bail, no changes
}
/// insertion_pre - When a partial redundancy has been identified, eliminate it
@@ -1173,10 +1181,7 @@
// This phase calculates the AVAIL_OUT and ANTIC_IN sets
// NOTE: If full postdom information is no available, this will bail
// early, performing GVN but not PRE
- unsigned bail = buildsets(F);
- //If a bail occurred, terminate early
- if (bail != 0)
- return (bail == 2);
+ buildsets(F);
// Phase 2: Insert
// This phase inserts values to make partially redundant values
More information about the llvm-commits
mailing list