diff options
author | Chris Lattner <sabre@nondot.org> | 2012-01-25 01:32:59 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-01-25 01:32:59 +0000 |
commit | af7b4fb9bec3858f0374d713dcbf3398a23c6fbe (patch) | |
tree | 5320eb10bc18e29dc860f77c25de62ed2475f975 /lib/VMCore | |
parent | 0f193b8a6846dab25323788638e760ae03b7cd87 (diff) | |
download | external_llvm-af7b4fb9bec3858f0374d713dcbf3398a23c6fbe.zip external_llvm-af7b4fb9bec3858f0374d713dcbf3398a23c6fbe.tar.gz external_llvm-af7b4fb9bec3858f0374d713dcbf3398a23c6fbe.tar.bz2 |
Remove the Type::getNumElements() method, which is only called in 4 places,
did something extremely surprising, and shadowed actually useful
implementations that had completely different behavior.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148898 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Constants.cpp | 16 | ||||
-rw-r--r-- | lib/VMCore/Instructions.cpp | 10 | ||||
-rw-r--r-- | lib/VMCore/Type.cpp | 8 |
3 files changed, 19 insertions, 15 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 1976832..0fcce09 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -1505,8 +1505,10 @@ Constant *ConstantExpr::getPtrToInt(Constant *C, Type *DstTy) { "PtrToInt source must be pointer or pointer vector"); assert(DstTy->getScalarType()->isIntegerTy() && "PtrToInt destination must be integer or integer vector"); - assert(C->getType()->getNumElements() == DstTy->getNumElements() && - "Invalid cast between a different number of vector elements"); + assert(isa<VectorType>(C->getType()) == isa<VectorType>(DstTy)); + if (VectorType *VT = dyn_cast<VectorType>(C->getType())) + assert(VT->getNumElements() == cast<VectorType>(DstTy)->getNumElements() && + "Invalid cast between a different number of vector elements"); return getFoldedCast(Instruction::PtrToInt, C, DstTy); } @@ -1515,8 +1517,10 @@ Constant *ConstantExpr::getIntToPtr(Constant *C, Type *DstTy) { "IntToPtr source must be integer or integer vector"); assert(DstTy->getScalarType()->isPointerTy() && "IntToPtr destination must be a pointer or pointer vector"); - assert(C->getType()->getNumElements() == DstTy->getNumElements() && - "Invalid cast between a different number of vector elements"); + assert(isa<VectorType>(C->getType()) == isa<VectorType>(DstTy)); + if (VectorType *VT = dyn_cast<VectorType>(C->getType())) + assert(VT->getNumElements() == cast<VectorType>(DstTy)->getNumElements() && + "Invalid cast between a different number of vector elements"); return getFoldedCast(Instruction::IntToPtr, C, DstTy); } @@ -2018,7 +2022,9 @@ bool ConstantDataSequential::isElementTypeCompatible(const Type *Ty) { /// getNumElements - Return the number of elements in the array or vector. unsigned ConstantDataSequential::getNumElements() const { - return getType()->getNumElements(); + if (ArrayType *AT = dyn_cast<ArrayType>(getType())) + return AT->getNumElements(); + return cast<VectorType>(getType())->getNumElements(); } diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index 8c375c2..2c69874 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -2671,13 +2671,19 @@ CastInst::castIsValid(Instruction::CastOps op, Value *S, Type *DstTy) { return SrcTy->isFPOrFPVectorTy() && DstTy->isIntOrIntVectorTy() && SrcLength == DstLength; case Instruction::PtrToInt: - if (SrcTy->getNumElements() != DstTy->getNumElements()) + if (isa<VectorType>(SrcTy) != isa<VectorType>(DstTy)) return false; + if (VectorType *VT = dyn_cast<VectorType>(SrcTy)) + if (VT->getNumElements() != cast<VectorType>(DstTy)->getNumElements()) + return false; return SrcTy->getScalarType()->isPointerTy() && DstTy->getScalarType()->isIntegerTy(); case Instruction::IntToPtr: - if (SrcTy->getNumElements() != DstTy->getNumElements()) + if (isa<VectorType>(SrcTy) != isa<VectorType>(DstTy)) return false; + if (VectorType *VT = dyn_cast<VectorType>(SrcTy)) + if (VT->getNumElements() != cast<VectorType>(DstTy)->getNumElements()) + return false; return SrcTy->getScalarType()->isIntegerTy() && DstTy->getScalarType()->isPointerTy(); case Instruction::BitCast: diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp index fe07e9e..7edd9e6 100644 --- a/lib/VMCore/Type.cpp +++ b/lib/VMCore/Type.cpp @@ -47,14 +47,6 @@ Type *Type::getScalarType() { return this; } -/// getNumElements - If this is a vector type, return the number of elements, -/// otherwise return zero. -unsigned Type::getNumElements() { - if (VectorType *VTy = dyn_cast<VectorType>(this)) - return VTy->getNumElements(); - return 0; -} - /// isIntegerTy - Return true if this is an IntegerType of the specified width. bool Type::isIntegerTy(unsigned Bitwidth) const { return isIntegerTy() && cast<IntegerType>(this)->getBitWidth() == Bitwidth; |