Implement Regression/Assembler/2005-12-21-ZeroInitVector.ll
authorChris Lattner <sabre@nondot.org>
Wed, 21 Dec 2005 17:53:02 +0000 (17:53 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 21 Dec 2005 17:53:02 +0000 (17:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24903 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/ParserInternals.h
lib/AsmParser/llvmAsmParser.y

index b21dea7a078fee17f174e49fb4409a5bc71d96a3..6f747c742633609a2c5f577387ca70e116b852a7 100644 (file)
@@ -82,7 +82,7 @@ static inline void ThrowException(const std::string &message,
 struct ValID {
   enum {
     NumberVal, NameVal, ConstSIntVal, ConstUIntVal, ConstFPVal, ConstNullVal,
-    ConstUndefVal, ConstantVal,
+    ConstUndefVal, ConstZeroVal, ConstantVal,
   } Type;
 
   union {
@@ -122,6 +122,10 @@ struct ValID {
     ValID D; D.Type = ConstUndefVal; return D;
   }
 
+  static ValID createZeroInit() {
+    ValID D; D.Type = ConstZeroVal; return D;
+  }
+  
   static ValID create(Constant *Val) {
     ValID D; D.Type = ConstantVal; D.ConstantValue = Val; return D;
   }
@@ -145,6 +149,7 @@ struct ValID {
     case ConstFPVal    : return ftostr(ConstPoolFP);
     case ConstNullVal  : return "null";
     case ConstUndefVal : return "undef";
+    case ConstZeroVal  : return "zeroinitializer";
     case ConstUIntVal  :
     case ConstSIntVal  : return std::string("%") + itostr(ConstPool64);
     case ConstantVal:
@@ -168,6 +173,7 @@ struct ValID {
     case ConstFPVal:    return ConstPoolFP  < V.ConstPoolFP;
     case ConstNullVal:  return false;
     case ConstUndefVal: return false;
+    case ConstZeroVal: return false;
     case ConstantVal:   return ConstantValue < V.ConstantValue;
     default:  assert(0 && "Unknown value type!"); return false;
     }
index 549a96d9c61795e72d44b269a74ac543ef7f945c..dfaeb8301529b9fbae91f1e9ea04d93066c569af 100644 (file)
@@ -303,6 +303,9 @@ static Value *getValNonImprovising(const Type *Ty, const ValID &D) {
   case ValID::ConstUndefVal:      // Is it an undef value?
     return UndefValue::get(Ty);
 
+  case ValID::ConstZeroVal:      // Is it a zero value?
+    return Constant::getNullValue(Ty);
+    
   case ValID::ConstantVal:       // Fully resolved constant?
     if (D.ConstantValue->getType() != Ty)
       ThrowException("Constant expression type different from required type!");
@@ -1816,6 +1819,9 @@ ConstValueRef : ESINT64VAL {    // A reference to a direct constant
   | UNDEF {
     $$ = ValID::createUndef();
   }
+  | ZEROINITIALIZER {     // A vector zero constant.
+    $$ = ValID::createZeroInit();
+  }
   | '<' ConstVector '>' { // Nonempty unsized packed vector
     const Type *ETy = (*$2)[0]->getType();
     int NumElements = $2->size();