[llvm] [X86] getFauxShuffleMask - move INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) matching behind common one use bitcast checks (PR #134227)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 3 03:14:08 PDT 2025
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/134227
No need to ignore one use checks for the INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) fold
Noticed while working on the #133947 regressions
>From 25e806f96b410d5a0d75ab67e793714762e628f8 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Thu, 3 Apr 2025 11:13:25 +0100
Subject: [PATCH] [X86] getFauxShuffleMask - move INSERT_SUBVECTOR(SRC0,
EXTRACT_SUBVECTOR(SRC1)) matching behind common one use bitcast checks
No need to ignore one use checks for the INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) fold
Noticed while working on the #133947 regressions
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 29 +++++++++++++------------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 34716929f61f1..79cfe77669137 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -6185,13 +6185,20 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
}
if (!N->isOnlyUserOf(Sub.getNode()))
return false;
- SDValue SubBC = peekThroughBitcasts(Sub);
+
+ SmallVector<int, 64> SubMask;
+ SmallVector<SDValue, 2> SubInputs;
+ SDValue SubSrc = peekThroughOneUseBitcasts(Sub);
+ EVT SubSrcVT = SubSrc.getValueType();
+ if (!SubSrcVT.isVector())
+ return false;
+
// Handle INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)).
- if (SubBC.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
- SubBC.getOperand(0).getValueSizeInBits() == NumSizeInBits) {
- uint64_t ExtractIdx = SubBC.getConstantOperandVal(1);
- SDValue SubBCSrc = SubBC.getOperand(0);
- unsigned NumSubSrcBCElts = SubBCSrc.getValueType().getVectorNumElements();
+ if (SubSrc.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
+ SubSrc.getOperand(0).getValueSizeInBits() == NumSizeInBits) {
+ uint64_t ExtractIdx = SubSrc.getConstantOperandVal(1);
+ SDValue SubSrcSrc = SubSrc.getOperand(0);
+ unsigned NumSubSrcBCElts = SubSrcSrc.getValueType().getVectorNumElements();
unsigned MaxElts = std::max(NumElts, NumSubSrcBCElts);
assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcBCElts) == 0 &&
"Subvector valuetype mismatch");
@@ -6205,17 +6212,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i;
if (!SrcIsUndef)
Ops.push_back(Src);
- Ops.push_back(SubBCSrc);
+ Ops.push_back(SubSrcSrc);
return true;
}
- // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)).
- SmallVector<int, 64> SubMask;
- SmallVector<SDValue, 2> SubInputs;
- SDValue SubSrc = peekThroughOneUseBitcasts(Sub);
- EVT SubSrcVT = SubSrc.getValueType();
- if (!SubSrcVT.isVector())
- return false;
+ // Handle INSERT_SUBVECTOR(SRC0, SHUFFLE(SRC1)).
APInt SubDemand = APInt::getAllOnes(SubSrcVT.getVectorNumElements());
if (!getTargetShuffleInputs(SubSrc, SubDemand, SubInputs, SubMask, DAG,
Depth + 1, ResolveKnownElts))
More information about the llvm-commits
mailing list