]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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 204d3b20703e18098e023e537f539bb63db3fd16..527b6e5c41597ce72f4e6a2a912039dd41b3d7f3 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 3c6cc50c5b82ccf2db5c81119d20d5ff22414372..8a25b0fd8efbea8ecf28389950616bade6b61702 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 ca0974d72b826254b954eed512989ff8adfec1c2..e54a0c9065c2c3c6ef64acafec8cb131d3570f06 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