From: Simon Pilgrim Date: Wed, 20 Feb 2019 17:58:29 +0000 (+0000) Subject: [X86][SSE] combineX86ShufflesRecursively - begin generalizing the number of shuffle... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c8eeeb6fc0b627ed0d44fd8a1f5f3bbafccfe0e6;p=llvm [X86][SSE] combineX86ShufflesRecursively - begin generalizing the number of shuffle inputs. NFCI. We currently bail if the target shuffle decodes to more than 2 input vectors, this is some initial cleanup that still has the limit but generalizes the opindices to an array that will be necessary when we drop the limit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354489 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index cf2c83fa1cf..69c1fa407c0 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -31712,15 +31712,10 @@ static SDValue combineX86ShufflesRecursively( if (2 < OpInputs.size()) return SDValue(); - SDValue Input0 = (OpInputs.size() > 0 ? OpInputs[0] : SDValue()); - SDValue Input1 = (OpInputs.size() > 1 ? OpInputs[1] : SDValue()); - // Add the inputs to the Ops list, avoiding duplicates. SmallVector Ops(SrcOps.begin(), SrcOps.end()); auto AddOp = [&Ops](SDValue Input, int InsertionPoint) -> int { - if (!Input) - return -1; // Attempt to find an existing match. SDValue InputBC = peekThroughBitcasts(Input); for (int i = 0, e = Ops.size(); i < e; ++i) @@ -31736,8 +31731,9 @@ static SDValue combineX86ShufflesRecursively( return Ops.size() - 1; }; - int InputIdx0 = AddOp(Input0, SrcOpIndex); - int InputIdx1 = AddOp(Input1, -1); + SmallVector OpInputIdx; + for (SDValue OpInput : OpInputs) + OpInputIdx.push_back(AddOp(OpInput, OpInputIdx.empty() ? SrcOpIndex : -1)); assert(((RootMask.size() > OpMask.size() && RootMask.size() % OpMask.size() == 0) || @@ -31810,11 +31806,11 @@ static SDValue combineX86ShufflesRecursively( OpMaskedIdx = OpMaskedIdx & (MaskWidth - 1); if (OpMask[OpIdx] < (int)OpMask.size()) { - assert(0 <= InputIdx0 && "Unknown target shuffle input"); - OpMaskedIdx += InputIdx0 * MaskWidth; + assert(0 <= OpInputIdx[0] && "Unknown target shuffle input"); + OpMaskedIdx += OpInputIdx[0] * MaskWidth; } else { - assert(0 <= InputIdx1 && "Unknown target shuffle input"); - OpMaskedIdx += InputIdx1 * MaskWidth; + assert(0 <= OpInputIdx[1] && "Unknown target shuffle input"); + OpMaskedIdx += OpInputIdx[1] * MaskWidth; } Mask[i] = OpMaskedIdx;