diff options
author | Chris Lattner <sabre@nondot.org> | 2008-07-14 05:10:41 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-07-14 05:10:41 +0000 |
commit | 071aade5f0e680c70fbfc824fef690537e93cf9b (patch) | |
tree | fbc8b6dc02f21aafa75063401541c52846ae1544 /lib/VMCore | |
parent | ac77bfdbd4d83edbc17c9fd362b5d692cbbeff40 (diff) | |
download | external_llvm-071aade5f0e680c70fbfc824fef690537e93cf9b.zip external_llvm-071aade5f0e680c70fbfc824fef690537e93cf9b.tar.gz external_llvm-071aade5f0e680c70fbfc824fef690537e93cf9b.tar.bz2 |
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
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Constants.cpp | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index a1158e3..51e8547 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<Constant*> &Elts) const { assert(isa<VectorType>(getType()) && "Not a vector constant!"); @@ -174,8 +175,12 @@ void Constant::getVectorElements(SmallVectorImpl<Constant*> &Elts) const { return; } - assert(isa<UndefValue>(this) && "Unknown vector constant type!"); - Elts.assign(VT->getNumElements(), UndefValue::get(VT->getElementType())); + if (isa<UndefValue>(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<Constant *, 8> Elts; + SmallVector<Constant *, 16> Elts; for (unsigned i = 0; i != NumElts; ++i) { Constant *FC = ConstantFoldCompareInstruction(pred, LHS->getOperand(i), - RHS->getOperand(i)); - if (FC) { - uint64_t Val = cast<ConstantInt>(FC)->getZExtValue(); - if (Val != 0ULL) + RHS->getOperand(i)); + if (ConstantInt *FCI = dyn_cast_or_null<ConstantInt>(FC)) { + if (FCI->getZExtValue()) Elts.push_back(ConstantInt::getAllOnesValue(EltTy)); else Elts.push_back(ConstantInt::get(EltTy, 0ULL)); + } else if (FC && isa<UndefValue>(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<Constant *, 8> Elts; + SmallVector<Constant *, 16> Elts; for (unsigned i = 0; i != NumElts; ++i) { Constant *FC = ConstantFoldCompareInstruction(pred, LHS->getOperand(i), RHS->getOperand(i)); - if (FC) { - uint64_t Val = cast<ConstantInt>(FC)->getZExtValue(); - if (Val != 0ULL) + if (ConstantInt *FCI = dyn_cast_or_null<ConstantInt>(FC)) { + if (FCI->getZExtValue()) Elts.push_back(ConstantInt::getAllOnesValue(REltTy)); else Elts.push_back(ConstantInt::get(REltTy, 0ULL)); + } else if (FC && isa<UndefValue>(FC)) { + Elts.push_back(UndefValue::get(REltTy)); + } else { + break; } } if (Elts.size() == NumElts) |