From: Simon Pilgrim Date: Fri, 21 Oct 2016 13:00:47 +0000 (+0000) Subject: [X86][AVX2] Begun generalizing lowering to VPERMD/VPERMPS in preparation for AVX512... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06bac82d8f1c421ef1ef1526f404d94aa3f42aa2;p=llvm [X86][AVX2] Begun generalizing lowering to VPERMD/VPERMPS in preparation for AVX512 support. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284823 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 8fbdbdd3123..7cdbb6d8a83 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -25528,16 +25528,17 @@ static bool combineX86ShuffleChain(ArrayRef Inputs, SDValue Root, any_of(Mask, [](int M) { return M == SM_SentinelZero; }); if (is128BitLaneCrossingShuffleMask(MaskVT, Mask)) { - // If we have a single input lane-crossing shuffle with 32-bit scalars then - // lower to VPERMD/VPERMPS. + // If we have a single input lane-crossing shuffle then lower to VPERMV. if (UnaryShuffle && (Depth >= 3 || HasVariableMask) && !MaskContainsZeros && Subtarget.hasAVX2() && (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) { - SDValue VPermIdx[8]; - for (int i = 0; i < 8; ++i) - VPermIdx[i] = Mask[i] < 0 ? DAG.getUNDEF(MVT::i32) - : DAG.getConstant(Mask[i], DL, MVT::i32); - - SDValue VPermMask = DAG.getBuildVector(MVT::v8i32, DL, VPermIdx); + MVT VPermMaskSVT = MVT::getIntegerVT(MaskEltSizeInBits); + SmallVector VPermIdx; + for (int M : Mask) + VPermIdx.push_back(M < 0 ? DAG.getUNDEF(VPermMaskSVT) + : DAG.getConstant(M, DL, VPermMaskSVT)); + + MVT VPermMaskVT = MVT::getVectorVT(VPermMaskSVT, NumMaskElts); + SDValue VPermMask = DAG.getBuildVector(VPermMaskVT, DL, VPermIdx); DCI.AddToWorklist(VPermMask.getNode()); Res = DAG.getBitcast(MaskVT, V1); DCI.AddToWorklist(Res.getNode());