Commit 05357ac3 by Teresa Johnson Committed by Jeff Law

tree-ssa-threadupdate.c (ssa_fix_duplicate_block_edges): Update redirected out…

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
parent a5290694
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> 2013-09-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/58554 PR tree-optimization/58554
......
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> 2013-09-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/58554 PR tree-optimization/58554
......
...@@ -42,7 +42,7 @@ expand_one_var (tree var, unsigned char toplevel, unsigned char really_expand) ...@@ -42,7 +42,7 @@ expand_one_var (tree var, unsigned char toplevel, unsigned char really_expand)
abort (); abort ();
} }
/* We should thread the jump, through an intermediate block. */ /* 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 { scan-tree-dump-times "Registering jump thread: \\(.*\\) incoming edge; \\(.*\\) joiner; \\(.*\\) nocopy;" 1 "dom1"} } */
/* { dg-final { cleanup-tree-dump "dom1" } } */ /* { dg-final { cleanup-tree-dump "dom1" } } */
...@@ -403,6 +403,7 @@ ssa_fix_duplicate_block_edges (struct redirection_data *rd, ...@@ -403,6 +403,7 @@ ssa_fix_duplicate_block_edges (struct redirection_data *rd,
threading through. That's the edge we want to redirect. */ threading through. That's the edge we want to redirect. */
victim = find_edge (rd->dup_block, THREAD_TARGET (e)->dest); victim = find_edge (rd->dup_block, THREAD_TARGET (e)->dest);
e2 = redirect_edge_and_branch (victim, THREAD_TARGET2 (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 /* If we redirected the edge, then we need to copy PHI arguments
at the target. If the edge already existed (e2 != victim case), at the target. If the edge already existed (e2 != victim case),
...@@ -497,18 +498,8 @@ ssa_redirect_edges (struct redirection_data **slot, ...@@ -497,18 +498,8 @@ ssa_redirect_edges (struct redirection_data **slot,
free (el); free (el);
thread_stats.num_threaded_edges++; 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) if (rd->dup_block)
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)
{ {
edge e2; edge e2;
...@@ -522,9 +513,15 @@ ssa_redirect_edges (struct redirection_data **slot, ...@@ -522,9 +513,15 @@ ssa_redirect_edges (struct redirection_data **slot,
the computation overflows. */ the computation overflows. */
if (rd->dup_block->frequency < BB_FREQ_MAX * 2) if (rd->dup_block->frequency < BB_FREQ_MAX * 2)
rd->dup_block->frequency += EDGE_FREQUENCY (e); rd->dup_block->frequency += EDGE_FREQUENCY (e);
EDGE_SUCC (rd->dup_block, 0)->count += e->count;
/* Redirect the incoming edge to the appropriate duplicate /* In the case of threading through a joiner block, the outgoing
block. */ 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); e2 = redirect_edge_and_branch (e, rd->dup_block);
gcc_assert (e == e2); gcc_assert (e == e2);
flush_pending_stmts (e2); flush_pending_stmts (e2);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment