summaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-07-03 17:44:33 +0000
committerOwen Anderson <resistor@mac.com>2008-07-03 17:44:33 +0000
commit0ae33ef202b1318888220f147e248af4b994dffc (patch)
tree4e5f8f6c6d9c7e94cd75df1a894da270839b5ea2 /lib/Transforms/Scalar
parent77a01136ff62502b0340c2749c6f708151018533 (diff)
downloadllvm-0ae33ef202b1318888220f147e248af4b994dffc.tar.gz
llvm-0ae33ef202b1318888220f147e248af4b994dffc.tar.bz2
llvm-0ae33ef202b1318888220f147e248af4b994dffc.tar.xz
Use information already present in the ValueTable to fast-fail when we know there won't be a value number match. This speeds up GVN on a case where there are very few redundancies by ~25%.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53108 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r--lib/Transforms/Scalar/GVN.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp
index 498785e327..86a8238ee4 100644
--- a/lib/Transforms/Scalar/GVN.cpp
+++ b/lib/Transforms/Scalar/GVN.cpp
@@ -166,6 +166,7 @@ namespace {
void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
void setDomTree(DominatorTree* D) { DT = D; }
+ uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
};
}
@@ -1058,11 +1059,12 @@ bool GVN::processInstruction(Instruction *I,
return changed;
}
+ uint32_t nextNum = VN.getNextUnusedValueNumber();
unsigned num = VN.lookup_or_add(I);
// Allocations are always uniquely numbered, so we can save time and memory
// by fast failing them.
- if (isa<AllocationInst>(I)) {
+ if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
return false;
}
@@ -1082,6 +1084,13 @@ bool GVN::processInstruction(Instruction *I,
} else {
localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
}
+
+ // If the number we were assigned was a brand new VN, then we don't
+ // need to do a lookup to see if the number already exists
+ // somewhere in the domtree: it can't!
+ } else if (num == nextNum) {
+ localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
+
// Perform value-number based elimination
} else if (Value* repl = lookupNumber(I->getParent(), num)) {
// Remove it!
@@ -1092,7 +1101,7 @@ bool GVN::processInstruction(Instruction *I,
I->replaceAllUsesWith(repl);
toErase.push_back(I);
return true;
- } else if (!I->isTerminator()) {
+ } else {
localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
}