[llvm] [X86] getFauxShuffleMask - move INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) matching behind common one use bitcast checks (PR #134227)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 3 03:14:44 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
Author: Simon Pilgrim (RKSimon)
<details>
<summary>Changes</summary>
No need to ignore one use checks for the INSERT_SUBVECTOR(SRC0, EXTRACT_SUBVECTOR(SRC1)) fold
Noticed while working on the #<!-- -->133947 regressions
---
Full diff: https://github.com/llvm/llvm-project/pull/134227.diff
1 Files Affected:
- (modified) llvm/lib/Target/X86/X86ISelLowering.cpp (+15-14)
``````````diff
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))
``````````
</details>
https://github.com/llvm/llvm-project/pull/134227
More information about the llvm-commits
mailing list