diff options
author | David Sherwood <david.sherwood@arm.com> | 2021-11-12 16:19:56 +0000 |
---|---|---|
committer | David Sherwood <david.sherwood@arm.com> | 2021-11-17 13:11:58 +0000 |
commit | 8d77555b1234a2620238125328160dbe88a5e487 (patch) | |
tree | 41c9b4a55a0dfa444a1b1c7cd8c50f8deccfbf6f /llvm/lib/CodeGen/TargetLoweringBase.cpp | |
parent | aeedbd39a34deed30ca80acfa64ee2d8d1716c78 (diff) | |
download | llvm-8d77555b1234a2620238125328160dbe88a5e487.zip llvm-8d77555b1234a2620238125328160dbe88a5e487.tar.gz llvm-8d77555b1234a2620238125328160dbe88a5e487.tar.bz2 |
[Analysis] Ensure getTypeLegalizationCost returns a simple VT for TypeScalarizeScalableVector
When getTypeConversion returns TypeScalarizeScalableVector we were
sometimes returning a non-simple type from getTypeLegalizationCost.
However, many callers depend upon this being a simple type and will
crash if not. This patch changes getTypeLegalizationCost to ensure
that we always a return sensible simple VT. If the vector type
contains unusual integer types, e.g. <vscale x 2 x i3>, then we just
set the type to MVT::i64 as a reasonable default.
A test has been added here that demonstrates the vectoriser can
correctly calculate the cost of vectorising a "zext i3 to i64"
instruction with a VF=vscale x 1:
Transforms/LoopVectorize/AArch64/sve-inductions-unusual-types.ll
Differential Revision: https://reviews.llvm.org/D113777
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringBase.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 0dd45be..c0a7eff 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -1856,8 +1856,12 @@ TargetLoweringBase::getTypeLegalizationCost(const DataLayout &DL, while (true) { LegalizeKind LK = getTypeConversion(C, MTy); - if (LK.first == TypeScalarizeScalableVector) - return std::make_pair(InstructionCost::getInvalid(), MVT::getVT(Ty)); + if (LK.first == TypeScalarizeScalableVector) { + // Ensure we return a sensible simple VT here, since many callers of this + // function require it. + MVT VT = MTy.isSimple() ? MTy.getSimpleVT() : MVT::i64; + return std::make_pair(InstructionCost::getInvalid(), VT); + } if (LK.first == TypeLegal) return std::make_pair(Cost, MTy.getSimpleVT()); |