[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp
Owen Anderson
resistor at mac.com
Mon Jun 4 11:05:46 PDT 2007
Changes in directory llvm/lib/Transforms/Scalar:
GVNPRE.cpp updated: 1.15 -> 1.16
---
Log message:
Make phi_translate correct.
---
Diffs of the changes: (+50 -47)
GVNPRE.cpp | 97 +++++++++++++++++++++++++++++++------------------------------
1 files changed, 50 insertions(+), 47 deletions(-)
Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.15 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.16
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.15 Sun Jun 3 19:32:21 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp Mon Jun 4 13:05:26 2007
@@ -78,7 +78,10 @@
void clean(ValueTable VN, std::set<Value*, ExprLT>& set);
bool add(ValueTable& VN, std::set<Value*, ExprLT>& MS, Value* V);
Value* find_leader(ValueTable VN, std::set<Value*, ExprLT>& vals, uint32_t v);
- void phi_translate(ValueTable& VN, std::set<Value*, ExprLT>& MS,
+ Value* phi_translate(ValueTable& VN, std::set<Value*, ExprLT>& MS,
+ std::set<Value*, ExprLT>& set,
+ Value* V, BasicBlock* pred);
+ void phi_translate_set(ValueTable& VN, std::set<Value*, ExprLT>& MS,
std::set<Value*, ExprLT>& anticIn, BasicBlock* B,
std::set<Value*, ExprLT>& out);
@@ -128,53 +131,52 @@
return 0;
}
-void GVNPRE::phi_translate(GVNPRE::ValueTable& VN,
+Value* GVNPRE::phi_translate(ValueTable& VN, std::set<Value*, ExprLT>& MS,
+ std::set<Value*, ExprLT>& set,
+ Value* V, BasicBlock* pred) {
+ if (V == 0)
+ return 0;
+
+ if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
+ Value* newOp1 = phi_translate(VN, MS, set,
+ find_leader(VN, set, VN[BO->getOperand(0)]),
+ pred);
+ if (newOp1 == 0)
+ return 0;
+
+ Value* newOp2 = phi_translate(VN, MS, set,
+ find_leader(VN, set, VN[BO->getOperand(1)]),
+ pred);
+ if (newOp2 == 0)
+ return 0;
+
+ if (newOp1 != BO->getOperand(0) || newOp2 != BO->getOperand(1)) {
+ Value* newVal = BinaryOperator::create(BO->getOpcode(),
+ newOp1, newOp2,
+ BO->getName()+".gvnpre");
+ add(VN, MS, newVal);
+ if (!find_leader(VN, set, VN[newVal]))
+ return newVal;
+ else
+ return 0;
+ }
+ } else if (PHINode* P = dyn_cast<PHINode>(V)) {
+ if (P->getParent() == pred->getTerminator()->getSuccessor(0))
+ return P->getIncomingValueForBlock(pred);
+ }
+
+ return V;
+}
+
+void GVNPRE::phi_translate_set(GVNPRE::ValueTable& VN,
std::set<Value*, ExprLT>& MS,
std::set<Value*, ExprLT>& anticIn, BasicBlock* B,
std::set<Value*, ExprLT>& out) {
- BasicBlock* succ = B->getTerminator()->getSuccessor(0);
-
- for (std::set<Value*, ExprLT>::iterator I = anticIn.begin(), E = anticIn.end();
- I != E; ++I) {
- if (!isa<BinaryOperator>(*I)) {
- if (PHINode* p = dyn_cast<PHINode>(*I)) {
- if (p->getParent() == succ)
- out.insert(p);
- } else {
- out.insert(*I);
- }
- } else {
- BinaryOperator* BO = cast<BinaryOperator>(*I);
- Value* lhs = find_leader(VN, anticIn, VN[BO->getOperand(0)]);
- if (lhs == 0)
- continue;
-
- if (PHINode* p = dyn_cast<PHINode>(lhs))
- if (p->getParent() == succ) {
- lhs = p->getIncomingValueForBlock(B);
- out.insert(lhs);
- }
-
- Value* rhs = find_leader(VN, anticIn, VN[BO->getOperand(1)]);
- if (rhs == 0)
- continue;
-
- if (PHINode* p = dyn_cast<PHINode>(rhs))
- if (p->getParent() == succ) {
- rhs = p->getIncomingValueForBlock(B);
- out.insert(rhs);
- }
-
- if (lhs != BO->getOperand(0) || rhs != BO->getOperand(1)) {
- BO = BinaryOperator::create(BO->getOpcode(), lhs, rhs, BO->getName()+".gvnpre");
- if (VN.insert(std::make_pair(BO, nextValueNumber)).second)
- nextValueNumber++;
- MS.insert(BO);
- }
-
- out.insert(BO);
-
- }
+ for (std::set<Value*, ExprLT>::iterator I = anticIn.begin(),
+ E = anticIn.end(); I != E; ++I) {
+ Value* V = phi_translate(VN, MS, anticIn, *I, B);
+ if (V != 0)
+ out.insert(V);
}
}
@@ -371,9 +373,9 @@
if (BB->getTerminator()->getNumSuccessors() == 1) {
if (visited.find(BB) == visited.end())
- phi_translate(VN, maximalSet, anticIn, BB, anticOut);
+ phi_translate_set(VN, maximalSet, anticIn, BB, anticOut);
else
- phi_translate(VN, anticIn, anticIn, BB, anticOut);
+ phi_translate_set(VN, anticIn, anticIn, BB, anticOut);
} else if (BB->getTerminator()->getNumSuccessors() > 1) {
for (unsigned i = 0; i < BB->getTerminator()->getNumSuccessors(); ++i) {
BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
@@ -419,6 +421,7 @@
anticOut.clear();
}
+
iterations++;
}
More information about the llvm-commits
mailing list