Handle constants in phi nodes properly. This fixes test/Transforms/GVNPRE/2007-06...
authorOwen Anderson <resistor@mac.com>
Tue, 19 Jun 2007 07:35:36 +0000 (07:35 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 19 Jun 2007 07:35:36 +0000 (07:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37655 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVNPRE.cpp

index 9b0666494b423cc6245c32f476b4ffdd78cd34c2..15fecca0d8d56d6cc6b359e3b00eecb39da4b9ba 100644 (file)
@@ -927,7 +927,16 @@ bool GVNPRE::runOnFunction(Function &F) {
       
       for (std::set<Value*>::iterator I = S.begin(), E = S.end();
            I != E; ++I) {
-        if (find_leader(anticIn, VN.lookup(*I)) == 0)
+        // For non-opaque values, we should already have a value numbering.
+        // However, for opaques, such as constants within PHI nodes, it is
+        // possible that they have not yet received a number.  Make sure they do
+        // so now.
+        uint32_t valNum = 0;
+        if (isa<BinaryOperator>(*I) || isa<CmpInst>(*I))
+          valNum = VN.lookup(*I);
+        else
+          valNum = VN.lookup_or_add(*I);
+        if (find_leader(anticIn, valNum) == 0)
           val_insert(anticIn, *I);
       }