https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111107
--- Comment #26 from LIU Hao <lh_mouse at 126 dot com> --- (In reply to Zeb Figura from comment #25) > That's the difference between -mpreferred-stack-boundary and > -mincoming-stack-boundary; I'm asking about -mstackrealign. i386.opt: mstackrealign Target Var(ix86_force_align_arg_pointer) Realign stack in prologue. ... which is used here: static unsigned int ix86_minimum_incoming_stack_boundary (bool sibcall) { unsigned int incoming_stack_boundary; /* Stack of interrupt handler is aligned to 128 bits in 64bit mode. */ if (cfun->machine->func_type != TYPE_NORMAL) incoming_stack_boundary = TARGET_64BIT ? 128 : MIN_STACK_BOUNDARY; /* Prefer the one specified at command line. */ else if (ix86_user_incoming_stack_boundary) incoming_stack_boundary = ix86_user_incoming_stack_boundary; /* 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; else incoming_stack_boundary = ix86_default_incoming_stack_boundary; In this case, not an interrupt handler, no `-mincoming-stack-boundary` from command line, no `-mstackrealign`; so `incoming_stack_boundary` is set to `ix86_default_incoming_stack_boundary`, which is `PREFERRED_STACK_BOUNDARY`. Thus, if we decrease default preferred stack boundary to 32, `incoming_stack_boundary` will also be decreased accordingly, unless overridden by some other options. > > In i386-options.cc there's > > > > ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY; > > > > Would it make any sense to decrease the preferred stack boundary to `32` > > (like below)? Maybe it's too late, but Microsoft code has always been > > assuming 4-byte alignment, thus a 16-byte alignment is always unpredictable. > > > > #undef PREFERRED_STACK_BOUNDARY_DEFAULT > > #define PREFERRED_STACK_BOUNDARY_DEFAULT \ > > (TARGET_64BIT ? 128 : MIN_STACK_BOUNDARY) > > Yes, that's what I would advocate for. gcc should assume 4-byte alignment > and it should preserve 4-byte alignment. After a little testing, I think `-mincoming-stack-boundary=2 -mpreferred-stack-boundary=2` should fix the issue. I'm gonna propose a patch for such a change after my bootstrap completes.