[llvm-commits] CVS: llvm/lib/Transforms/Scalar/GVNPRE.cpp
Owen Anderson
resistor at mac.com
Fri Jun 22 14:31:41 PDT 2007
Changes in directory llvm/lib/Transforms/Scalar:
GVNPRE.cpp updated: 1.54 -> 1.55
---
Log message:
Rework topo_sort so eliminate some behavior that scaled terribly. This reduces the time to optimize 403.gcc from 18.2s to 17.5s,
and has an even larger effect on larger testcases.
---
Diffs of the changes: (+40 -57)
GVNPRE.cpp | 97 +++++++++++++++++++++++++------------------------------------
1 files changed, 40 insertions(+), 57 deletions(-)
Index: llvm/lib/Transforms/Scalar/GVNPRE.cpp
diff -u llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.54 llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.55
--- llvm/lib/Transforms/Scalar/GVNPRE.cpp:1.54 Fri Jun 22 13:27:04 2007
+++ llvm/lib/Transforms/Scalar/GVNPRE.cpp Fri Jun 22 16:31:16 2007
@@ -650,71 +650,54 @@
/// topo_sort - Given a set of values, sort them by topological
/// order into the provided vector.
void GVNPRE::topo_sort(SmallPtrSet<Value*, 32>& set, std::vector<Value*>& vec) {
- SmallPtrSet<Value*, 32> toErase;
+ SmallPtrSet<Value*, 32> visited;
+ std::vector<Value*> stack;
for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
I != E; ++I) {
- if (BinaryOperator* BO = dyn_cast<BinaryOperator>(*I))
- for (SmallPtrSet<Value*, 32>::iterator SI = set.begin(); SI != E; ++SI) {
- if (VN.lookup(BO->getOperand(0)) == VN.lookup(*SI) ||
- VN.lookup(BO->getOperand(1)) == VN.lookup(*SI)) {
- toErase.insert(*SI);
+ if (visited.count(*I) == 0)
+ stack.push_back(*I);
+
+ while (!stack.empty()) {
+ Value* e = stack.back();
+
+ if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
+ Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
+ Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
+
+ if (l != 0 && isa<Instruction>(l) &&
+ visited.count(l) == 0)
+ stack.push_back(l);
+ else if (r != 0 && isa<Instruction>(r) &&
+ visited.count(r) == 0)
+ stack.push_back(r);
+ else {
+ vec.push_back(e);
+ visited.insert(e);
+ stack.pop_back();
}
- }
- else if (CmpInst* C = dyn_cast<CmpInst>(*I))
- for (SmallPtrSet<Value*, 32>::iterator SI = set.begin(); SI != E; ++SI) {
- if (VN.lookup(C->getOperand(0)) == VN.lookup(*SI) ||
- VN.lookup(C->getOperand(1)) == VN.lookup(*SI)) {
- toErase.insert(*SI);
+ } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
+ Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
+ Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
+
+ if (l != 0 && isa<Instruction>(l) &&
+ visited.count(l) == 0)
+ stack.push_back(l);
+ else if (r != 0 && isa<Instruction>(r) &&
+ visited.count(r) == 0)
+ stack.push_back(r);
+ else {
+ vec.push_back(e);
+ visited.insert(e);
+ stack.pop_back();
}
- }
- }
-
- std::vector<Value*> Q;
- for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
- I != E; ++I) {
- if (toErase.count(*I) == 0)
- Q.push_back(*I);
- }
-
- SmallPtrSet<Value*, 32> visited;
- while (!Q.empty()) {
- Value* e = Q.back();
-
- if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
- Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
- Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
-
- if (l != 0 && isa<Instruction>(l) &&
- visited.count(l) == 0)
- Q.push_back(l);
- else if (r != 0 && isa<Instruction>(r) &&
- visited.count(r) == 0)
- Q.push_back(r);
- else {
- vec.push_back(e);
+ } else {
visited.insert(e);
- Q.pop_back();
- }
- } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
- Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
- Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
-
- if (l != 0 && isa<Instruction>(l) &&
- visited.count(l) == 0)
- Q.push_back(l);
- else if (r != 0 && isa<Instruction>(r) &&
- visited.count(r) == 0)
- Q.push_back(r);
- else {
vec.push_back(e);
- visited.insert(e);
- Q.pop_back();
+ stack.pop_back();
}
- } else {
- visited.insert(e);
- vec.push_back(e);
- Q.pop_back();
}
+
+ stack.clear();
}
}
More information about the llvm-commits
mailing list