summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2016-10-21 19:18:09 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2016-10-21 19:18:09 +0000
commit0109bf116fac77764699955ea67e5451280e86f6 (patch)
treedff194fadbb9ffdffc02e71c3a22d78fe1b559cd /llvm/lib
parent6e7fa99d3a5bbeebf9eed9c766765b0d6b0d18b9 (diff)
downloadbcm5719-llvm-0109bf116fac77764699955ea67e5451280e86f6.tar.gz
bcm5719-llvm-0109bf116fac77764699955ea67e5451280e86f6.zip
[X86][AVX512] Added support for combining target shuffles to AVX512 vpermpd/vpermq/vpermps/vpermd/vpermw
llvm-svn: 284858
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp18
1 files changed, 11 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 565decb601b..bb1766c5947 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -3861,6 +3861,9 @@ static bool isTargetShuffleVariableMask(unsigned Opcode) {
case X86ISD::VPERMILPV:
case X86ISD::VPERMIL2:
case X86ISD::VPPERM:
+ case X86ISD::VPERMV:
+ case X86ISD::VPERMV3:
+ case X86ISD::VPERMIV3:
return true;
}
}
@@ -25529,16 +25532,17 @@ static bool combineX86ShuffleChain(ArrayRef<SDValue> Inputs, SDValue Root,
if (is128BitLaneCrossingShuffleMask(MaskVT, Mask)) {
// If we have a single input lane-crossing shuffle then lower to VPERMV.
+ // FIXME: Add AVX512BWVL support for v16i16.
if (UnaryShuffle && (Depth >= 3 || HasVariableMask) && !MaskContainsZeros &&
- Subtarget.hasAVX2() && (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) {
+ ((Subtarget.hasAVX2() &&
+ (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) ||
+ (Subtarget.hasAVX512() &&
+ (MaskVT == MVT::v8f64 || MaskVT == MVT::v8i64 ||
+ MaskVT == MVT::v16f32 || MaskVT == MVT::v16i32)) ||
+ (Subtarget.hasBWI() && MaskVT == MVT::v32i16))) {
MVT VPermMaskSVT = MVT::getIntegerVT(MaskEltSizeInBits);
- SmallVector<SDValue, 8> 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);
+ SDValue VPermMask = getConstVector(Mask, VPermMaskVT, DAG, DL, true);
DCI.AddToWorklist(VPermMask.getNode());
Res = DAG.getBitcast(MaskVT, V1);
DCI.AddToWorklist(Res.getNode());
OpenPOWER on IntegriCloud