[llvm-commits] CVS: llvm/lib/VMCore/Instructions.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu Aug 4 18:01:10 PDT 2005



Changes in directory llvm/lib/VMCore:

Instructions.cpp updated: 1.23 -> 1.24
---
Log message:

Use the bool argument to hasConstantValue to decide whether the client is
prepared to deal with return values that do not dominate the PHI.  If we
cannot prove that the result dominates the PHI node, do not return it if
the client can't cope.


---
Diffs of the changes:  (+14 -2)

 Instructions.cpp |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)


Index: llvm/lib/VMCore/Instructions.cpp
diff -u llvm/lib/VMCore/Instructions.cpp:1.23 llvm/lib/VMCore/Instructions.cpp:1.24
--- llvm/lib/VMCore/Instructions.cpp:1.23	Thu Aug  4 19:49:06 2005
+++ llvm/lib/VMCore/Instructions.cpp	Thu Aug  4 20:00:58 2005
@@ -144,9 +144,11 @@
   // the PHI node with the incoming value.
   //
   Value *InVal = 0;
+  bool HasUndefInput = false;
   for (unsigned i = 0, e = getNumIncomingValues(); i != e; ++i)
-    if (getIncomingValue(i) != this &&  // Not the PHI node itself...
-        !isa<UndefValue>(getIncomingValue(i)))
+    if (isa<UndefValue>(getIncomingValue(i)))
+      HasUndefInput = true;
+    else if (getIncomingValue(i) != this)  // Not the PHI node itself...
       if (InVal && getIncomingValue(i) != InVal)
         return 0;  // Not the same, bail out.
       else
@@ -158,6 +160,16 @@
   //
   if (InVal == 0) InVal = UndefValue::get(getType());
   
+  // If we have a PHI node like phi(X, undef, X), where X is defined by some
+  // instruction, we cannot always return X as the result of the PHI node.  Only
+  // do this if X is not an instruction (thus it must dominate the PHI block),
+  // or if the client is prepared to deal with this possibility.
+  if (HasUndefInput && !AllowNonDominatingInstruction)
+    if (Instruction *IV = dyn_cast<Instruction>(InVal))
+      // If it's in the entry block, it dominates everything.
+      if (IV->getParent() != &IV->getParent()->getParent()->front())
+        return 0;   // Cannot guarantee that InVal dominates this PHINode.
+
   // All of the incoming values are the same, return the value now.
   return InVal;
 }






More information about the llvm-commits mailing list