在 2026-6-9 22:52, Jonathan Yong 写道:
On 6/9/26 07:48, Richard Biener wrote:
+CC: LH

On Sat, Jun 6, 2026 at 2:34 PM Oleg Tolmatcev <[email protected]> wrote:

From: oltolm <[email protected]>

Fix PR54412 by preserving over-alignment for stack slots used for
indirect argument passing and returns on Win64 targets that require it.

On x86_64-w64-mingw32, TARGET_SEH limits
MAX_SUPPORTED_STACK_ALIGNMENT to 128 bits, but fixed-size AVX and
AVX512 values can still require greater alignment when passed or
returned indirectly. Generic stack-slot allocation can therefore
produce under-aligned slots, leading to misaligned aligned-move
accesses and runtime failures.

I think this is a x86 specific bug in how it optimizes things, the target uses
carefully orchestrated code to "optimize" "unnecessary" alignment, so I
suspect the proper fix would be to x86 target code, not to complicate the
middle-end side.  But see below for comments on the patch.

What's the actual reason TARGET_SEH sets MAX_SUPPORTED_STACK_ALIGNMENT
to 128 (thus, disables stack re-alignment)?

The reason for that is that SEH unwinding format is incapable of encoding a 
realignment operation:

   
https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170#raw-pseudo-operations

These opcodes are emitted in a prologue like this

   push rbp
   .seh_pushreg rbp
   push rdi
   .seh_pushreg rdi
   push rsi
   .seh_pushreg rsi
   sub rsp, 288
   .seh_stackalloc 288
   lea rbp, [rsp + 128]
   .seh_setframe rbp, 128
   .seh_endprologue

A realignment operation such as `and rsp, -32` would allocate an unknown number of bytes and is not encodeable.




--
Best regards,
LIU Hao

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

Reply via email to