OSDN Git Service

Revert rL344931 from llvm/trunk: [X86][SSE] getTargetShuffleMaskIndices - allow opt...
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 22 Oct 2018 19:01:25 +0000 (19:01 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 22 Oct 2018 19:01:25 +0000 (19:01 +0000)
We can't safely assume that certain RawMask entries are UNDEF as most variable shuffles ignore non-index bits - PSHUFB only works on i8 elts so it'd be safe to use but I'm intending to come up with an alternative approach that works for all.
........
Enable this for PSHUFB constant mask decoding and remove the ConstantPool DecodePSHUFBMask

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@344937 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp

index e2b2191..6059a2a 100644 (file)
@@ -5839,23 +5839,20 @@ static bool isConstantSplat(SDValue Op, APInt &SplatVal) {
 
 static bool getTargetShuffleMaskIndices(SDValue MaskNode,
                                         unsigned MaskEltSizeInBits,
-                                        SmallVectorImpl<uint64_t> &RawMask,
-                                        bool AllowWholeUndefs = false) {
+                                        SmallVectorImpl<uint64_t> &RawMask) {
   APInt UndefElts;
   SmallVector<APInt, 64> EltBits;
 
   // Extract the raw target constant bits.
+  // FIXME: We currently don't support UNDEF bits or mask entries.
   if (!getTargetConstantBitsFromNode(MaskNode, MaskEltSizeInBits, UndefElts,
-                                     EltBits, AllowWholeUndefs,
+                                     EltBits, /* AllowWholeUndefs */ false,
                                      /* AllowPartialUndefs */ false))
     return false;
 
   // Insert the extracted elements into the mask.
-  for (int i = 0, e = EltBits.size(); i != e; ++i) {
-    uint64_t M = AllowWholeUndefs && UndefElts[i] ? SM_SentinelUndef
-                                                  : EltBits[i].getZExtValue();
-    RawMask.push_back(M);
-  }
+  for (APInt Elt : EltBits)
+    RawMask.push_back(Elt.getZExtValue());
 
   return true;
 }
@@ -6060,10 +6057,14 @@ static bool getTargetShuffleMask(SDNode *N, MVT VT, bool AllowSentinelZero,
     IsUnary = true;
     SDValue MaskNode = N->getOperand(1);
     SmallVector<uint64_t, 32> RawMask;
-    if (getTargetShuffleMaskIndices(MaskNode, 8, RawMask, true)) {
+    if (getTargetShuffleMaskIndices(MaskNode, 8, RawMask)) {
       DecodePSHUFBMask(RawMask, Mask);
       break;
     }
+    if (auto *C = getTargetConstantFromNode(MaskNode)) {
+      DecodePSHUFBMask(C, Mask);
+      break;
+    }
     return false;
   }
   case X86ISD::VPERMI: