[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 04:23:22 PDT 2025
https://github.com/RKSimon updated https://github.com/llvm/llvm-project/pull/134227
>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 1/2] [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))
>From 656ebdfa693acdda2bb88eb3a0f3bfa60c30d077 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Thu, 3 Apr 2025 12:23:05 +0100
Subject: [PATCH 2/2] clang-format
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 79cfe77669137..8271d9c486650 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -6198,12 +6198,13 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
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 &&
+ unsigned NumSubSrcSrcElts =
+ SubSrcSrc.getValueType().getVectorNumElements();
+ unsigned MaxElts = std::max(NumElts, NumSubSrcSrcElts);
+ assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcSrcElts) == 0 &&
"Subvector valuetype mismatch");
InsertIdx *= (MaxElts / NumElts);
- ExtractIdx *= (MaxElts / NumSubSrcBCElts);
+ ExtractIdx *= (MaxElts / NumSubSrcSrcElts);
NumSubElts *= (MaxElts / NumElts);
bool SrcIsUndef = Src.isUndef();
for (int i = 0; i != (int)MaxElts; ++i)
@@ -6231,10 +6232,11 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
if (SubMask.size() != NumSubElts) {
assert(((SubMask.size() % NumSubElts) == 0 ||
- (NumSubElts % SubMask.size()) == 0) && "Illegal submask scale");
+ (NumSubElts % SubMask.size()) == 0) &&
+ "Illegal submask scale");
if ((NumSubElts % SubMask.size()) == 0) {
int Scale = NumSubElts / SubMask.size();
- SmallVector<int,64> ScaledSubMask;
+ SmallVector<int, 64> ScaledSubMask;
narrowShuffleMaskElts(Scale, SubMask, ScaledSubMask);
SubMask = ScaledSubMask;
} else {
More information about the llvm-commits
mailing list