diff options
author | Owen Anderson <resistor@mac.com> | 2007-07-10 00:09:25 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-07-10 00:09:25 +0000 |
commit | a05a81b10ae6e2fc4f22a59bdb7c7417cca41cfd (patch) | |
tree | 052a1d60ba96760fa760fe4e31b434f62099a2e8 | |
parent | 2038252c6a36efd18cc0bef216fa2c5bb9236617 (diff) |
Use a cheaper test, delaying calling find_leader() until we know that it's necessary. This improves
the time to optimize Anton's testcase from 21.1s to 17.6s.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@38479 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/GVNPRE.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index 4a5dca9409..007c677719 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -565,6 +565,7 @@ class ValueNumberedSet { bool insert(Value* v) { return contents.insert(v); } void insert(iterator I, iterator E) { contents.insert(I, E); } void erase(Value* v) { contents.erase(v); } + unsigned count(Value* v) { return contents.count(v); } size_t size() { return contents.size(); } void set(unsigned i) { @@ -1173,15 +1174,16 @@ bool GVNPRE::elimination() { isa<ShuffleVectorInst>(BI) || isa<InsertElementInst>(BI) || isa<ExtractElementInst>(BI) || isa<SelectInst>(BI) || isa<CastInst>(BI) || isa<GetElementPtrInst>(BI)) { - Value *leader = find_leader(availableOut[BB], VN.lookup(BI)); - - if (leader != 0) + + if (availableOut[BB].test(VN.lookup(BI)) && ! availableOut[BB].count(BI)) { + Value *leader = find_leader(availableOut[BB], VN.lookup(BI)); 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; } + } } } } |