From: Richard Biener Date: Tue, 4 May 2021 13:51:20 +0000 (+0200) Subject: tree-optimization/79333 - fold stmts following SSA edges in VN X-Git-Tag: basepoints/gcc-13~7837 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d846f225c25c5885250c303c8d118caa08c447ab;p=thirdparty%2Fgcc.git tree-optimization/79333 - fold stmts following SSA edges in VN 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 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. --- diff --git a/gcc/testsuite/gcc.dg/graphite/fuse-1.c b/gcc/testsuite/gcc.dg/graphite/fuse-1.c index 204d3b20703e..527b6e5c4159 100644 --- a/gcc/testsuite/gcc.dg/graphite/fuse-1.c +++ b/gcc/testsuite/gcc.dg/graphite/fuse-1.c @@ -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]; diff --git a/gcc/testsuite/gcc.dg/pr43864-4.c b/gcc/testsuite/gcc.dg/pr43864-4.c index 3c6cc50c5b82..8a25b0fd8efb 100644 --- a/gcc/testsuite/gcc.dg/pr43864-4.c +++ b/gcc/testsuite/gcc.dg/pr43864-4.c @@ -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 index 000000000000..92eebf636c65 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-94.c @@ -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" } } */ diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index ca0974d72b82..e54a0c9065c2 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -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