https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111107

--- Comment #39 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> What's the difference between the `-mstackrealign` option and the
> `force_align_arg_pointer` attribute?

-mstackrealign (ix86_force_align_arg_pointer) is only used here:

  /* In 32bit, use MIN_STACK_BOUNDARY for incoming stack boundary
     if -mstackrealign is used, it isn't used for sibcall check and
     estimated stack alignment is 128bit.  */
  else if (!sibcall
           && ix86_force_align_arg_pointer
           && crtl->stack_alignment_estimated == 128)
    incoming_stack_boundary = MIN_STACK_BOUNDARY;

force_align_arg_pointer works for any alignment, not just 128-bit.

> I'm quite confused by `-mstackrealign`: It could mean to realign the stack
> either to the preferred alignment (of every function), or to the required
> alignment, or just to at least 16 bytes. Without the final patch, the
> preferred alignment is 16 bytes, but unless a local variable requires
> 16-byte alignment, no stack realignment actually happens; even when a local
> variable requires 8-byte alignment (comment #23), the stack is still not
> aligned to an 8-byte boundary.

In practice -mstackrealign forces stack alignment to 16-byte (because it's the
preferred alignment) of every function that requires 16-byte alignment.  So it
has no effects for 8-byte alignment, but that's mostly OK in practice.

Reply via email to