Lower a build_vector with all constants into a constpool load unless it can be done with a move to low part.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44921 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 3ca9f56..8375141 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -3157,21 +3157,21 @@
   unsigned NumZero  = 0;
   unsigned NumNonZero = 0;
   unsigned NonZeros = 0;
-  unsigned NumNonZeroImms = 0;
+  bool HasNonImms = false;
   SmallSet<SDOperand, 8> Values;
   for (unsigned i = 0; i < NumElems; ++i) {
     SDOperand Elt = Op.getOperand(i);
-    if (Elt.getOpcode() != ISD::UNDEF) {
-      Values.insert(Elt);
-      if (isZeroNode(Elt))
-        NumZero++;
-      else {
-        NonZeros |= (1 << i);
-        NumNonZero++;
-        if (Elt.getOpcode() == ISD::Constant ||
-            Elt.getOpcode() == ISD::ConstantFP)
-          NumNonZeroImms++;
-      }
+    if (Elt.getOpcode() == ISD::UNDEF)
+      continue;
+    Values.insert(Elt);
+    if (Elt.getOpcode() != ISD::Constant &&
+        Elt.getOpcode() != ISD::ConstantFP)
+      HasNonImms = true;
+    if (isZeroNode(Elt))
+      NumZero++;
+    else {
+      NonZeros |= (1 << i);
+      NumNonZero++;
     }
   }
 
@@ -3185,7 +3185,7 @@
     return SDOperand();
 
   // Special case for single non-zero element.
-  if (NumNonZero == 1) {
+  if (NumNonZero == 1 && NumElems <= 4) {
     unsigned Idx = CountTrailingZeros_32(NonZeros);
     SDOperand Item = Op.getOperand(Idx);
     Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, VT, Item);
@@ -3193,6 +3193,8 @@
       // Turn it into a MOVL (i.e. movss, movsd, or movd) to a zero vector.
       return getShuffleVectorZeroOrUndef(Item, VT, NumElems, Idx,
                                          NumZero > 0, DAG);
+    else if (!HasNonImms) // Otherwise, it's better to do a constpool load.
+      return SDOperand();
 
     if (EVTBits == 32) {
       // Turn it into a shuffle of zero and zero-extended scalar to vector.
@@ -3212,7 +3214,7 @@
 
   // A vector full of immediates; various special cases are already
   // handled, so this is best done with a single constant-pool load.
-  if (NumNonZero == NumNonZeroImms)
+  if (!HasNonImms)
     return SDOperand();
 
   // Let legalizer expand 2-wide build_vectors.