[llvm-commits] [llvm] r41998 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Owen Anderson resistor at mac.com
Sun Sep 16 01:04:16 PDT 2007


Author: resistor
Date: Sun Sep 16 03:04:16 2007
New Revision: 41998

URL: http://llvm.org/viewvc/llvm-project?rev=41998&view=rev
Log:
Be more careful when constant-folding PHI nodes.

Modified:
    llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=41998&r1=41997&r2=41998&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Sun Sep 16 03:04:16 2007
@@ -673,6 +673,7 @@
     void dump(DenseMap<BasicBlock*, Value*>& d);
     bool iterateOnFunction(Function &F);
     Value* CollapsePhi(PHINode* p);
+    bool isSafeReplacement(PHINode* p, Instruction* inst);
   };
   
   char GVN::ID = 0;
@@ -731,7 +732,8 @@
   if (constVal) {
     if (Instruction* inst = dyn_cast<Instruction>(constVal)) {
       if (DT.dominates(inst, p))
-        return inst;
+        if (isSafeReplacement(p, inst))
+          return inst;
     } else {
       return constVal;
     }
@@ -740,6 +742,19 @@
   return 0;
 }
 
+bool GVN::isSafeReplacement(PHINode* p, Instruction* inst) {
+  if (!isa<PHINode>(inst))
+    return true;
+  
+  for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
+       UI != E; ++UI)
+    if (PHINode* use_phi = dyn_cast<PHINode>(UI))
+      if (use_phi->getParent() == inst->getParent())
+        return false;
+  
+  return true;
+}
+
 /// GetValueForBlock - Get the value to use within the specified basic block.
 /// available values are in Phis.
 Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,





More information about the llvm-commits mailing list