Speed up isCString()
authorEvan Cheng <evan.cheng@apple.com>
Thu, 26 Oct 2006 21:48:03 +0000 (21:48 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 26 Oct 2006 21:48:03 +0000 (21:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31206 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Constants.cpp

index ce29a21f86c520da2040361ec7b3ab19bbadf065..9c92b90778382b8ab17097b71bd5c18017b471e5 100644 (file)
@@ -1077,11 +1077,21 @@ bool ConstantArray::isString() const {
 /// isString) and it ends in a null byte \0 and does not contains any other
 /// null bytes except its terminator.
 bool ConstantArray::isCString() const {
-  if (!isString()) return false;
-  // This is safe because a ConstantArray cannot be a zero array.
-  for (unsigned i = 0, e = getNumOperands()-1; i != e; ++i)
-    if (cast<ConstantInt>(getOperand(i))->getZExtValue() == 0)
+  // Check the element type for sbyte or ubyte...
+  if (getType()->getElementType() != Type::UByteTy &&
+      getType()->getElementType() != Type::SByteTy)
+    return false;
+  Constant *Zero = Constant::getNullValue(getOperand(0)->getType());
+  // Last element must be a null.
+  if (getOperand(getNumOperands()-1) != Zero)
+    return false;
+  // Other elements must be non-null integers.
+  for (unsigned i = 0, e = getNumOperands()-1; i != e; ++i) {
+    if (!isa<ConstantInt>(getOperand(i)))
       return false;
+    if (getOperand(i) == Zero)
+      return false;
+  }
   return true;
 }