[llvm] 500969f - [X86][SSE] isHorizontalBinOp - use getTargetShuffleInputs helper
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 2 03:50:35 PDT 2021
Author: Simon Pilgrim
Date: 2021-04-02T11:50:18+01:00
New Revision: 500969f1d0b1d92d7c4ccfb6bf8807de96b7e4a0
URL: https://github.com/llvm/llvm-project/commit/500969f1d0b1d92d7c4ccfb6bf8807de96b7e4a0
DIFF: https://github.com/llvm/llvm-project/commit/500969f1d0b1d92d7c4ccfb6bf8807de96b7e4a0.diff
LOG: [X86][SSE] isHorizontalBinOp - use getTargetShuffleInputs helper
Use the getTargetShuffleInputs helper for all shuffle decoding
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 f4f9812a4024..563f38db86ae 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -45984,18 +45984,8 @@ static bool isHorizontalBinOp(unsigned HOpcode, SDValue &LHS, SDValue &RHS,
"Unsupported vector type for horizontal add/sub");
unsigned NumElts = VT.getVectorNumElements();
- // TODO - can we make a general helper method that does all of this for us?
auto GetShuffle = [&](SDValue Op, SDValue &N0, SDValue &N1,
SmallVectorImpl<int> &ShuffleMask) {
- if (Op.getOpcode() == ISD::VECTOR_SHUFFLE) {
- if (!Op.getOperand(0).isUndef())
- N0 = Op.getOperand(0);
- if (!Op.getOperand(1).isUndef())
- N1 = Op.getOperand(1);
- ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(Op)->getMask();
- ShuffleMask.append(Mask.begin(), Mask.end());
- return;
- }
bool UseSubVector = false;
if (Op.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
Op.getOperand(0).getValueType().is256BitVector() &&
@@ -46004,23 +45994,25 @@ static bool isHorizontalBinOp(unsigned HOpcode, SDValue &LHS, SDValue &RHS,
UseSubVector = true;
}
SmallVector<SDValue, 2> SrcOps;
- SmallVector<int, 16> SrcShuffleMask;
+ SmallVector<int, 16> SrcMask, ScaledMask;
SDValue BC = peekThroughBitcasts(Op);
- if (isTargetShuffle(BC.getOpcode()) &&
- getTargetShuffleMask(BC.getNode(), BC.getSimpleValueType(), false,
- SrcOps, SrcShuffleMask)) {
- if (!UseSubVector && SrcShuffleMask.size() == NumElts &&
- SrcOps.size() <= 2) {
+ if (getTargetShuffleInputs(BC, SrcOps, SrcMask, DAG) &&
+ !isAnyZero(SrcMask) && all_of(SrcOps, [BC](SDValue Op) {
+ return Op.getValueSizeInBits() == BC.getValueSizeInBits();
+ })) {
+ resolveTargetShuffleInputsAndMask(SrcOps, SrcMask);
+ if (!UseSubVector && SrcOps.size() <= 2 &&
+ scaleShuffleElements(SrcMask, NumElts, ScaledMask)) {
N0 = SrcOps.size() > 0 ? SrcOps[0] : SDValue();
N1 = SrcOps.size() > 1 ? SrcOps[1] : SDValue();
- ShuffleMask.append(SrcShuffleMask.begin(), SrcShuffleMask.end());
+ ShuffleMask.assign(ScaledMask.begin(), ScaledMask.end());
}
- if (UseSubVector && (SrcShuffleMask.size() == (NumElts * 2)) &&
- SrcOps.size() == 1) {
+ if (UseSubVector && SrcOps.size() == 1 &&
+ scaleShuffleElements(SrcMask, 2 * NumElts, ScaledMask)) {
N0 = extract128BitVector(SrcOps[0], 0, DAG, SDLoc(Op));
N1 = extract128BitVector(SrcOps[0], NumElts, DAG, SDLoc(Op));
- ArrayRef<int> Mask = ArrayRef<int>(SrcShuffleMask).slice(0, NumElts);
- ShuffleMask.append(Mask.begin(), Mask.end());
+ ArrayRef<int> Mask = ArrayRef<int>(ScaledMask).slice(0, NumElts);
+ ShuffleMask.assign(Mask.begin(), Mask.end());
}
}
};
More information about the llvm-commits
mailing list