[llvm-commits] [llvm] r53383 - in /llvm/trunk: lib/VMCore/ConstantFold.cpp test/Transforms/ConstProp/2008-07-07-VectorCompare.ll

Chris Lattner sabre at nondot.org
Wed Jul 9 17:29:28 PDT 2008


Author: lattner
Date: Wed Jul  9 19:29:28 2008
New Revision: 53383

URL: http://llvm.org/viewvc/llvm-project?rev=53383&view=rev
Log:
Fix a case where vector comparison constant folding would cause an
infinite recursion.  part of PR2529

Modified:
    llvm/trunk/lib/VMCore/ConstantFold.cpp
    llvm/trunk/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll

Modified: llvm/trunk/lib/VMCore/ConstantFold.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantFold.cpp?rev=53383&r1=53382&r2=53383&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/ConstantFold.cpp (original)
+++ llvm/trunk/lib/VMCore/ConstantFold.cpp Wed Jul  9 19:29:28 2008
@@ -1348,43 +1348,43 @@
       return ConstantInt::get(Type::Int1Ty, R==APFloat::cmpGreaterThan ||
                                             R==APFloat::cmpEqual);
     }
-  } else if (const ConstantVector *CP1 = dyn_cast<ConstantVector>(C1)) {
-    if (const ConstantVector *CP2 = dyn_cast<ConstantVector>(C2)) {
-      // If we can constant fold the comparison of each element, constant fold
-      // the whole vector comparison.
-      SmallVector<Constant*, 4> Elts;
-      const Type *InEltTy = CP1->getOperand(0)->getType();
-      bool isFP = InEltTy->isFloatingPoint();
-      const Type *ResEltTy = InEltTy;
+  } else if (isa<VectorType>(C1->getType())) {
+    SmallVector<Constant*, 16> C1Elts, C2Elts;
+    C1->getVectorElements(C1Elts);
+    C2->getVectorElements(C2Elts);
+    
+    // If we can constant fold the comparison of each element, constant fold
+    // the whole vector comparison.
+    SmallVector<Constant*, 4> ResElts;
+    const Type *InEltTy = C1Elts[0]->getType();
+    bool isFP = InEltTy->isFloatingPoint();
+    const Type *ResEltTy = InEltTy;
+    if (isFP)
+      ResEltTy = IntegerType::get(InEltTy->getPrimitiveSizeInBits());
+    
+    for (unsigned i = 0, e = C1Elts.size(); i != e; ++i) {
+      // Compare the elements, producing an i1 result or constant expr.
+      Constant *C;
       if (isFP)
-        ResEltTy = IntegerType::get(InEltTy->getPrimitiveSizeInBits());
-      
-      for (unsigned i = 0, e = CP1->getNumOperands(); i != e; ++i) {
-        // Compare the elements, producing an i1 result or constant expr.
-        Constant *C;
-        if (isFP)
-          C = ConstantExpr::getFCmp(pred, CP1->getOperand(i),
-                                    CP2->getOperand(i));
+        C = ConstantExpr::getFCmp(pred, C1Elts[i], C2Elts[i]);
+      else
+        C = ConstantExpr::getICmp(pred, C1Elts[i], C2Elts[i]);
+
+      // If it is a bool or undef result, convert to the dest type.
+      if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
+        if (CI->isZero())
+          ResElts.push_back(Constant::getNullValue(ResEltTy));
         else
-          C = ConstantExpr::getICmp(pred, CP1->getOperand(i),
-                                    CP2->getOperand(i));
-
-        // If it is a bool or undef result, convert to the dest type.
-        if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
-          if (CI->isZero())
-            Elts.push_back(Constant::getNullValue(ResEltTy));
-          else
-            Elts.push_back(Constant::getAllOnesValue(ResEltTy));
-        } else if (isa<UndefValue>(C)) {
-          Elts.push_back(UndefValue::get(ResEltTy));
-        } else {
-          break;
-        }
+          ResElts.push_back(Constant::getAllOnesValue(ResEltTy));
+      } else if (isa<UndefValue>(C)) {
+        ResElts.push_back(UndefValue::get(ResEltTy));
+      } else {
+        break;
       }
-      
-      if (Elts.size() == CP1->getNumOperands())
-        return ConstantVector::get(&Elts[0], Elts.size());
     }
+    
+    if (ResElts.size() == C1Elts.size())
+      return ConstantVector::get(&ResElts[0], ResElts.size());
   }
 
   if (C1->getType()->isFloatingPoint()) {

Modified: llvm/trunk/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll?rev=53383&r1=53382&r2=53383&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll (original)
+++ llvm/trunk/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll Wed Jul  9 19:29:28 2008
@@ -20,3 +20,9 @@
 	ret <4 x i32> %foo
 }
 
+define <4 x i32> @test4() {
+   %foo = vfcmp ueq <4 x float> <float 0.0, float 0.0, float 0.0, float 0.0>, <float 1.0, float 1.0, float 1.0, float 0.0>
+
+	ret <4 x i32> %foo
+}
+





More information about the llvm-commits mailing list