diff options
author | Craig Topper <craig.topper@intel.com> | 2018-05-28 19:33:11 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-05-28 19:33:11 +0000 |
commit | dcfcfdb0d166fff8388bdd2edc5a2948054c9da1 (patch) | |
tree | ed53f4e61304ba4f384eb0cc2ee6716e91a4d921 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
parent | 6b545182fbab96e6656a09e6d75d66935843d356 (diff) | |
download | bcm5719-llvm-dcfcfdb0d166fff8388bdd2edc5a2948054c9da1.tar.gz bcm5719-llvm-dcfcfdb0d166fff8388bdd2edc5a2948054c9da1.zip |
[X86] Converge X86ISD::VPERMV3 and X86ISD::VPERMIV3 to a single opcode.
These do the same thing with the first and second sources swapped. They previously came from separate intrinsics that specified different masking behavior. But we can cover that with isel patterns and a single node.
This is a step towards reducing the number of intrinsics needed.
A bunch of tests change because we are now biased to choosing VPERMT over VPERMI when there is nothing to signal that commuting is beneficial.
llvm-svn: 333383
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 5270e471959..09bd7bf274a 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -4372,7 +4372,6 @@ static bool isTargetShuffle(unsigned Opcode) { case X86ISD::VPPERM: case X86ISD::VPERMV: case X86ISD::VPERMV3: - case X86ISD::VPERMIV3: case X86ISD::VZEXT_MOVL: return true; } @@ -4388,7 +4387,6 @@ static bool isTargetShuffleVariableMask(unsigned Opcode) { case X86ISD::VPPERM: case X86ISD::VPERMV: case X86ISD::VPERMV3: - case X86ISD::VPERMIV3: return true; // 'Faux' Target Shuffles. case ISD::AND: @@ -5977,21 +5975,6 @@ static bool getTargetShuffleMask(SDNode *N, MVT VT, bool AllowSentinelZero, } return false; } - case X86ISD::VPERMIV3: { - assert(N->getOperand(1).getValueType() == VT && "Unexpected value type"); - assert(N->getOperand(2).getValueType() == VT && "Unexpected value type"); - IsUnary = IsFakeUnary = N->getOperand(1) == N->getOperand(2); - // Unlike most shuffle nodes, VPERMIV3's mask operand is the first one. - Ops.push_back(N->getOperand(1)); - Ops.push_back(N->getOperand(2)); - SDValue MaskNode = N->getOperand(0); - unsigned MaskEltSize = VT.getScalarSizeInBits(); - if (auto *C = getTargetConstantFromNode(MaskNode)) { - DecodeVPERMV3Mask(C, MaskEltSize, Mask); - break; - } - return false; - } default: llvm_unreachable("unknown target shuffle node"); } @@ -20540,9 +20523,9 @@ SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SDValue Src3 = Op.getOperand(3); SDValue Mask = Op.getOperand(4); MVT VT = Op.getSimpleValueType(); - SDValue PassThru = SDValue(); // set PassThru element + SDValue PassThru; if (IntrData->Type == VPERM_3OP_MASKZ) PassThru = getZeroVector(VT, Subtarget, DAG, dl); else @@ -20554,6 +20537,22 @@ SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, Src2, Src1, Src3), Mask, PassThru, Subtarget, DAG); } + case VPERMI_3OP_MASK:{ + // Src2 is the PassThru + SDValue Src1 = Op.getOperand(1); + SDValue Src2 = Op.getOperand(2); + SDValue Src3 = Op.getOperand(3); + SDValue Mask = Op.getOperand(4); + MVT VT = Op.getSimpleValueType(); + + // set PassThru element + SDValue PassThru = DAG.getBitcast(VT, Src2); + + return getVectorMaskingNode(DAG.getNode(IntrData->Opc0, + dl, Op.getValueType(), + Src1, Src2, Src3), + Mask, PassThru, Subtarget, DAG); + } case FMA_OP_MASK3: case FMA_OP_MASKZ: case FMA_OP_MASK: { @@ -25873,7 +25872,6 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const { case X86ISD::VPERM2X128: return "X86ISD::VPERM2X128"; case X86ISD::VPERMV: return "X86ISD::VPERMV"; case X86ISD::VPERMV3: return "X86ISD::VPERMV3"; - case X86ISD::VPERMIV3: return "X86ISD::VPERMIV3"; case X86ISD::VPERMI: return "X86ISD::VPERMI"; case X86ISD::VPTERNLOG: return "X86ISD::VPTERNLOG"; case X86ISD::VFIXUPIMM: return "X86ISD::VFIXUPIMM"; @@ -38861,7 +38859,6 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N, case X86ISD::VPERMI: case X86ISD::VPERMV: case X86ISD::VPERMV3: - case X86ISD::VPERMIV3: case X86ISD::VPERMIL2: case X86ISD::VPERMILPI: case X86ISD::VPERMILPV: |