diff mbox series

[pushed] rtl-ssa: Avoid using a stale splay tree root [PR116009]

Message ID mpt4j8h4eht.fsf@arm.com
State New
Headers show
Series [pushed] rtl-ssa: Avoid using a stale splay tree root [PR116009] | expand

Commit Message

Richard Sandiford July 22, 2024, 3:45 p.m. UTC
In the fix for PR115928, I'd failed to notice that "root" was used
later in the function, so needed to be updated.

Boostrapped & regression-tested on aarch64-linux-gnu.  Pushed as obvious.

Richard


gcc/
	PR rtl-optimization/116009
	* rtl-ssa/accesses.cc (function_info::add_def): Set the root
	local variable after removing the old clobber group.

gcc/testsuite/
	PR rtl-optimization/116009
	* gcc.c-torture/compile/pr116009.c: New test.
---
 gcc/rtl-ssa/accesses.cc                       |  3 ++-
 .../gcc.c-torture/compile/pr116009.c          | 23 +++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr116009.c
diff mbox series

Patch

diff --git a/gcc/rtl-ssa/accesses.cc b/gcc/rtl-ssa/accesses.cc
index c77a1ff7ea7..0bba8391b00 100644
--- a/gcc/rtl-ssa/accesses.cc
+++ b/gcc/rtl-ssa/accesses.cc
@@ -946,7 +946,8 @@  function_info::add_def (def_info *def)
 	  prev = split_clobber_group (group, insn);
 	  next = prev->next_def ();
 	  tree.remove_root ();
-	  last->set_splay_root (tree.root ());
+	  root = tree.root ();
+	  last->set_splay_root (root);
 	}
       // COMPARISON is < 0 if DEF comes before ROOT or > 0 if DEF comes
       // after ROOT.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr116009.c b/gcc/testsuite/gcc.c-torture/compile/pr116009.c
new file mode 100644
index 00000000000..6a888d450f4
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr116009.c
@@ -0,0 +1,23 @@ 
+int tt, tt1;
+int y6;
+void ff(void);
+int ttt;
+void g(int var) {
+  do  {
+        int t1 = var == 45 || var == 3434;
+        if (tt != 0)
+            if (t1)
+                ff();
+        if (tt < 0)
+            break;
+        if (t1)
+          ff();
+        if (tt < 0)
+            break;
+        ff();
+        if (tt1)
+            var = y6;
+        if (t1)
+          ff();
+    } while(1);
+}