expr.c (expand_expr): Output partially zeroed out vectors with output_constant_def.
authorAldy Hernandez <aldyh@redhat.com>
Fri, 31 May 2002 02:21:31 +0000 (02:21 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Fri, 31 May 2002 02:21:31 +0000 (02:21 +0000)
2002-05-31  Aldy Hernandez  <aldyh@redhat.com>

        * expr.c (expand_expr): Output partially zeroed out vectors with
        output_constant_def.

From-SVN: r54080

gcc/ChangeLog
gcc/expr.c

index 0a59a301caa570be0dbb1691f9401bb284e1db38..3e6bc49bef776539bb765d3c10daeb0c3ab4e6fc 100644 (file)
@@ -1,3 +1,8 @@
+2002-05-31  Aldy Hernandez  <aldyh@redhat.com>
+
+        * expr.c (expand_expr): Output partially zeroed out vectors with
+        output_constant_def.
+
 2002-05-30  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * config.gcc (sh[123456789l]*-*-*): Set cpu_type to sh.
index f839b402676874fa6687cfccce5c8f519daa45d6..b373ad2e6d4e1e3404ca840e3ac6ebc6cecfa60b 100644 (file)
@@ -6758,7 +6758,13 @@ expand_expr (exp, target, tmode, modifier)
         fold.  Likewise, if we have a target we can use, it is best to
         store directly into the target unless the type is large enough
         that memcpy will be used.  If we are making an initializer and
-        all operands are constant, put it in memory as well.  */
+        all operands are constant, put it in memory as well.
+
+       FIXME: Avoid trying to fill vector constructors piece-meal.
+       Output them with output_constant_def below unless we're sure
+       they're zeros.  This should go away when vector initializers
+       are treated like VECTOR_CST instead of arrays.
+      */
       else if ((TREE_STATIC (exp)
                && ((mode == BLKmode
                     && ! (target != 0 && safe_from_p (target, exp, 1)))
@@ -6767,7 +6773,9 @@ expand_expr (exp, target, tmode, modifier)
                        && (! MOVE_BY_PIECES_P
                            (tree_low_cst (TYPE_SIZE_UNIT (type), 1),
                             TYPE_ALIGN (type)))
-                       && ! mostly_zeros_p (exp))))
+                       && ((TREE_CODE (type) == VECTOR_TYPE
+                            && !is_zeros_p (exp))
+                           || ! mostly_zeros_p (exp)))))
               || (modifier == EXPAND_INITIALIZER && TREE_CONSTANT (exp)))
        {
          rtx constructor = output_constant_def (exp, 1);