diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 20 | 
1 files changed, 11 insertions, 9 deletions
| diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index f0a4cf2aef8..a519c200e49 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -13114,10 +13114,12 @@ static SDValue lowerV4I32Shuffle(const SDLoc &DL, ArrayRef<int> Mask,    int NumV2Elements = count_if(Mask, [](int M) { return M >= 4; });    if (NumV2Elements == 0) { -    // Check for being able to broadcast a single element. -    if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v4i32, V1, V2, -                                                    Mask, Subtarget, DAG)) -      return Broadcast; +    // Try to use broadcast unless the mask only has one non-undef element. +    if (count_if(Mask, [](int M) { return M >= 0 && M < 4; }) > 1) { +      if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v4i32, V1, V2, +                                                      Mask, Subtarget, DAG)) +        return Broadcast; +    }      // Straight shuffle of a single input vector. For everything from SSE2      // onward this has a single fast instruction with no scary immediates. @@ -13798,16 +13800,16 @@ static SDValue lowerV8I16Shuffle(const SDLoc &DL, ArrayRef<int> Mask,    int NumV2Inputs = count_if(Mask, [](int M) { return M >= 8; });    if (NumV2Inputs == 0) { -    // Check for being able to broadcast a single element. -    if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v8i16, V1, V2, -                                                    Mask, Subtarget, DAG)) -      return Broadcast; -      // Try to use shift instructions.      if (SDValue Shift = lowerShuffleAsShift(DL, MVT::v8i16, V1, V1, Mask,                                              Zeroable, Subtarget, DAG))        return Shift; +    // Check for being able to broadcast a single element. +    if (SDValue Broadcast = lowerShuffleAsBroadcast(DL, MVT::v8i16, V1, V2, +                                                    Mask, Subtarget, DAG)) +      return Broadcast; +      // Use dedicated unpack instructions for masks that match their pattern.      if (SDValue V = lowerShuffleWithUNPCK(DL, MVT::v8i16, Mask, V1, V2, DAG))        return V; | 

