alignment: store_one_arg vs emit_push_insn
DJ Delorie
dj@redhat.com
Mon May 12 23:35:00 GMT 2003
> align = MIN (to ? MEM_ALIGN (to) : align, MEM_ALIGN (from));
Ok, something funny is going on here. In
gcc.c-torture/compile/structs.c, there's a case where align is 16, to
is NULL, and MEM_ALIGN(from) is 8. So, we reset align to 8. It then
crashes:
a 16 t 0 f 8 => 8
/greed/dj/ges/sanyo/uber/src/gcc/testsuite/gcc.c-torture/compile/structs.c: In function `main':
/greed/dj/ges/sanyo/uber/src/gcc/testsuite/gcc.c-torture/compile/structs.c:260: internal compiler error: in expand_call, at calls.c:3378
else
{
normal_call_insns = insns;
/* Verify that we've deallocated all the stack we used. */
if (old_stack_allocated !=
stack_pointer_delta - pending_stack_adjust)
abort ();
}
At that point, old_stack_allocated is 0, stack_pointer_delta is 16,
and pending_stack_adjust is 0. If I take the patch out,
stack_pointer_delta is 0 instead.
I'm guessing that move_by_pieces does not know how to push a
byte-aligned value onto a word-rounded (PUSH_ROUNDING) stack :-(
Any ideas?
More information about the Gcc-patches
mailing list