(expand_expr, case CONSTRUCTOR): If have a target, don't build
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 25 Dec 1993 22:51:12 +0000 (17:51 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 25 Dec 1993 22:51:12 +0000 (17:51 -0500)
constructor into memory.

From-SVN: r6323

gcc/expr.c

index c0bd5db..d17755d 100644 (file)
@@ -4089,13 +4089,17 @@ expand_expr (exp, target, tmode, modifier)
            expand_expr (TREE_VALUE (elt), const0_rtx, VOIDmode, 0);
          return const0_rtx;
        }
+
       /* All elts simple constants => refer to a constant in memory.  But
         if this is a non-BLKmode mode, let it store a field at a time
         since that should make a CONST_INT or CONST_DOUBLE when we
-        fold.  If we are making an initializer and all operands are
-        constant, put it in memory as well.  */
+        fold.  Likewise, if we have a target we can use, it is best to
+        store directly into the target.  If we are making an initializer and
+        all operands are constant, put it in memory as well.  */
       else if ((TREE_STATIC (exp)
-               && (mode == BLKmode || TREE_ADDRESSABLE (exp)))
+               && ((mode == BLKmode
+                    && ! (target != 0 && safe_from_p (target, exp)))
+                   || TREE_ADDRESSABLE (exp)))
               || (modifier == EXPAND_INITIALIZER && TREE_CONSTANT (exp)))
        {
          rtx constructor = output_constant_def (exp);