From 31f496755a421a4bc0d07e7c927a14ee50d58763 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Tue, 14 Aug 2007 18:33:27 +0000 Subject: [PATCH] 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 --- lib/Transforms/Scalar/GVN.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index a7e22dd583e..d1a15c10816 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(I)) { + Value* constVal = p->hasConstantValue(); + + if (constVal) { + if (Instruction* inst = dyn_cast(constVal)) { + DominatorTree &DT = getAnalysis(); + 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);