Change isBuildVectorAllOnesInteger to isBuildVectorAllOnes. Also check for
authorEvan Cheng <evan.cheng@apple.com>
Mon, 27 Mar 2006 06:58:47 +0000 (06:58 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 27 Mar 2006 06:58:47 +0000 (06:58 +0000)
floating point cases.

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

include/llvm/CodeGen/SelectionDAGNodes.h
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 4863940de272112760df7cd7b81c90ae78007aa1..ceb4ff752a6cd66999ba3394c9667bdf83d24758 100644 (file)
@@ -455,9 +455,9 @@ namespace ISD {
 
   /// Node predicates
 
-  /// 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 isBuildVectorAllOnesInteger(const SDNode *N);
+  bool isBuildVectorAllOnes(const SDNode *N);
 
   /// isBuildVectorAllZeros - Return true if the specified node is a
   /// BUILD_VECTOR where all of the elements are 0 or undef.
index ecda64c220c4775c8be61ac4d103a855030a533e..9c8b13029f6736dd9750f6688ca00891ee967f50 100644 (file)
@@ -70,11 +70,10 @@ bool ConstantFPSDNode::isExactlyValue(double V) const {
 //                              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 @@ bool ISD::isBuildVectorAllOnesInteger(const SDNode *N) {
   // 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 @@ bool ISD::isBuildVectorAllOnesInteger(const SDNode *N) {
 /// 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)