]> 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>
Fri, 28 Feb 2025 11:38:00 +0000 (12:38 +0100)
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.

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 291c3a4fa6b5068e2653e2d6011481e76047731c..b1ac35e12fd97b52e1720be7af7083b248461c76 100644 (file)
@@ -2454,7 +2454,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 146840664e2ea0a81f169c805dab63cd2be507bc..5a8c7c3aa10b991ff6298e9ba50b8b9ef97ec967 100644 (file)
@@ -7081,6 +7081,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))))
     {