diff options
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index e5af7293b0e..e51149210bf 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -5634,12 +5634,13 @@ X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {        if (ExtVT == MVT::i32 || ExtVT == MVT::f32 || ExtVT == MVT::f64 ||            (ExtVT == MVT::i64 && Subtarget->is64Bit())) { -        if (VT.is256BitVector() || VT.is512BitVector()) { +        if (VT.is512BitVector()) {            SDValue ZeroVec = getZeroVector(VT, Subtarget, DAG, dl);            return DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VT, ZeroVec,                               Item, DAG.getIntPtrConstant(0));          } -        assert(VT.is128BitVector() && "Expected an SSE value type!"); +        assert((VT.is128BitVector() || VT.is256BitVector()) && +               "Expected an SSE value type!");          Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Item);          // Turn it into a MOVL (i.e. movss, movsd, or movd) to a zero vector.          return getShuffleVectorZeroOrUndef(Item, 0, true, Subtarget, DAG); @@ -9333,6 +9334,15 @@ static SDValue lowerV8F32VectorShuffle(SDValue Op, SDValue V1, SDValue V2,    ArrayRef<int> Mask = SVOp->getMask();    assert(Mask.size() == 8 && "Unexpected mask size for v8 shuffle!"); +  // If we have a single input to the zero element, insert that into V1 if we +  // can do so cheaply. +  int NumV2Elements = +      std::count_if(Mask.begin(), Mask.end(), [](int M) { return M >= 8; }); +  if (NumV2Elements == 1 && Mask[0] >= 8) +    if (SDValue Insertion = lowerVectorShuffleAsElementInsertion( +            DL, MVT::v8f32, V1, V2, Mask, Subtarget, DAG)) +      return Insertion; +    if (SDValue Blend = lowerVectorShuffleAsBlend(DL, MVT::v8f32, V1, V2, Mask,                                                  Subtarget, DAG))      return Blend; | 

