[gcc r16-9386] out-of-SSA: Preserve storage for split partition decls [PR126341]

Kyrylo Tkachov via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:06f9f3e43ce19f5882e180a3e5c1373a016d29e4

commit r16-9386-g06f9f3e43ce19f5882e180a3e5c1373a016d29e4
Author: Kyrylo Tkachov <[email protected]>
Date:   Tue Jul 21 02:44:06 2026 -0700

    out-of-SSA: Preserve storage for split partition decls [PR126341]
    
    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.
    
    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]>
    (cherry picked from commit 7459f9136500bfb881902834d56fb110b77909f2)

Diff:
---
 gcc/testsuite/gcc.dg/pr126341.c | 53 +++++++++++++++++++++++++++++++++++++++++
 gcc/tree-outof-ssa.cc           |  5 ++++
 2 files changed, 58 insertions(+)

diff --git a/gcc/testsuite/gcc.dg/pr126341.c b/gcc/testsuite/gcc.dg/pr126341.c
new file mode 100644
index 000000000000..76ed1d889e48
--- /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 918dbbedde36..17d5e70e71d8 100644
--- a/gcc/tree-outof-ssa.cc
+++ b/gcc/tree-outof-ssa.cc
@@ -1101,6 +1101,11 @@ split_overlapping_partition_decls (var_map map)
 	continue;
 
       tree nvar = create_tmp_var_raw (TREE_TYPE (var));
+      /* Avoid a register-only NVAR when the partition already has a MEM,
+	 since set_rtl cannot assign that MEM to NVAR.  */
+      if (use_register_for_decl (nvar))
+	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));
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.