diff options
author | Owen Anderson <resistor@mac.com> | 2007-08-14 18:33:27 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-08-14 18:33:27 +0000 |
commit | 98f6a6b708c8c3c246ef46092c1abaa6f3b415b9 (patch) | |
tree | a9cc0fd1e812fd8f61e85a324b8290de615c0758 /lib/Transforms | |
parent | f631bb6139f1a65b1f88f65c64031c501b439bc1 (diff) | |
download | external_llvm-98f6a6b708c8c3c246ef46092c1abaa6f3b415b9.zip external_llvm-98f6a6b708c8c3c246ef46092c1abaa6f3b415b9.tar.gz external_llvm-98f6a6b708c8c3c246ef46092c1abaa6f3b415b9.tar.bz2 |
Eliminate PHI nodes with constant values during normal GVN processing, even when
they're not related to eliminating a load.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41081 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/GVN.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index a7e22dd..d1a15c1 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -946,7 +946,27 @@ bool GVN::processInstruction(Instruction* I, unsigned num = VN.lookup_or_add(I); - if (currAvail.test(num)) { + if (PHINode* p = dyn_cast<PHINode>(I)) { + Value* constVal = p->hasConstantValue(); + + if (constVal) { + if (Instruction* inst = dyn_cast<Instruction>(constVal)) { + DominatorTree &DT = getAnalysis<DominatorTree>(); + if (DT.dominates(inst, p)) { + for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end(); + PI != PE; ++PI) + if (PI->second.count(p)) + PI->second.erase(p); + + p->replaceAllUsesWith(inst); + toErase.push_back(p); + } + } else { + p->replaceAllUsesWith(constVal); + toErase.push_back(p); + } + } + } else if (currAvail.test(num)) { Value* repl = find_leader(currAvail, num); VN.erase(I); |