aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2013-09-30 20:09:25 +0000
committerJeff Law <law@gcc.gnu.org>2013-09-30 14:09:25 -0600
commit05357ac367d24f312969ad738d701a682a4a4d97 (patch)
tree8632d3d941c238df0040713166b848ad5bad2fc8
parenta52906946a730f253946f4ff3db9797784cba479 (diff)
downloadgcc-05357ac367d24f312969ad738d701a682a4a4d97.zip
gcc-05357ac367d24f312969ad738d701a682a4a4d97.tar.gz
gcc-05357ac367d24f312969ad738d701a682a4a4d97.tar.bz2
tree-ssa-threadupdate.c (ssa_fix_duplicate_block_edges): Update redirected out edge count in joiner case.
* tree-ssa-threadupdate.c (ssa_fix_duplicate_block_edges): Update redirected out edge count in joiner case. (ssa_redirect_edges): Common the joiner and non-joiner cases so that joiner case gets profile updates. * testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c (expand_one_var): Update for additional dump message. From-SVN: r203041
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c2
-rw-r--r--gcc/tree-ssa-threadupdate.c25
4 files changed, 25 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1d4720b..ee3e01e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2013-09-30 Teresa Johnson <tejohnson@google.com>
+
+ * tree-ssa-threadupdate.c (ssa_fix_duplicate_block_edges):
+ Update redirected out edge count in joiner case.
+ (ssa_redirect_edges): Common the joiner and non-joiner cases
+ so that joiner case gets profile updates.
+
2013-09-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/58554
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 75ac73a..9814774 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-09-30 Teresa Johnson <tejohnson@google.com>
+
+ * testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c (expand_one_var):
+ Update for additional dump message.
+
+
2013-09-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/58554
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c
index 222a97b..0d53f50 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c
@@ -42,7 +42,7 @@ expand_one_var (tree var, unsigned char toplevel, unsigned char really_expand)
abort ();
}
/* We should thread the jump, through an intermediate block. */
-/* { dg-final { scan-tree-dump-times "Threaded" 1 "dom1"} } */
+/* { dg-final { scan-tree-dump-times "Threaded" 2 "dom1"} } */
/* { dg-final { scan-tree-dump-times "Registering jump thread: \\(.*\\) incoming edge; \\(.*\\) joiner; \\(.*\\) nocopy;" 1 "dom1"} } */
/* { dg-final { cleanup-tree-dump "dom1" } } */
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index 05d5682..15d4d04 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -403,6 +403,7 @@ ssa_fix_duplicate_block_edges (struct redirection_data *rd,
threading through. That's the edge we want to redirect. */
victim = find_edge (rd->dup_block, THREAD_TARGET (e)->dest);
e2 = redirect_edge_and_branch (victim, THREAD_TARGET2 (e)->dest);
+ e2->count = THREAD_TARGET2 (e)->count;
/* If we redirected the edge, then we need to copy PHI arguments
at the target. If the edge already existed (e2 != victim case),
@@ -497,18 +498,8 @@ ssa_redirect_edges (struct redirection_data **slot,
free (el);
thread_stats.num_threaded_edges++;
- /* If we are threading through a joiner block, then we have to
- find the edge we want to redirect and update some PHI nodes. */
- if (THREAD_TARGET2 (e))
- {
- edge e2;
- /* We want to redirect the incoming edge to the joiner block (E)
- to instead reach the duplicate of the joiner block. */
- e2 = redirect_edge_and_branch (e, rd->dup_block);
- flush_pending_stmts (e2);
- }
- else if (rd->dup_block)
+ if (rd->dup_block)
{
edge e2;
@@ -522,9 +513,15 @@ ssa_redirect_edges (struct redirection_data **slot,
the computation overflows. */
if (rd->dup_block->frequency < BB_FREQ_MAX * 2)
rd->dup_block->frequency += EDGE_FREQUENCY (e);
- EDGE_SUCC (rd->dup_block, 0)->count += e->count;
- /* Redirect the incoming edge to the appropriate duplicate
- block. */
+
+ /* In the case of threading through a joiner block, the outgoing
+ edges from the duplicate block were updated when they were
+ redirected during ssa_fix_duplicate_block_edges. */
+ if (!THREAD_TARGET2 (e))
+ EDGE_SUCC (rd->dup_block, 0)->count += e->count;
+
+ /* Redirect the incoming edge (possibly to the joiner block) to the
+ appropriate duplicate block. */
e2 = redirect_edge_and_branch (e, rd->dup_block);
gcc_assert (e == e2);
flush_pending_stmts (e2);