forked from OSchip/llvm-project
[SVE] Disable some BUILD_VECTOR related code generator features.
Fixed length vector code generation for SVE does not yet custom lower BUILD_VECTOR and instead relies on expansion. At the same time custom lowering for VECTOR_SHUFFLE is also not available so this patch updates isShuffleMaskLegal to reject vector types that require SVE. Related to this it also prevents the merging of stores after legalisation because this only works when BUILD_VECTOR is either legal or can be elminated. When this is not the case the code generator enters an infinite legalisation loop. Differential Revision: https://reviews.llvm.org/D83408
This commit is contained in:
parent
54bdde1dc0
commit
614fb09645
|
@ -8741,6 +8741,10 @@ SDValue AArch64TargetLowering::LowerINSERT_SUBVECTOR(SDValue Op,
|
|||
}
|
||||
|
||||
bool AArch64TargetLowering::isShuffleMaskLegal(ArrayRef<int> M, EVT VT) const {
|
||||
// Currently no fixed length shuffles that require SVE are legal.
|
||||
if (useSVEForFixedLengthVectorVT(VT))
|
||||
return false;
|
||||
|
||||
if (VT.getVectorNumElements() == 4 &&
|
||||
(VT.is128BitVector() || VT.is64BitVector())) {
|
||||
unsigned PFIndexes[4];
|
||||
|
|
|
@ -734,6 +734,16 @@ public:
|
|||
|
||||
bool fallBackToDAGISel(const Instruction &Inst) const override;
|
||||
|
||||
/// SVE code generation for fixed length vectors does not custom lower
|
||||
/// BUILD_VECTOR. This makes BUILD_VECTOR legalisation a source of stores to
|
||||
/// merge. However, merging them creates a BUILD_VECTOR that is just as
|
||||
/// illegal as the original, thus leading to an infinite legalisation loop.
|
||||
/// NOTE: Once BUILD_VECTOR is legal or can be custom lowered for all legal
|
||||
/// vector types this override can be removed.
|
||||
bool mergeStoresAfterLegalization(EVT VT) const override {
|
||||
return !useSVEForFixedLengthVectors();
|
||||
}
|
||||
|
||||
private:
|
||||
/// Keep a pointer to the AArch64Subtarget around so that we can
|
||||
/// make the right decision when generating code for different targets.
|
||||
|
|
|
@ -3,6 +3,18 @@
|
|||
|
||||
target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
; Currently there is no custom lowering for vector shuffles operating on types
|
||||
; bigger than NEON. However, having no support opens us up to a code generator
|
||||
; hang when expanding BUILD_VECTOR. Here we just validate the promblematic case
|
||||
; successfully exits code generation.
|
||||
define void @hang_when_merging_stores_after_legalisation(<8 x i32>* %a, <2 x i32> %b) #0 {
|
||||
; CHECK-LABEL: hang_when_merging_stores_after_legalisation:
|
||||
%splat = shufflevector <2 x i32> %b, <2 x i32> undef, <8 x i32> zeroinitializer
|
||||
%interleaved.vec = shufflevector <8 x i32> %splat, <8 x i32> undef, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
|
||||
store <8 x i32> %interleaved.vec, <8 x i32>* %a, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; NOTE: Currently all CONCAT_VECTORS get expanded so there's little point in
|
||||
; validating all combinations of vector type.
|
||||
|
||||
|
|
Loading…
Reference in New Issue