SImplify ConstantVector::get a bit and make it turn a vector
authorChris Lattner <sabre@nondot.org>
Thu, 10 Jul 2008 00:44:03 +0000 (00:44 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 10 Jul 2008 00:44:03 +0000 (00:44 +0000)
of all undefs into a single undef value.

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

lib/VMCore/Constants.cpp

index 7908638fd6795a8b7a3dd0e5b5fbc63c7e2c07b3..dc9cab032c5d15f8c4fcb923386f11762531af03 100644 (file)
@@ -1498,16 +1498,26 @@ static ManagedStatic<ValueMap<std::vector<Constant*>, VectorType,
 
 Constant *ConstantVector::get(const VectorType *Ty,
                               const std::vector<Constant*> &V) {
-  // If this is an all-zero vector, return a ConstantAggregateZero object
-  if (!V.empty()) {
-    Constant *C = V[0];
-    if (!C->isNullValue())
-      return VectorConstants->getOrCreate(Ty, V);
+  assert(!V.empty() && "Vectors can't be empty");
+  // If this is an all-undef or alll-zero vector, return a
+  // ConstantAggregateZero or UndefValue.
+  Constant *C = V[0];
+  bool isZero = C->isNullValue();
+  bool isUndef = isa<UndefValue>(C);
+
+  if (isZero || isUndef) {
     for (unsigned i = 1, e = V.size(); i != e; ++i)
-      if (V[i] != C)
-        return VectorConstants->getOrCreate(Ty, V);
+      if (V[i] != C) {
+        isZero = isUndef = false;
+        break;
+      }
   }
-  return ConstantAggregateZero::get(Ty);
+  
+  if (isZero)
+    return ConstantAggregateZero::get(Ty);
+  if (isUndef)
+    return UndefValue::get(Ty);
+  return VectorConstants->getOrCreate(Ty, V);
 }
 
 Constant *ConstantVector::get(const std::vector<Constant*> &V) {