[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp
Owen Anderson
resistor at mac.com
Tue Jun 12 09:58:13 PDT 2007
Changes in directory llvm/lib/Transforms/Scalar:
GVNPRE.cpp updated: 1.30 -> 1.31
---
Log message:
Refactor some code, and fix test/Transforms/GVNPRE/2007-06-12-NoExit.ll by being more careful when using
post-dominator information.
---
Diffs of the changes: (+69 -47)
GVNPRE.cpp | 116 ++++++++++++++++++++++++++++++++++++-------------------------
1 files changed, 69 insertions(+), 47 deletions(-)
Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.30 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.31
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.30 Mon Jun 11 19:50:47 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp Tue Jun 12 11:57:50 2007
@@ -131,6 +131,9 @@
std::set<Value*>& currTemps,
std::set<Value*, ExprLT>& currAvail,
std::map<BasicBlock*, std::set<Value*, ExprLT> > availOut);
+ void cleanup();
+ void elimination(std::map<BasicBlock*,
+ std::set<Value*, ExprLT> >& availOut);
};
@@ -482,6 +485,61 @@
}
}
+void GVNPRE::elimination(std::map<BasicBlock*,
+ std::set<Value*, ExprLT> >& availableOut) {
+ DOUT << "\n\nPhase 3: Elimination\n\n";
+
+ std::vector<std::pair<Instruction*, Value*> > replace;
+ std::vector<Instruction*> erase;
+
+ DominatorTree& DT = getAnalysis<DominatorTree>();
+
+ for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
+ E = df_end(DT.getRootNode()); DI != E; ++DI) {
+ BasicBlock* BB = DI->getBlock();
+
+ DOUT << "Block: " << BB->getName() << "\n";
+ dump_unique(availableOut[BB]);
+ DOUT << "\n\n";
+
+ for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
+ BI != BE; ++BI) {
+
+ if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI)) {
+ Value *leader = find_leader(availableOut[BB], BI);
+
+ if (leader != 0)
+ if (Instruction* Instr = dyn_cast<Instruction>(leader))
+ if (Instr->getParent() != 0 && Instr != BI) {
+ replace.push_back(std::make_pair(BI, leader));
+ erase.push_back(BI);
+ ++NumEliminated;
+ }
+ }
+ }
+ }
+
+ while (!replace.empty()) {
+ std::pair<Instruction*, Value*> rep = replace.back();
+ replace.pop_back();
+ rep.first->replaceAllUsesWith(rep.second);
+ }
+
+ for (std::vector<Instruction*>::iterator I = erase.begin(), E = erase.end();
+ I != E; ++I)
+ (*I)->eraseFromParent();
+}
+
+
+void GVNPRE::cleanup() {
+ while (!createdExpressions.empty()) {
+ Instruction* I = createdExpressions.back();
+ createdExpressions.pop_back();
+
+ delete I;
+ }
+}
+
bool GVNPRE::runOnFunction(Function &F) {
VN.clear();
MS.clear();
@@ -517,7 +575,15 @@
dump_unique(MS);
DOUT << "\n";
+ // If function has no exit blocks, only perform GVN
PostDominatorTree &PDT = getAnalysis<PostDominatorTree>();
+ if (PDT[&F.getEntryBlock()] == 0) {
+ elimination(availableOut);
+ cleanup();
+
+ return true;
+ }
+
// Phase 1, Part 2: calculate ANTIC_IN
@@ -634,7 +700,6 @@
DOUT << "\n";
}
-
// Phase 2: Insert
DOUT<< "\nPhase 2: Insertion\n";
@@ -826,53 +891,10 @@
}
// Phase 3: Eliminate
- DOUT << "\n\nPhase 3: Elimination\n\n";
-
- std::vector<std::pair<Instruction*, Value*> > replace;
- std::vector<Instruction*> erase;
-
- for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
- E = df_end(DT.getRootNode()); DI != E; ++DI) {
- BasicBlock* BB = DI->getBlock();
-
- DOUT << "Block: " << BB->getName() << "\n";
- dump_unique(availableOut[BB]);
- DOUT << "\n\n";
-
- for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
- BI != BE; ++BI) {
-
- if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI)) {
- Value *leader = find_leader(availableOut[BB], BI);
-
- if (leader != 0)
- if (Instruction* Instr = dyn_cast<Instruction>(leader))
- if (Instr->getParent() != 0 && Instr != BI) {
- replace.push_back(std::make_pair(BI, leader));
- erase.push_back(BI);
- ++NumEliminated;
- }
- }
- }
- }
-
- while (!replace.empty()) {
- std::pair<Instruction*, Value*> rep = replace.back();
- replace.pop_back();
- rep.first->replaceAllUsesWith(rep.second);
- }
-
- for (std::vector<Instruction*>::iterator I = erase.begin(), E = erase.end();
- I != E; ++I)
- (*I)->eraseFromParent();
+ elimination(availableOut);
// Phase 4: Cleanup
- while (!createdExpressions.empty()) {
- Instruction* I = createdExpressions.back();
- createdExpressions.pop_back();
-
- delete I;
- }
+ cleanup();
- return false;
+ return true;
}
More information about the llvm-commits
mailing list