From 21c61fba4577a5ab6bf8343d9f6f288676164c2a Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Sun, 7 Aug 2016 15:29:12 +0000 Subject: [PATCH] [X86] lowerVectorShuffle - ensure that undefined mask elements only use SM_SentinelUndef 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 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 53d06ca..47a66c5 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -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 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. -- 2.7.4