[X86][AVX] Ensure we only combine to PSHUFLW/PSHUFHW on supporting targets
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 1 Aug 2020 13:54:21 +0000 (14:54 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 1 Aug 2020 18:18:11 +0000 (19:18 +0100)
Noticed while investigating combining from concatenated shuffle vectors, we weren't checking that PSHUFLW/PSHUFHW was legal - we were depending on lowering splitting to subvectors.

llvm/lib/Target/X86/X86ISelLowering.cpp

index d628cdf..b89502d 100644 (file)
@@ -34146,7 +34146,10 @@ static bool matchUnaryPermuteShuffle(MVT MaskVT, ArrayRef<int> Mask,
   }
 
   // Handle PSHUFLW/PSHUFHW vXi16 repeated patterns.
-  if (!ContainsZeros && AllowIntDomain && MaskScalarSizeInBits == 16) {
+  if (!ContainsZeros && AllowIntDomain && MaskScalarSizeInBits == 16 &&
+      ((MaskVT.is128BitVector() && Subtarget.hasSSE2()) ||
+       (MaskVT.is256BitVector() && Subtarget.hasAVX2()) ||
+       (MaskVT.is512BitVector() && Subtarget.hasBWI()))) {
     SmallVector<int, 4> RepeatedMask;
     if (is128BitLaneRepeatedShuffleMask(MaskEltVT, Mask, RepeatedMask)) {
       ArrayRef<int> LoMask(RepeatedMask.data() + 0, 4);