[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