From d026cc0a8687e1fb23851d14ca164acbaa9039cc Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Wed, 5 Nov 2025 16:27:07 +0600 Subject: [PATCH 1/4] only attempt to halve known-even element count --- llvm/include/llvm/CodeGen/BasicTTIImpl.h | 5 +++++ .../VectorCombine/AArch64/sve-interleave-splat.ll | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h index 221d8f1e2f673..0fd278aacf681 100644 --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -1333,6 +1333,11 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { TargetLowering::TypeSplitVector; if ((SplitSrc || SplitDst) && SrcVTy->getElementCount().isVector() && DstVTy->getElementCount().isVector()) { + auto SrcEltCnt = SrcVTy->getElementCount(); + auto DstEltCnt = DstVTy->getElementCount(); + if (!SrcEltCnt.isKnownEven() || !DstEltCnt.isKnownEven()) { + return InstructionCost::getInvalid(); + } Type *SplitDstTy = VectorType::getHalfElementsVectorType(DstVTy); Type *SplitSrcTy = VectorType::getHalfElementsVectorType(SrcVTy); const T *TTI = thisT(); diff --git a/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll new file mode 100644 index 0000000000000..9a47800514b49 --- /dev/null +++ b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll @@ -0,0 +1,11 @@ +; RUN: opt -mtriple=aarch64-unknown-linux-gnu -passes=vector-combine %s -S -o - | FileCheck %s + +target triple = "aarch64-unknown-linux-gnu" + +define @interleave2_same_const_splat_nxv4i16() { +;CHECK-LABEL: @interleave2_same_const_splat_nxv4i16( +;CHECK: call @llvm.vector.interleave2 +;CHECK: ret %retval + %retval = call @llvm.vector.interleave2.nxv4i16( splat(i16 3), splat(i16 3)) + ret %retval +} From 151a9c8b01f1c889f7a0be54b6dbf8f7506be349 Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Wed, 5 Nov 2025 21:14:50 +0600 Subject: [PATCH 2/4] update known-even condition and test --- llvm/include/llvm/CodeGen/BasicTTIImpl.h | 9 ++------- .../VectorCombine/AArch64/sve-interleave-splat.ll | 5 ++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h index 0fd278aacf681..f58525754d7a5 100644 --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -1331,13 +1331,8 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { bool SplitDst = TLI->getTypeAction(Dst->getContext(), TLI->getValueType(DL, Dst)) == TargetLowering::TypeSplitVector; - if ((SplitSrc || SplitDst) && SrcVTy->getElementCount().isVector() && - DstVTy->getElementCount().isVector()) { - auto SrcEltCnt = SrcVTy->getElementCount(); - auto DstEltCnt = DstVTy->getElementCount(); - if (!SrcEltCnt.isKnownEven() || !DstEltCnt.isKnownEven()) { - return InstructionCost::getInvalid(); - } + if ((SplitSrc || SplitDst) && SrcVTy->getElementCount().isKnownEven() && + DstVTy->getElementCount().isKnownEven()) { Type *SplitDstTy = VectorType::getHalfElementsVectorType(DstVTy); Type *SplitSrcTy = VectorType::getHalfElementsVectorType(SrcVTy); const T *TTI = thisT(); diff --git a/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll index 9a47800514b49..e641930fc80a2 100644 --- a/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll +++ b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll @@ -1,11 +1,10 @@ -; RUN: opt -mtriple=aarch64-unknown-linux-gnu -passes=vector-combine %s -S -o - | FileCheck %s +; RUN: opt -mtriple=aarch64-unknown-linux-gnu -mattr=+sve -passes=vector-combine %s -S -o - | FileCheck %s target triple = "aarch64-unknown-linux-gnu" define @interleave2_same_const_splat_nxv4i16() { ;CHECK-LABEL: @interleave2_same_const_splat_nxv4i16( -;CHECK: call @llvm.vector.interleave2 -;CHECK: ret %retval +;CHECK: ret bitcast ( splat (i32 196611) to ) %retval = call @llvm.vector.interleave2.nxv4i16( splat(i16 3), splat(i16 3)) ret %retval } From 63a2e00de86f81f196d94a72e2802ff83977efdf Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Wed, 5 Nov 2025 22:26:15 +0600 Subject: [PATCH 3/4] remove +sve attr --- .../Transforms/VectorCombine/AArch64/sve-interleave-splat.ll | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll index e641930fc80a2..70c966af5ed05 100644 --- a/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll +++ b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll @@ -1,10 +1,11 @@ -; RUN: opt -mtriple=aarch64-unknown-linux-gnu -mattr=+sve -passes=vector-combine %s -S -o - | FileCheck %s +; RUN: opt -mtriple=aarch64-unknown-linux-gnu -passes=vector-combine %s -S -o - | FileCheck %s target triple = "aarch64-unknown-linux-gnu" define @interleave2_same_const_splat_nxv4i16() { ;CHECK-LABEL: @interleave2_same_const_splat_nxv4i16( -;CHECK: ret bitcast ( splat (i32 196611) to ) +;CHECK: call @llvm.vector.interleave2 +;CHECK: ret %retval %retval = call @llvm.vector.interleave2.nxv4i16( splat(i16 3), splat(i16 3)) ret %retval } From f111d4c72a1d1d87ee002125c1bc388e18dbd6d4 Mon Sep 17 00:00:00 2001 From: ahmedshakill Date: Thu, 6 Nov 2025 01:40:11 +0600 Subject: [PATCH 4/4] remove duplicate target triple --- .../Transforms/VectorCombine/AArch64/sve-interleave-splat.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll index 70c966af5ed05..921bcf086f2bf 100644 --- a/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll +++ b/llvm/test/Transforms/VectorCombine/AArch64/sve-interleave-splat.ll @@ -1,4 +1,4 @@ -; RUN: opt -mtriple=aarch64-unknown-linux-gnu -passes=vector-combine %s -S -o - | FileCheck %s +; RUN: opt -passes=vector-combine %s -S -o - | FileCheck %s target triple = "aarch64-unknown-linux-gnu"