Don't decode vperm2i128 or vperm2f128 into a shuffle if bit 3 or 7 of the immediate...
authorCraig Topper <craig.topper@gmail.com>
Tue, 17 Apr 2012 05:54:54 +0000 (05:54 +0000)
committerCraig Topper <craig.topper@gmail.com>
Tue, 17 Apr 2012 05:54:54 +0000 (05:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154907 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/Utils/X86ShuffleDecode.cpp
lib/Target/X86/X86ISelLowering.cpp

index 32c722acc43767664aeffcbb20110b887c9509bf..a802333002d80966e3c4ce3d96a06657bc85dfda 100644 (file)
@@ -169,6 +169,9 @@ void DecodeUNPCKLMask(EVT VT, SmallVectorImpl<int> &ShuffleMask) {
 
 void DecodeVPERM2X128Mask(EVT VT, unsigned Imm,
                           SmallVectorImpl<int> &ShuffleMask) {
+  if (Imm & 0x88)
+    return; // Not a shuffle
+
   unsigned HalfSize = VT.getVectorNumElements()/2;
   unsigned FstHalfBegin = (Imm & 0x3) * HalfSize;
   unsigned SndHalfBegin = ((Imm >> 4) & 0x3) * HalfSize;
index 8418bb12b99c352a0af2bebf5143f263838a1952..1ff60dc4368abc8cea07a5302d43d33597297865 100644 (file)
@@ -4430,6 +4430,7 @@ static bool getTargetShuffleMask(SDNode *N, EVT VT,
   case X86ISD::VPERM2X128:
     ImmN = N->getOperand(N->getNumOperands()-1);
     DecodeVPERM2X128Mask(VT, cast<ConstantSDNode>(ImmN)->getZExtValue(), Mask);
+    if (Mask.empty()) return false;
     break;
   case X86ISD::MOVDDUP:
   case X86ISD::MOVLHPD: