Change isBuildVectorAllOnesInteger to isBuildVectorAllOnes. Also check for
floating point cases.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27165 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index ecda64c..9c8b130 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -70,11 +70,10 @@
 //                              ISD Namespace
 //===----------------------------------------------------------------------===//
 
-/// isBuildVectorAllOnesInteger - Return true if the specified node is a
+/// isBuildVectorAllOnes - Return true if the specified node is a
 /// BUILD_VECTOR where all of the elements are ~0 or undef.
-bool ISD::isBuildVectorAllOnesInteger(const SDNode *N) {
-  if (N->getOpcode() != ISD::BUILD_VECTOR ||
-      !MVT::isInteger(N->getOperand(0).getValueType())) return false;
+bool ISD::isBuildVectorAllOnes(const SDNode *N) {
+  if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
   
   unsigned i = 0, e = N->getNumOperands();
   
@@ -88,8 +87,13 @@
   // Do not accept build_vectors that aren't all constants or which have non-~0
   // elements.
   SDOperand NotZero = N->getOperand(i);
-  if (!isa<ConstantSDNode>(NotZero) ||
-      !cast<ConstantSDNode>(NotZero)->isAllOnesValue())
+  if (isa<ConstantSDNode>(NotZero)) {
+    if (!cast<ConstantSDNode>(NotZero)->isAllOnesValue())
+      return false;
+  } else if (isa<ConstantFPSDNode>(NotZero)) {
+    if (!cast<ConstantFPSDNode>(NotZero)->isExactlyValue(-1))
+      return false;
+  } else
     return false;
   
   // Okay, we have at least one ~0 value, check to see if the rest match or are
@@ -106,24 +110,35 @@
 /// BUILD_VECTOR where all of the elements are 0 or undef.
 bool ISD::isBuildVectorAllZeros(const SDNode *N) {
   if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
-
-  bool AllUndef = true;
-  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
-    SDOperand Elt = N->getOperand(i);
-    if (Elt.getOpcode() != ISD::UNDEF) {
-      AllUndef = false;
-      if (isa<ConstantSDNode>(Elt)) {
-        if (!cast<ConstantSDNode>(Elt)->isNullValue())
-          return false;
-      } else if (isa<ConstantFPSDNode>(Elt)) {
-        if (!cast<ConstantFPSDNode>(Elt)->isExactlyValue(0.0))
-          return false;
-      } else
-        return false;
-    }
-  }
-
-  return !AllUndef;
+  
+  unsigned i = 0, e = N->getNumOperands();
+  
+  // Skip over all of the undef values.
+  while (i != e && N->getOperand(i).getOpcode() == ISD::UNDEF)
+    ++i;
+  
+  // Do not accept an all-undef vector.
+  if (i == e) return false;
+  
+  // Do not accept build_vectors that aren't all constants or which have non-~0
+  // elements.
+  SDOperand Zero = N->getOperand(i);
+  if (isa<ConstantSDNode>(Zero)) {
+    if (!cast<ConstantSDNode>(Zero)->isNullValue())
+      return false;
+  } else if (isa<ConstantFPSDNode>(Zero)) {
+    if (!cast<ConstantFPSDNode>(Zero)->isExactlyValue(0.0))
+      return false;
+  } else
+    return false;
+  
+  // Okay, we have at least one ~0 value, check to see if the rest match or are
+  // undefs.
+  for (++i; i != e; ++i)
+    if (N->getOperand(i) != Zero &&
+        N->getOperand(i).getOpcode() != ISD::UNDEF)
+      return false;
+  return true;
 }
 
 /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X)