expr.c (move_by_pieces): Honor the alignment of TO and FROM.
authorDJ Delorie <dj@redhat.com>
Tue, 13 May 2003 18:15:20 +0000 (14:15 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Tue, 13 May 2003 18:15:20 +0000 (14:15 -0400)
* expr.c (move_by_pieces): Honor the alignment of TO and FROM.
(emit_push_insn): Don't use push when the source alignment is less
than the stack's push rounding.

From-SVN: r66770

gcc/ChangeLog
gcc/expr.c

index c57fab37ae57b5e96d9d1698b375c93c4b31ba80..20a0fedd5d63cffa26911327246fbc723bde32f7 100644 (file)
@@ -1,3 +1,9 @@
+2003-05-12  DJ Delorie  <dj@redhat.com>
+
+       * expr.c (move_by_pieces): Honor the alignment of TO and FROM.
+       (emit_push_insn): Don't use push when the source alignment is less
+       than the stack's push rounding.
+
 2003-05-13  Zack Weinberg  <zack@codesourcery.com>
 
        * diagnostic.c (output_format): Add support for %m.
index 07d4b14e25dd983c2dab7c8e8fe51587cf114fa8..9c21ac9a3a7097aeaa3ed708189d05cf49a1d7a8 100644 (file)
@@ -1463,7 +1463,7 @@ convert_modes (mode, oldmode, x, unsignedp)
    If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is
    used to push FROM to the stack.
 
-   ALIGN is maximum alignment we can assume.  */
+   ALIGN is maximum stack alignment we can assume.  */
 
 void
 move_by_pieces (to, from, len, align)
@@ -1477,6 +1477,8 @@ move_by_pieces (to, from, len, align)
   enum machine_mode mode = VOIDmode, tmode;
   enum insn_code icode;
 
+  align = MIN (to ? MEM_ALIGN (to) : align, MEM_ALIGN (from));
+
   data.offset = 0;
   data.from_addr = from_addr;
   if (to)
@@ -3849,6 +3851,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
          && PUSH_ARGS
          && GET_CODE (size) == CONST_INT
          && skip == 0
+         && MEM_ALIGN (xinner) >= align
          && (MOVE_BY_PIECES_P ((unsigned) INTVAL (size) - used, align))
          /* Here we avoid the case of a structure whose weak alignment
             forces many pushes of a small amount of data,