Eliminate PHI nodes with constant values during normal GVN processing, even when
authorOwen Anderson <resistor@mac.com>
Tue, 14 Aug 2007 18:33:27 +0000 (18:33 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 14 Aug 2007 18:33:27 +0000 (18:33 +0000)
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

index a7e22dd583e4088ac41cb9114e10f0c26c7120f8..d1a15c10816fa53b74a08117c2fc0d0256883665 100644 (file)
@@ -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);