[llvm] [X86] getPSHUFShuffleMask - use PSHUFD/LW/HW decodes directly. NFC. (PR #224900)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 20 04:04:43 PDT 2026
https://github.com/RKSimon updated https://github.com/llvm/llvm-project/pull/224900
>From 0b28aaf2b6cba46686a64cf01a55e0d4fdb0c97b Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Sun, 20 Sep 2026 10:27:36 +0100
Subject: [PATCH] [X86] getPSHUFShuffleMask - use PSHUFD/LW/HW decodes
directly. NFC.
Don't bother going through getTargetShuffleMask and checking for a repeated lane mask when all we care about is the mask[4] permute mask - PSHUFLW/HW don't even need the full 128-bit lane mask!
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 27 ++++---------------------
1 file changed, 4 insertions(+), 23 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index e33c75d2b2b0f..fc68b5867c1eb 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -42806,38 +42806,19 @@ static SDValue combineX86ShufflesRecursively(SDValue Op, SelectionDAG &DAG,
SDLoc(Op), Subtarget);
}
-/// Get the PSHUF-style mask from PSHUF node.
-///
-/// This is a very minor wrapper around getTargetShuffleMask to easy forming v4
-/// PSHUF-style masks that can be reused with such instructions.
+/// Get the raw PSHUF-style mask[4] from PSHUF node.
static SmallVector<int, 4> getPSHUFShuffleMask(SDValue N) {
- MVT VT = N.getSimpleValueType();
SmallVector<int, 4> Mask;
- SmallVector<SDValue, 2> Ops;
- bool HaveMask = getTargetShuffleMask(N, false, Ops, Mask);
- (void)HaveMask;
- assert(HaveMask);
-
- // If we have more than 128-bits, only the low 128-bits of shuffle mask
- // matter. Check that the upper masks are repeats and remove them.
- if (VT.getSizeInBits() > 128) {
- int LaneElts = 128 / VT.getScalarSizeInBits();
-#ifndef NDEBUG
- for (int i = 1, NumLanes = VT.getSizeInBits() / 128; i < NumLanes; ++i)
- for (int j = 0; j < LaneElts; ++j)
- assert(Mask[j] == Mask[i * LaneElts + j] - (LaneElts * i) &&
- "Mask doesn't repeat in high 128-bit lanes!");
-#endif
- Mask.resize(LaneElts);
- }
-
switch (N.getOpcode()) {
case X86ISD::PSHUFD:
+ DecodePSHUFMask(4, 32, N.getConstantOperandVal(1), Mask);
return Mask;
case X86ISD::PSHUFLW:
+ DecodePSHUFLWMask(8, N.getConstantOperandVal(1), Mask);
Mask.resize(4);
return Mask;
case X86ISD::PSHUFHW:
+ DecodePSHUFHWMask(8, N.getConstantOperandVal(1), Mask);
Mask.erase(Mask.begin(), Mask.begin() + 4);
for (int &M : Mask)
M -= 4;
More information about the llvm-commits
mailing list