From 071aade5f0e680c70fbfc824fef690537e93cf9b Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 14 Jul 2008 05:10:41 +0000 Subject: Document and fix Constant::getVectorElements to return an empty vector when presented with a constant expr. If ConstantExpr::getV[IF]Cmp to work when ConstantFoldCompareInstruction returns an undef or constant expr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53541 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Constants.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'lib/VMCore') diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index a1158e34de..51e85478b3 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -157,7 +157,8 @@ ConstantVector *ConstantVector::getAllOnesValue(const VectorType *Ty) { /// getVectorElements - This method, which is only valid on constant of vector /// type, returns the elements of the vector in the specified smallvector. -/// This handles breaking down a vector undef into undef elements, etc. +/// This handles breaking down a vector undef into undef elements, etc. For +/// constant exprs and other cases we can't handle, we return an empty vector. void Constant::getVectorElements(SmallVectorImpl &Elts) const { assert(isa(getType()) && "Not a vector constant!"); @@ -174,8 +175,12 @@ void Constant::getVectorElements(SmallVectorImpl &Elts) const { return; } - assert(isa(this) && "Unknown vector constant type!"); - Elts.assign(VT->getNumElements(), UndefValue::get(VT->getElementType())); + if (isa(this)) { + Elts.assign(VT->getNumElements(), UndefValue::get(VT->getElementType())); + return; + } + + // Unknown type, must be constant expr etc. } @@ -2206,16 +2211,19 @@ ConstantExpr::getVICmp(unsigned short pred, Constant* LHS, Constant* RHS) { const Type *EltTy = VTy->getElementType(); unsigned NumElts = VTy->getNumElements(); - SmallVector Elts; + SmallVector Elts; for (unsigned i = 0; i != NumElts; ++i) { Constant *FC = ConstantFoldCompareInstruction(pred, LHS->getOperand(i), - RHS->getOperand(i)); - if (FC) { - uint64_t Val = cast(FC)->getZExtValue(); - if (Val != 0ULL) + RHS->getOperand(i)); + if (ConstantInt *FCI = dyn_cast_or_null(FC)) { + if (FCI->getZExtValue()) Elts.push_back(ConstantInt::getAllOnesValue(EltTy)); else Elts.push_back(ConstantInt::get(EltTy, 0ULL)); + } else if (FC && isa(FC)) { + Elts.push_back(UndefValue::get(EltTy)); + } else { + break; } } if (Elts.size() == NumElts) @@ -2243,16 +2251,19 @@ ConstantExpr::getVFCmp(unsigned short pred, Constant* LHS, Constant* RHS) { const Type *REltTy = IntegerType::get(EltTy->getPrimitiveSizeInBits()); const Type *ResultTy = VectorType::get(REltTy, NumElts); - SmallVector Elts; + SmallVector Elts; for (unsigned i = 0; i != NumElts; ++i) { Constant *FC = ConstantFoldCompareInstruction(pred, LHS->getOperand(i), RHS->getOperand(i)); - if (FC) { - uint64_t Val = cast(FC)->getZExtValue(); - if (Val != 0ULL) + if (ConstantInt *FCI = dyn_cast_or_null(FC)) { + if (FCI->getZExtValue()) Elts.push_back(ConstantInt::getAllOnesValue(REltTy)); else Elts.push_back(ConstantInt::get(REltTy, 0ULL)); + } else if (FC && isa(FC)) { + Elts.push_back(UndefValue::get(REltTy)); + } else { + break; } } if (Elts.size() == NumElts) -- cgit v1.2.3