[llvm] 52f3cad - [X86] getFauxShuffleMask - move INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) matching behind common one use bitcast checks (#134227)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 3 05:17:17 PDT 2025
Author: Simon Pilgrim
Date: 2025-04-03T13:17:14+01:00
New Revision: 52f3cad9ffa35a472699d541736bd72dd01d6e62
URL: https://github.com/llvm/llvm-project/commit/52f3cad9ffa35a472699d541736bd72dd01d6e62
DIFF: https://github.com/llvm/llvm-project/commit/52f3cad9ffa35a472699d541736bd72dd01d6e62.diff
LOG: [X86] getFauxShuffleMask - move INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) matching behind common one use bitcast checks (#134227)
No need to ignore one use checks for the INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) fold
Noticed while working on the #133947 regressions
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 34716929f61f1..8271d9c486650 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -6185,18 +6185,26 @@ 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();
- unsigned MaxElts = std::max(NumElts, NumSubSrcBCElts);
- assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcBCElts) == 0 &&
+ if (SubSrc.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
+ SubSrc.getOperand(0).getValueSizeInBits() == NumSizeInBits) {
+ uint64_t ExtractIdx = SubSrc.getConstantOperandVal(1);
+ SDValue SubSrcSrc = SubSrc.getOperand(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)
@@ -6205,17 +6213,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))
@@ -6230,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