diff options
| author | Owen Anderson <resistor@mac.com> | 2008-07-03 17:44:33 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2008-07-03 17:44:33 +0000 |
| commit | 3ea90a7d55033ff21c96a20cd27b019e8a5f5093 (patch) | |
| tree | 757178da16f123cbb488cdac9ab634d156265a8d /llvm | |
| parent | 4cab581bc0a50a8e95231b701131da755d09b363 (diff) | |
| download | bcm5719-llvm-3ea90a7d55033ff21c96a20cd27b019e8a5f5093.tar.gz bcm5719-llvm-3ea90a7d55033ff21c96a20cd27b019e8a5f5093.zip | |
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%.
llvm-svn: 53108
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/GVN.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 498785e327a..86a8238ee42 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/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)); } |

