From 364c595403c00431374dbcc965b6117e33a7f140 Mon Sep 17 00:00:00 2001 From: David Sherwood Date: Wed, 6 May 2020 11:23:04 +0100 Subject: [PATCH] [SVE] Ignore scalable vectors in InterleavedLoadCombinePass I have changed the pass so that we ignore shuffle vectors with scalable vector types, and replaced VectorType with FixedVectorType in the rest of the pass. I couldn't think of an easy way to test this change, since for scalable vectors we shouldn't be using shufflevectors for interleaving. This change fixes up some type size assert warnings I found in the following test: CodeGen/AArch64/sve-intrinsics-int-arith-imm.ll Differential Revision: https://reviews.llvm.org/D79700 --- llvm/lib/CodeGen/InterleavedLoadCombinePass.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/llvm/lib/CodeGen/InterleavedLoadCombinePass.cpp b/llvm/lib/CodeGen/InterleavedLoadCombinePass.cpp index 64a8ff3..a0ed5ee 100644 --- a/llvm/lib/CodeGen/InterleavedLoadCombinePass.cpp +++ b/llvm/lib/CodeGen/InterleavedLoadCombinePass.cpp @@ -673,9 +673,9 @@ public: ElementInfo *EI; /// Vector Type - VectorType *const VTy; + FixedVectorType *const VTy; - VectorInfo(VectorType *VTy) + VectorInfo(FixedVectorType *VTy) : BB(nullptr), PV(nullptr), LIs(), Is(), SVI(nullptr), VTy(VTy) { EI = new ElementInfo[VTy->getNumElements()]; } @@ -735,7 +735,7 @@ public: if (!Op) return false; - VectorType *VTy = dyn_cast(Op->getType()); + FixedVectorType *VTy = dyn_cast(Op->getType()); if (!VTy) return false; @@ -785,8 +785,8 @@ public: /// \returns false if no sensible information can be gathered. static bool computeFromSVI(ShuffleVectorInst *SVI, VectorInfo &Result, const DataLayout &DL) { - VectorType *ArgTy = dyn_cast(SVI->getOperand(0)->getType()); - assert(ArgTy && "ShuffleVector Operand is not a VectorType"); + FixedVectorType *ArgTy = + cast(SVI->getOperand(0)->getType()); // Compute the left hand vector information. VectorInfo LHS(ArgTy); @@ -1201,7 +1201,7 @@ bool InterleavedLoadCombineImpl::combine(std::list &InterleavedLoad, Type *ETy = InterleavedLoad.front().SVI->getType()->getElementType(); unsigned ElementsPerSVI = InterleavedLoad.front().SVI->getType()->getNumElements(); - VectorType *ILTy = VectorType::get(ETy, Factor * ElementsPerSVI); + FixedVectorType *ILTy = FixedVectorType::get(ETy, Factor * ElementsPerSVI); SmallVector Indices; for (unsigned i = 0; i < Factor; i++) @@ -1265,8 +1265,11 @@ bool InterleavedLoadCombineImpl::run() { for (BasicBlock &BB : F) { for (Instruction &I : BB) { if (auto SVI = dyn_cast(&I)) { + // We don't support scalable vectors in this pass. + if (isa(SVI->getType())) + continue; - Candidates.emplace_back(SVI->getType()); + Candidates.emplace_back(cast(SVI->getType())); if (!VectorInfo::computeFromSVI(SVI, Candidates.back(), DL)) { Candidates.pop_back(); -- 2.7.4