tree-optimization/101278 - handle self-use in DSE analysis
authorRichard Biener <rguenther@suse.de>
Thu, 1 Jul 2021 09:16:01 +0000 (11:16 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 1 Jul 2021 10:31:21 +0000 (12:31 +0200)
DSE store classification short-cuts the to-be classified stmt itself
from chaining but fails to first check whether the store uses itself
which can be the case when it is a call with the LHS also passed by
value as argument.

2021-07-01  Richard Biener  <rguenther@suse.de>

PR tree-optimization/101278
* tree-ssa-dse.c (dse_classify_store): First check for
uses, then ignore stmt for chaining purposes.

* gcc.dg/torture/pr101278.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr101278.c [new file with mode: 0644]
gcc/tree-ssa-dse.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr101278.c b/gcc/testsuite/gcc.dg/torture/pr101278.c
new file mode 100644 (file)
index 0000000..1d25658
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+
+struct X { int counter; };
+
+struct X __attribute__((noipa)) foo (struct X x)
+{
+  x.counter++;
+  if (x.counter == 5)
+    __builtin_exit (0);
+  return x;
+}
+
+int
+main ()
+{
+  struct X x;
+  x.counter = 0;
+  for (int i = 0; i < 10; ++i)
+    x = foo (x);
+  __builtin_abort ();
+}
index c3939a6..98daa8a 100644 (file)
@@ -813,15 +813,11 @@ dse_classify_store (ao_ref *ref, gimple *stmt,
              break;
            }
 
-         /* We have visited ourselves already so ignore STMT for the
-            purpose of chaining.  */
-         if (use_stmt == stmt)
-           ;
          /* In simple cases we can look through PHI nodes, but we
             have to be careful with loops and with memory references
             containing operands that are also operands of PHI nodes.
             See gcc.c-torture/execute/20051110-*.c.  */
-         else if (gimple_code (use_stmt) == GIMPLE_PHI)
+         if (gimple_code (use_stmt) == GIMPLE_PHI)
            {
              /* If we already visited this PHI ignore it for further
                 processing.  */
@@ -861,6 +857,10 @@ dse_classify_store (ao_ref *ref, gimple *stmt,
              fail = true;
              break;
            }
+         /* We have visited ourselves already so ignore STMT for the
+            purpose of chaining.  */
+         else if (use_stmt == stmt)
+           ;
          /* If this is a store, remember it as we possibly need to walk the
             defs uses.  */
          else if (gimple_vdef (use_stmt))