tree-optimization/79333 - fold stmts following SSA edges in VN
authorRichard Biener <rguenther@suse.de>
Tue, 4 May 2021 13:51:20 +0000 (15:51 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 5 May 2021 07:11:32 +0000 (09:11 +0200)
This makes sure to follow SSA edges when folding eliminated stmts.
This reaps the same benefit as forwprop folding all stmts, not
waiting for one to produce copysign in the new testcase.

2021-05-04  Richard Biener  <rguenther@suse.de>

PR tree-optimization/79333
* tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_stmt):
Fold stmt following SSA edges.

* gcc.dg/tree-ssa/ssa-fre-94.c: New testcase.
* gcc.dg/graphite/fuse-1.c: Adjust.
* gcc.dg/pr43864-4.c: Likewise.

gcc/testsuite/gcc.dg/graphite/fuse-1.c
gcc/testsuite/gcc.dg/pr43864-4.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-94.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 204d3b2..527b6e5 100644 (file)
@@ -1,6 +1,6 @@
 /* Check that the two loops are fused and that we manage to fold the two xor
    operations.  */
-/* { dg-options "-O2 -floop-nest-optimize -fdump-tree-forwprop-all -fdump-tree-graphite-all" } */
+/* { dg-options "-O2 -floop-nest-optimize -fdump-tree-forwprop4 -fdump-tree-graphite-all" } */
 
 /* Make sure we fuse the loops like this:
 AST generated by isl:
@@ -12,7 +12,7 @@ for (int c0 = 0; c0 <= 99; c0 += 1) {
 /* { dg-final { scan-tree-dump-times "AST generated by isl:.*for \\(int c0 = 0; c0 <= 99; c0 \\+= 1\\) \\{.*S_.*\\(c0\\);.*S_.*\\(c0\\);.*S_.*\\(c0\\);.*\\}" 1 "graphite" } } */
 
 /* Check that after fusing the loops, the scalar computation is also fused.  */
-/* { dg-final { scan-tree-dump-times "gimple_simplified to\[^\\n\]*\\^ 12" 1 "forwprop4" } } */
+/* { dg-final { scan-tree-dump-times " \\^ 12;" 2 "forwprop4" } } */
 
 #define MAX 100
 int A[MAX];
index 3c6cc50..8a25b0f 100644 (file)
@@ -22,7 +22,7 @@ int f(int c, int b, int d)
   return r - r2;
 }
 
-/* { dg-final { scan-tree-dump-times "if " 0 "pre"} } */
-/* { dg-final { scan-tree-dump-times "(?n)_.*\\+.*_" 1 "pre"} } */
-/* { dg-final { scan-tree-dump-times "(?n)_.*-.*_" 2 "pre"} } */
+/* During PRE elimination we should simplify this to return b * 2.  */
+/* { dg-final { scan-tree-dump-times "if " 0 "pre" } } */
+/* { dg-final { scan-tree-dump "_\[0-9\]+ = b_\[0-9\]+\\(D\\) \\* 2;\[\\r\\n\]\[^\\r\\n\]*return _\[0-9\]+;" "pre" } } */
 /* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-94.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-94.c
new file mode 100644 (file)
index 0000000..92eebf6
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR tree-optimization/79333 */
+/* { dg-do compile } */
+/* { dg-options "-O -ffinite-math-only -fdump-tree-fre1" } */
+
+extern __inline __attribute__ ((__always_inline__,__gnu_inline__))
+double __attribute__ ((__nothrow__ , __leaf__))
+fabs (double __x) { return __builtin_fabs (__x); }
+
+double f(float f)
+{
+  double t1 = fabs(f);
+  double t2 = f / t1;
+  return t2;
+}
+
+/* { dg-final { scan-tree-dump "copysign" "fre1" } } */
index ca0974d..e54a0c9 100644 (file)
@@ -6362,7 +6362,7 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
        recompute_tree_invariant_for_addr_expr (gimple_assign_rhs1 (stmt));
       gimple_stmt_iterator prev = *gsi;
       gsi_prev (&prev);
-      if (fold_stmt (gsi))
+      if (fold_stmt (gsi, follow_all_ssa_edges))
        {
          /* fold_stmt may have created new stmts inbetween
             the previous stmt and the folded stmt.  Mark