From f26aca6db222608dad580009b47b21b5774d9baa Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Tue, 13 May 2003 14:15:20 -0400 Subject: [PATCH] expr.c (move_by_pieces): Honor the alignment of TO and FROM. * 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 | 6 ++++++ gcc/expr.c | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c57fab37ae5..20a0fedd5d6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-05-12 DJ Delorie + + * 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 * diagnostic.c (output_format): Add support for %m. diff --git a/gcc/expr.c b/gcc/expr.c index 07d4b14e25d..9c21ac9a3a7 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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,