On Wed, 26 Aug 2026, Oleg Tolmatcev wrote:

> defer_stack_allocation and expand_one_stack_var_1 computed a
> local's stack alignment in two different ways, so a variable the former
> considered small enough to allocate immediately could trip the
> large-alignment assert in the latter (PR target/120192).  Use
> align_local_variable in both.
> 
> Regtested on x86_64-pc-linux-gnu and, under QEMU, on
> aarch64-unknown-linux-gnu, with no new failures.

OK.

Thanks,
Richard.

> gcc/ChangeLog:
> 
>       PR target/120192
>       * cfgexpand.cc (defer_stack_allocation): Use align_local_variable
>       to compute the alignment, matching expand_one_stack_var_1.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR target/120192
>       * gcc.target/i386/pr120192.c: New test.
> 
> Signed-off-by: Oleg Tolmatcev <[email protected]>
> ---
>  gcc/cfgexpand.cc                         | 8 +++++---
>  gcc/testsuite/gcc.target/i386/pr120192.c | 9 +++++++++
>  2 files changed, 14 insertions(+), 3 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr120192.c
> 
> diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
> index 128cfc7768..245ba357b5 100644
> --- a/gcc/cfgexpand.cc
> +++ b/gcc/cfgexpand.cc
> @@ -1995,9 +1995,11 @@ defer_stack_allocation (tree var, bool toplevel)
>    if (flag_stack_protect || asan_sanitize_stack_p ())
>      return true;
>  
> -  unsigned int align = TREE_CODE (var) == SSA_NAME
> -    ? TYPE_ALIGN (TREE_TYPE (var))
> -    : DECL_ALIGN (var);
> +  /* Use the same effective alignment that expand_one_stack_var_1 would use.
> +     If that alignment exceeds MAX_SUPPORTED_STACK_ALIGNMENT, defer
> +     the variable so that expand_stack_vars handles its large alignment,
> +     rather than calling expand_one_stack_var_1 and failing its assertion.  
> */
> +  unsigned int align = align_local_variable (var, false) * BITS_PER_UNIT;
>  
>    /* We handle "large" alignment via dynamic allocation.  We want to handle
>       this extra complication in only one place, so defer them.  */
> diff --git a/gcc/testsuite/gcc.target/i386/pr120192.c 
> b/gcc/testsuite/gcc.target/i386/pr120192.c
> new file mode 100644
> index 0000000000..9cb60a69e9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr120192.c
> @@ -0,0 +1,9 @@
> +/* PR target/120192 */
> +/* { dg-do compile { target x86_64-*-mingw* } } */
> +/* { dg-options "-O0 -mavx" } */
> +
> +typedef char a;
> +void b() {
> +  typedef a c __attribute__((vector_size(32), aligned));
> +  c d = {};
> +}
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)

Reply via email to