aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Function.cpp
diff options
context:
space:
mode:
authorDavid Sherwood <david.sherwood@arm.com>2020-05-05 13:26:55 +0100
committerDavid Sherwood <david.sherwood@arm.com>2020-05-15 08:44:59 +0100
commit525b8e6dcbbd6e40fd9d91e4ed349a93381c1ccc (patch)
treee7def423a14b4cff37a5a21ed2e4aa875a3bcf26 /llvm/lib/IR/Function.cpp
parent85bb9b71b7d42c4e6fff95b715b2eefbd8e4355e (diff)
downloadllvm-525b8e6dcbbd6e40fd9d91e4ed349a93381c1ccc.zip
llvm-525b8e6dcbbd6e40fd9d91e4ed349a93381c1ccc.tar.gz
llvm-525b8e6dcbbd6e40fd9d91e4ed349a93381c1ccc.tar.bz2
[SVE] Fix wrong usage of getNumElements() in matchIntrinsicType
I have changed the ScalableVecArgument case in matchIntrinsicType to create a new FixedVectorType. This means that the next case we hit (Vector) will not assert when calling getNumElements(), since we know that it's always a FixedVectorType. This is a temporary measure for now, and it will be fixed properly in another patch that refactors this code. The changes are covered by this existing test: CodeGen/AArch64/sve-intrinsics-fp-converts.ll In addition, I have added a new test to ensure that we correctly reject SVE intrinsics when called with fixed length vector types. Differential Revision: https://reviews.llvm.org/D79416
Diffstat (limited to 'llvm/lib/IR/Function.cpp')
-rw-r--r--llvm/lib/IR/Function.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp
index ac62ffa..dab1c33 100644
--- a/llvm/lib/IR/Function.cpp
+++ b/llvm/lib/IR/Function.cpp
@@ -1180,7 +1180,9 @@ static bool matchIntrinsicType(
case IITDescriptor::Quad: return !Ty->isFP128Ty();
case IITDescriptor::Integer: return !Ty->isIntegerTy(D.Integer_Width);
case IITDescriptor::Vector: {
- VectorType *VT = dyn_cast<VectorType>(Ty);
+ // FIXME: We shouldn't be assuming all Vector types are fixed width.
+ // This will be fixed soon in another future patch.
+ FixedVectorType *VT = dyn_cast<FixedVectorType>(Ty);
return !VT || VT->getNumElements() != D.Vector_Width ||
matchIntrinsicType(VT->getElementType(), Infos, ArgTys,
DeferredChecks, IsDeferredCheck);
@@ -1357,7 +1359,11 @@ static bool matchIntrinsicType(
case IITDescriptor::ScalableVecArgument: {
if (!isa<ScalableVectorType>(Ty))
return true;
- return matchIntrinsicType(Ty, Infos, ArgTys, DeferredChecks,
+ ScalableVectorType *STy = cast<ScalableVectorType>(Ty);
+ unsigned MinElts = STy->getMinNumElements();
+ FixedVectorType *FVTy =
+ FixedVectorType::get(STy->getElementType(), MinElts);
+ return matchIntrinsicType(FVTy, Infos, ArgTys, DeferredChecks,
IsDeferredCheck);
}
case IITDescriptor::VecOfBitcastsToInt: {