diff options
author | Martin Liska <mliska@suse.cz> | 2017-09-01 15:02:37 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2017-09-01 13:02:37 +0000 |
commit | 002618d87483cfb6481b0a044f113c9cf87d4ed6 (patch) | |
tree | 1b23eb613e74a81e3afccc8d0276e8b176b0ee71 | |
parent | a2de90a45a9193cb19a5837110698fe59d6deb41 (diff) | |
download | gcc-002618d87483cfb6481b0a044f113c9cf87d4ed6.zip gcc-002618d87483cfb6481b0a044f113c9cf87d4ed6.tar.gz gcc-002618d87483cfb6481b0a044f113c9cf87d4ed6.tar.bz2 |
Fix profile update in tree-ssa-isolate-paths.c (PR tree-optimization/82059).
2017-09-01 Martin Liska <mliska@suse.cz>
PR tree-optimization/82059
* gimple-ssa-isolate-paths.c (isolate_path): Add profile and
frequency only when an edge is redirected.
2017-09-01 Martin Liska <mliska@suse.cz>
PR tree-optimization/82059
* gcc.dg/tree-ssa/pr82059.c: New test.
From-SVN: r251591
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/gimple-ssa-isolate-paths.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr82059.c | 22 |
4 files changed, 39 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61ba899..125eb92 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-09-01 Martin Liska <mliska@suse.cz> + + PR tree-optimization/82059 + * gimple-ssa-isolate-paths.c (isolate_path): Add profile and + frequency only when an edge is redirected. + 2017-09-01 Claudiu Zissulescu <claziss@synopsys.com> * config/arc/arc-c.c (__ARC_LPC_WIDTH__): Add builtin define. diff --git a/gcc/gimple-ssa-isolate-paths.c b/gcc/gimple-ssa-isolate-paths.c index fbc41057..807e003 100644 --- a/gcc/gimple-ssa-isolate-paths.c +++ b/gcc/gimple-ssa-isolate-paths.c @@ -160,14 +160,17 @@ isolate_path (basic_block bb, basic_block duplicate, for (ei = ei_start (duplicate->succs); (e2 = ei_safe_edge (ei)); ) remove_edge (e2); } - bb->frequency += EDGE_FREQUENCY (e); - bb->count += e->count; /* Complete the isolation step by redirecting E to reach DUPLICATE. */ e2 = redirect_edge_and_branch (e, duplicate); if (e2) - flush_pending_stmts (e2); + { + flush_pending_stmts (e2); + /* Update profile only when redirection is really processed. */ + bb->frequency += EDGE_FREQUENCY (e); + bb->count += e->count; + } /* There may be more than one statement in DUPLICATE which exhibits undefined behavior. Ultimately we want the first such statement in diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 12161a6..0cd2a62 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-09-01 Martin Liska <mliska@suse.cz> + + PR tree-optimization/82059 + * gcc.dg/tree-ssa/pr82059.c: New test. + 2017-09-01 Claudiu Zissulescu <claziss@synopsys.com> * gcc.target/arc/loop-1.c: Deleted. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c b/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c new file mode 100644 index 0000000..0285b03 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c @@ -0,0 +1,22 @@ +/* PR tree-optimization/82059 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-isolate-paths" } */ + +struct a +{ + char b; + struct a *c; +} d (), f; +void *e; +long g; +void +h () +{ + struct a *i = 0; + if (g) + i = e; + if (!i) + d (); + i->c = &f; + i->b = *(char *) h; +} |