[llvm] r344931 - [X86][SSE] getTargetShuffleMaskIndices - allow opt-in support for whole undef shuffle mask elements

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 22 11:09:02 PDT 2018


Author: rksimon
Date: Mon Oct 22 11:09:02 2018
New Revision: 344931

URL: http://llvm.org/viewvc/llvm-project?rev=344931&view=rev
Log:
[X86][SSE] getTargetShuffleMaskIndices - allow opt-in support for whole undef shuffle mask elements

Enable this for PSHUFB constant mask decoding and remove the ConstantPool DecodePSHUFBMask

Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=344931&r1=344930&r2=344931&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Oct 22 11:09:02 2018
@@ -5839,20 +5839,23 @@ static bool isConstantSplat(SDValue Op,
 
 static bool getTargetShuffleMaskIndices(SDValue MaskNode,
                                         unsigned MaskEltSizeInBits,
-                                        SmallVectorImpl<uint64_t> &RawMask) {
+                                        SmallVectorImpl<uint64_t> &RawMask,
+                                        bool AllowWholeUndefs = false) {
   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 */ false,
+                                     EltBits, AllowWholeUndefs,
                                      /* AllowPartialUndefs */ false))
     return false;
 
   // Insert the extracted elements into the mask.
-  for (APInt Elt : EltBits)
-    RawMask.push_back(Elt.getZExtValue());
+  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);
+  }
 
   return true;
 }
@@ -6057,14 +6060,10 @@ static bool getTargetShuffleMask(SDNode
     IsUnary = true;
     SDValue MaskNode = N->getOperand(1);
     SmallVector<uint64_t, 32> RawMask;
-    if (getTargetShuffleMaskIndices(MaskNode, 8, RawMask)) {
+    if (getTargetShuffleMaskIndices(MaskNode, 8, RawMask, true)) {
       DecodePSHUFBMask(RawMask, Mask);
       break;
     }
-    if (auto *C = getTargetConstantFromNode(MaskNode)) {
-      DecodePSHUFBMask(C, Mask);
-      break;
-    }
     return false;
   }
   case X86ISD::VPERMI:




More information about the llvm-commits mailing list