On Tue, 21 Jul 2026, [email protected] wrote:

> From: Kyrylo Tkachov <[email protected]>
> 
> create_tmp_var_raw marks a replacement declaration as ignored.  At -O0,
> this can change use_register_for_decl from memory for the original user
> declaration to a pseudo for the replacement.  A partition can already own
> memory from a parameter default definition, which then makes set_rtl reject
> that memory for another name in the partition.
> 
> If the replacement would use a register, copy DECL_IGNORED_P so it keeps the
> storage choice made during coalescing.  Keep declarations that already use
> memory unchanged.  Add a checking assertion for the memory invariant.
>
> Bootstrapped and tested on aarch64-none-linux-gnu and x86_64-linux.
> 
> Ok for trunk?
> Thanks,
> Kyrill
> 
> gcc/ChangeLog:
> 
>       PR middle-end/126341
>       * tree-outof-ssa.cc (split_overlapping_partition_decls): Preserve
>       DECL_IGNORED_P.  Check that the replacement uses memory.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR middle-end/126341
>       * gcc.dg/pr126341.c: New test.
> 
> Signed-off-by: Kyrylo Tkachov <[email protected]>
> ---
>  gcc/testsuite/gcc.dg/pr126341.c | 53 +++++++++++++++++++++++++++++++++
>  gcc/tree-outof-ssa.cc           |  3 ++
>  2 files changed, 56 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/pr126341.c
> 
> diff --git a/gcc/testsuite/gcc.dg/pr126341.c b/gcc/testsuite/gcc.dg/pr126341.c
> new file mode 100644
> index 00000000000..76ed1d889e4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr126341.c
> @@ -0,0 +1,53 @@
> +/* { dg-do compile { target bitint575 } } */
> +/* { dg-options "-fnon-call-exceptions -ftree-coalesce-vars" } */
> +/* { dg-prune-output "division by zero" } */
> +
> +/* PR middle-end/126341 */
> +
> +#define N 0x200000000uwb
> +#define DIV0 (1 / 0)
> +
> +struct {
> +  char j[8];
> +} k;
> +char l;
> +int m, p, q, r;
> +long n;
> +_Complex o;
> +int s;
> +_BitInt (256) aa;
> +
> +void
> +foo (_BitInt (8) t)
> +{
> +  int ah, ai, aj = 1, ak, al = 1, am = 1, an = 1, ao = 1, ap = 1, aq = DIV0;
> +  int ar = 1, as = 1, at, au = DIV0;
> +  int av = 1;
> +  _BitInt (7) c = ak--;
> +  char aw = 1, ax = 1, ay = 1, az = 1, a = 1, d = 1, e = 1;
> +  int bfbg = 1, bh = 1, bi = p += ai -= __sync_add_and_fetch (&s, 1);
> +  int bj;
> +  int bk, blbm = 1, bt = 1, bu = 1, bv = __atomic_or_fetch (&aa, 1, 1);
> +  int bn = 1, bobp = 1, br = 1, bs = 1;
> +  unsigned b, cc;
> +  char cf, ce;
> +
> +  if (bj)
> +    goto ca;
> +  b = 1, cc = 1;
> +  for (;;);
> +  ce = q;
> +  cf = o ? 1
> +    :
> +    __builtin_stdc_rotate_left (__builtin_stdc_rotate_left
> +                             (c - 0x3bfuwb, br), n & 1) ? 3 : 3;
> +  1 +
> +    az & 1 | N << -az & m | ((az & 1 | N) << -az & 1 ? 0 : 7u) & 1 |
> +    ((az & 1 | N) - az & m | az & 1 | N) < 7 > -c & 1;
> +ca:
> +  s %= __builtin_stdc_rotate_left (cc, ah);
> +  at /= r ^= ({ __auto_type cg = 0; __auto_type ch = 0; 0; });
> +
> +  long ci = bk % cf;
> +  _BitInt (8) cj = l ? t : k.j[3];
> +}
> diff --git a/gcc/tree-outof-ssa.cc b/gcc/tree-outof-ssa.cc
> index 918dbbedde3..8a32dab42a5 100644
> --- a/gcc/tree-outof-ssa.cc
> +++ b/gcc/tree-outof-ssa.cc
> @@ -1101,6 +1101,9 @@ split_overlapping_partition_decls (var_map map)
>       continue;
>  
>        tree nvar = create_tmp_var_raw (TREE_TYPE (var));
> +      if (use_register_for_decl (nvar))

I think this warrants a comment in the code.

OK with that change.
Richard.

> +     DECL_IGNORED_P (nvar) = DECL_IGNORED_P (var);
> +      gcc_checking_assert (!use_register_for_decl (nvar));
>        DECL_CONTEXT (nvar) = DECL_CONTEXT (var);
>        DECL_SOURCE_LOCATION (nvar) = DECL_SOURCE_LOCATION (var);
>        SET_DECL_ALIGN (nvar, DECL_ALIGN (var));
> 

-- 
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