OSDN Git Service

2010-07-29 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Jul 2010 12:31:29 +0000 (12:31 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Jul 2010 12:31:29 +0000 (12:31 +0000)
* tree.c (build_vector): Assert that the vector constant
has enough elements.
(build_vector_from_ctor): Pad with trailing zeros.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162677 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree.c

index 45155e4..44353ab 100644 (file)
@@ -1,5 +1,11 @@
 2010-07-29  Richard Guenther  <rguenther@suse.de>
 
+       * tree.c (build_vector): Assert that the vector constant
+       has enough elements.
+       (build_vector_from_ctor): Pad with trailing zeros.
+
+2010-07-29  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/45120
        * tree-ssa-structalias.c (get_constraint_for_component_ref):
        Handle offset in DEREFs properly.
index a33f22b..f401145 100644 (file)
@@ -1318,6 +1318,7 @@ build_vector (tree type, tree vals)
   tree v = make_node (VECTOR_CST);
   int over = 0;
   tree link;
+  unsigned cnt = 0;
 
   TREE_VECTOR_CST_ELTS (v) = vals;
   TREE_TYPE (v) = type;
@@ -1326,6 +1327,7 @@ build_vector (tree type, tree vals)
   for (link = vals; link; link = TREE_CHAIN (link))
     {
       tree value = TREE_VALUE (link);
+      cnt++;
 
       /* Don't crash if we get an address constant.  */
       if (!CONSTANT_CLASS_P (value))
@@ -1334,6 +1336,8 @@ build_vector (tree type, tree vals)
       over |= TREE_OVERFLOW (value);
     }
 
+  gcc_assert (cnt == TYPE_VECTOR_SUBPARTS (type));
+
   TREE_OVERFLOW (v) = over;
   return v;
 }
@@ -1350,6 +1354,9 @@ build_vector_from_ctor (tree type, VEC(constructor_elt,gc) *v)
 
   FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value)
     list = tree_cons (NULL_TREE, value, list);
+  for (; idx < TYPE_VECTOR_SUBPARTS (type); ++idx)
+    list = tree_cons (NULL_TREE,
+                     fold_convert (TREE_TYPE (type), integer_zero_node), list);
   return build_vector (type, nreverse (list));
 }