]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/87984 - hard register assignments not preserved
authorRichard Biener <rguenther@suse.de>
Fri, 28 Feb 2025 09:36:11 +0000 (10:36 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 24 Jun 2025 08:20:28 +0000 (10:20 +0200)
The following disables redundant store elimination to hard register
variables which isn't valid.

PR tree-optimization/87984
* tree-ssa-dom.cc (dom_opt_dom_walker::optimize_stmt): Do
not perform redundant store elimination to hard register
variables.
* tree-ssa-sccvn.cc (eliminate_dom_walker::eliminate_stmt):
Likewise.

* gcc.target/i386/pr87984.c: New testcase.

(cherry picked from commit 535115caaf97f5201fb528f67f15b4c52be5619d)

gcc/testsuite/gcc.target/i386/pr87984.c [new file with mode: 0644]
gcc/tree-ssa-dom.cc
gcc/tree-ssa-sccvn.cc

diff --git a/gcc/testsuite/gcc.target/i386/pr87984.c b/gcc/testsuite/gcc.target/i386/pr87984.c
new file mode 100644 (file)
index 0000000..39a6a74
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do run } */
+/* { dg-options "-O" } */
+
+__attribute__((noipa))
+int f(void)
+{
+  int o = 0;
+  for (int i = 0; i < 3; i++)
+    {
+      register int a asm("eax");
+      a = 1;
+      asm("add %1, %0" : "+r"(o) : "r"(a));
+      asm("xor %%eax, %%eax" ::: "eax");
+    }
+  return o;
+}
+
+int main()
+{
+  if (f() != 3)
+    __builtin_abort();
+  return 0;
+}
index 0ad2e8e7f94f430230bd08a46ee575ab4d9a7246..3e22e8ef341f33fcec1e449bfaaa0492b89070ed 100644 (file)
@@ -2245,7 +2245,9 @@ dom_opt_dom_walker::optimize_stmt (basic_block bb, gimple_stmt_iterator *si,
 
       /* Perform simple redundant store elimination.  */
       if (gimple_assign_single_p (stmt)
-         && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
+         && TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME
+         && (TREE_CODE (gimple_assign_lhs (stmt)) != VAR_DECL
+             || !DECL_HARD_REGISTER (gimple_assign_lhs (stmt))))
        {
          tree lhs = gimple_assign_lhs (stmt);
          tree rhs = gimple_assign_rhs1 (stmt);
index 60a4826e58019938f1e9e0d08391b70786fc46d8..54855cc9db33b79ad9f6eb07b826cce0f408d514 100644 (file)
@@ -6585,6 +6585,8 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
   if (gimple_assign_single_p (stmt)
       && !gimple_has_volatile_ops (stmt)
       && !is_gimple_reg (gimple_assign_lhs (stmt))
+      && (TREE_CODE (gimple_assign_lhs (stmt)) != VAR_DECL
+         || !DECL_HARD_REGISTER (gimple_assign_lhs (stmt)))
       && (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
          || is_gimple_min_invariant (gimple_assign_rhs1 (stmt))))
     {