[llvm] r348498 - [X86] Refactored IsSplatVector to use switch. NFCI.

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 6 08:29:14 PST 2018


Author: rksimon
Date: Thu Dec  6 08:29:14 2018
New Revision: 348498

URL: http://llvm.org/viewvc/llvm-project?rev=348498&view=rev
Log:
[X86] Refactored IsSplatVector to use switch. NFCI.

Initial step towards making the function more generic (and probably move into SelectionDAG).

This is necessary to avoid massive codegen bloat for PR38243 (Add modulo rotate support to LowerRotate).

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=348498&r1=348497&r2=348498&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Dec  6 08:29:14 2018
@@ -24069,47 +24069,50 @@ static SDValue LowerScalarImmediateShift
 static SDValue IsSplatVector(SDValue V, int &SplatIdx) {
   V = peekThroughEXTRACT_SUBVECTORs(V);
 
-  // Check if this is a splat build_vector node.
-  if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(V)) {
-    BitVector BVUndefElts;
-    SDValue SplatAmt = BV->getSplatValue(&BVUndefElts);
+  unsigned Opcode = V.getOpcode();
+  switch (Opcode) {
+  case ISD::BUILD_VECTOR: {
+    BitVector UndefElts;
+    SDValue SplatAmt = cast<BuildVectorSDNode>(V)->getSplatValue(&UndefElts);
     if (SplatAmt && !SplatAmt.isUndef()) {
-      for (int i = 0, e = BVUndefElts.size(); i != e; ++i)
-        if (!BVUndefElts[i]) {
+      for (int i = 0, e = UndefElts.size(); i != e; ++i)
+        if (!UndefElts[i]) {
           SplatIdx = i;
           return V;
         }
     }
-    return SDValue();
+    break;
   }
-
-  // Check for SUB(SPLAT_BV, SPLAT) cases from rotate patterns.
-  if (V.getOpcode() == ISD::SUB) {
+  case ISD::VECTOR_SHUFFLE: {
+    // Check if this is a shuffle node doing a splat.
+    auto *SVN = cast<ShuffleVectorSDNode>(V);
+    if (!SVN->isSplat())
+      break;
+    int Idx = SVN->getSplatIndex();
+    int NumElts = V.getValueType().getVectorNumElements();
+    SplatIdx = Idx % NumElts;
+    return V.getOperand(Idx / NumElts);
+  }
+  case ISD::SUB: {
     SDValue LHS = peekThroughEXTRACT_SUBVECTORs(V.getOperand(0));
     SDValue RHS = peekThroughEXTRACT_SUBVECTORs(V.getOperand(1));
 
     // Ensure that the corresponding splat BV element is not UNDEF.
     BitVector UndefElts;
-    BuildVectorSDNode *BV0 = dyn_cast<BuildVectorSDNode>(LHS);
-    ShuffleVectorSDNode *SVN1 = dyn_cast<ShuffleVectorSDNode>(RHS);
+    auto *BV0 = dyn_cast<BuildVectorSDNode>(LHS);
+    auto *SVN1 = dyn_cast<ShuffleVectorSDNode>(RHS);
     if (BV0 && SVN1 && BV0->getSplatValue(&UndefElts) && SVN1->isSplat()) {
       int Idx = SVN1->getSplatIndex();
       if (!UndefElts[Idx]) {
         SplatIdx = Idx;
         return V;
       }
-      return SDValue();
     }
+    break;
+  }
   }
 
-  // Check if this is a shuffle node doing a splat.
-  ShuffleVectorSDNode *SVN = dyn_cast<ShuffleVectorSDNode>(V);
-  if (!SVN || !SVN->isSplat())
-    return SDValue();
-  int Idx = SVN->getSplatIndex();
-  int NumElts = V.getValueType().getVectorNumElements();
-  SplatIdx = Idx % NumElts;
-  return V.getOperand(Idx / NumElts);
+  return SDValue();
 }
 
 static SDValue GetSplatValue(SDValue V, const SDLoc &dl,




More information about the llvm-commits mailing list