在 2026-6-9 22:52, Jonathan Yong 写道:
On 6/9/26 07:48, Richard Biener wrote: +CC: LHOn 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_endprologueA realignment operation such as `and rsp, -32` would allocate an unknown number of bytes and is not encodeable.
-- Best regards, LIU Hao
OpenPGP_signature.asc
Description: OpenPGP digital signature
