diff options
author | Richard Biener <rguenther@suse.de> | 2021-05-04 15:51:20 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-05-05 09:11:32 +0200 |
commit | d846f225c25c5885250c303c8d118caa08c447ab (patch) | |
tree | c4fa398db14529b017baaa0696620167001518eb /gcc | |
parent | 8ebf6b99952ada09bf9ea0144dcd1d46363b0464 (diff) | |
download | gcc-d846f225c25c5885250c303c8d118caa08c447ab.zip gcc-d846f225c25c5885250c303c8d118caa08c447ab.tar.gz gcc-d846f225c25c5885250c303c8d118caa08c447ab.tar.bz2 |
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 <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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/graphite/fuse-1.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr43864-4.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-94.c | 16 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 2 |
4 files changed, 22 insertions, 6 deletions
diff --git a/gcc/testsuite/gcc.dg/graphite/fuse-1.c b/gcc/testsuite/gcc.dg/graphite/fuse-1.c index 204d3b2..527b6e5 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 3c6cc50..8a25b0f 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 0000000..92eebf6 --- /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 ca0974d..e54a0c9 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 |