Author: Simon Pilgrim Date: 2021-01-13T13:59:56Z New Revision: 0a0ee7f5a5af0f5dae65452f649ab665e787e7d6
URL: https://github.com/llvm/llvm-project/commit/0a0ee7f5a5af0f5dae65452f649ab665e787e7d6 DIFF: https://github.com/llvm/llvm-project/commit/0a0ee7f5a5af0f5dae65452f649ab665e787e7d6.diff LOG: [X86] canonicalizeShuffleMaskWithHorizOp - minor refactor to support multiple src ops. NFCI. canonicalizeShuffleMaskWithHorizOp currently only supports shuffles with 1 or 2 sources, but PR41813 will require us to support higher numbers of sources. This patch just generalizes the initial setup stages to ensure all src ops are the same type and opcode and then will continue to early out if we have more than 2 sources. 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 5949782f3c0c..821cfc5f0c27 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -36088,20 +36088,20 @@ static SDValue canonicalizeShuffleMaskWithHorizOp( MutableArrayRef<SDValue> Ops, MutableArrayRef<int> Mask, unsigned RootSizeInBits, const SDLoc &DL, SelectionDAG &DAG, const X86Subtarget &Subtarget) { - - // Combine binary shuffle of 2 similar 'Horizontal' instructions into a - // single instruction. Attempt to match a v2X64 repeating shuffle pattern that - // represents the LHS/RHS inputs for the lower/upper halves. - if (Mask.empty() || Ops.empty() || 2 < Ops.size()) + if (Mask.empty() || Ops.empty()) return SDValue(); - SDValue BC0 = peekThroughBitcasts(Ops.front()); - SDValue BC1 = peekThroughBitcasts(Ops.back()); + SmallVector<SDValue> BC; + for (SDValue Op : Ops) + BC.push_back(peekThroughBitcasts(Op)); + + // All ops must be the same horizop + type. + SDValue BC0 = BC[0]; EVT VT0 = BC0.getValueType(); - EVT VT1 = BC1.getValueType(); unsigned Opcode0 = BC0.getOpcode(); - unsigned Opcode1 = BC1.getOpcode(); - if (Opcode0 != Opcode1 || VT0 != VT1 || VT0.getSizeInBits() != RootSizeInBits) + if (VT0.getSizeInBits() != RootSizeInBits || llvm::any_of(BC, [&](SDValue V) { + return V.getOpcode() != Opcode0 || V.getValueType() != VT0; + })) return SDValue(); bool isHoriz = (Opcode0 == X86ISD::FHADD || Opcode0 == X86ISD::HADD || @@ -36110,12 +36110,16 @@ static SDValue canonicalizeShuffleMaskWithHorizOp( if (!isHoriz && !isPack) return SDValue(); - if (Mask.size() == VT0.getVectorNumElements()) { - int NumElts = VT0.getVectorNumElements(); - int NumLanes = VT0.getSizeInBits() / 128; - int NumEltsPerLane = NumElts / NumLanes; - int NumHalfEltsPerLane = NumEltsPerLane / 2; + int NumElts = VT0.getVectorNumElements(); + int NumLanes = VT0.getSizeInBits() / 128; + int NumEltsPerLane = NumElts / NumLanes; + int NumHalfEltsPerLane = NumEltsPerLane / 2; + + if (2 < Ops.size()) + return SDValue(); + SDValue BC1 = BC[BC.size() - 1]; + if (Mask.size() == VT0.getVectorNumElements()) { // Canonicalize binary shuffles of horizontal ops that use the // same sources to an unary shuffle. // TODO: Try to perform this fold even if the shuffle remains. @@ -36159,6 +36163,9 @@ static SDValue canonicalizeShuffleMaskWithHorizOp( } } + // Combine binary shuffle of 2 similar 'Horizontal' instructions into a + // single instruction. Attempt to match a v2X64 repeating shuffle pattern that + // represents the LHS/RHS inputs for the lower/upper halves. unsigned EltSizeInBits = RootSizeInBits / Mask.size(); SmallVector<int, 16> TargetMask128, WideMask128; if (isRepeatedTargetShuffleMask(128, EltSizeInBits, Mask, TargetMask128) && _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits