[X86] lowerVectorShuffle - ensure that undefined mask elements only use SM_SentinelUndef
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 7 Aug 2016 15:29:12 +0000 (15:29 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 7 Aug 2016 15:29:12 +0000 (15:29 +0000)
Help lowering and combining (which can specify SM_SentinelZero mask elements) share more shuffle matching code.

llvm-svn: 277959

llvm/lib/Target/X86/X86ISelLowering.cpp

index 53d06ca..47a66c5 100644 (file)
@@ -12281,6 +12281,15 @@ static SDValue lowerVectorShuffle(SDValue Op, const X86Subtarget &Subtarget,
         return DAG.getVectorShuffle(VT, DL, V1, V2, NewMask);
       }
 
+  // Ensure that undefined mask elements only use SM_SentinelUndef.
+  if (llvm::any_of(Mask, [](int M) { return M < SM_SentinelUndef; })) {
+    SmallVector<int, 8> NewMask(Mask.begin(), Mask.end());
+    for (int &M : NewMask)
+      if (M < SM_SentinelUndef)
+        M = SM_SentinelUndef;
+    return DAG.getVectorShuffle(VT, DL, V1, V2, NewMask);
+  }
+
   // We actually see shuffles that are entirely re-arrangements of a set of
   // zero inputs. This mostly happens while decomposing complex shuffles into
   // simple ones. Directly lower these as a buildvector of zeros.