OSDN Git Service

[X86] SimplifyDemandedVectorEltsForTargetNode - pull out vector halving code. NFCI.
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 1 May 2019 10:38:10 +0000 (10:38 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 1 May 2019 10:38:10 +0000 (10:38 +0000)
Pull out the HADD/HSUB code to halve vector widths if the upper half isn't used - prep work to adding support for other opcodes.

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

lib/Target/X86/X86ISelLowering.cpp

index 603873b..53823e2 100644 (file)
@@ -33398,14 +33398,18 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode(
       return true;
     break;
   }
-  case X86ISD::HADD:
-  case X86ISD::HSUB:
-  case X86ISD::FHADD:
-  case X86ISD::FHSUB: {
-    // 256-bit horizontal ops are two 128-bit ops glued together. If we do not
-    // demand any of the high elements, then narrow the h-op to 128-bits:
-    // (hop ymm0, ymm1) --> insert undef, (hop xmm0, xmm1), 0
-    if (VT.is256BitVector() && DemandedElts.lshr(NumElts / 2) == 0) {
+  }
+
+  // For 256-bit ops that are two 128-bit ops glued together, if we do not
+  // demand any of the high elements, then narrow the op to 128-bits:
+  // (op ymm0, ymm1) --> insert undef, (op xmm0, xmm1), 0
+  // TODO: Handle 512-bit -> 128/256-bit ops as well.
+  if (VT.is256BitVector() && DemandedElts.lshr(NumElts / 2) == 0) {
+    switch (Opc) {
+    case X86ISD::HADD:
+    case X86ISD::HSUB:
+    case X86ISD::FHADD:
+    case X86ISD::FHSUB: {
       SDLoc DL(Op);
       SDValue Ext0 = extract128BitVector(Op.getOperand(0), 0, TLO.DAG, DL);
       SDValue Ext1 = extract128BitVector(Op.getOperand(1), 0, TLO.DAG, DL);
@@ -33414,8 +33418,7 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetNode(
       SDValue Insert = insert128BitVector(UndefVec, Hop, 0, TLO.DAG, DL);
       return TLO.CombineTo(Op, Insert);
     }
-    break;
-  }
+    }
   }
 
   // Simplify target shuffles.