re PR tree-optimization/77424 (Identical statements in if-else branches)

PR tree-optimization/77424
	* tree-ssa-threadupdate.c (thread_through_all_blocks): Remove
	dead conditionals.  Assert that all e->aux fields are NULL.

From-SVN: r241009
This commit is contained in:
Jeff Law 2016-10-11 15:41:51 -06:00 committed by Jeff Law
parent f6cf4810e9
commit 1fdf74c7c9
2 changed files with 12 additions and 46 deletions

View File

@ -1,3 +1,9 @@
2016-10-11 Jeff Law <law@redhat.com>
PR tree-optimization/77424
* tree-ssa-threadupdate.c (thread_through_all_blocks): Remove
dead conditionals. Assert that all e->aux fields are NULL.
2016-10-11 David Malcolm <dmalcolm@redhat.com>
* print-rtl.c (print_rtx): Rename "i" to "idx". Split out the

View File

@ -2550,55 +2550,15 @@ thread_through_all_blocks (bool may_peel_loop_headers)
retval |= thread_through_loop_header (loop, may_peel_loop_headers);
}
/* Any jump threading paths that are still attached to edges at this
point must be one of two cases.
First, we could have a jump threading path which went from outside
a loop to inside a loop that was ignored because a prior jump thread
across a backedge was realized (which indirectly causes the loop
above to ignore the latter thread). We can detect these because the
loop structures will be different and we do not currently try to
optimize this case.
Second, we could be threading across a backedge to a point within the
same loop. This occurrs for the FSA/FSM optimization and we would
like to optimize it. However, we have to be very careful as this
may completely scramble the loop structures, with the result being
irreducible loops causing us to throw away our loop structure.
As a compromise for the latter case, if the thread path ends in
a block where the last statement is a multiway branch, then go
ahead and thread it, else ignore it. */
/* All jump threading paths should have been resolved at this
point. Verify that is the case. */
basic_block bb;
edge e;
FOR_EACH_BB_FN (bb, cfun)
{
/* If we do end up threading here, we can remove elements from
BB->preds. Thus we can not use the FOR_EACH_EDGE iterator. */
for (edge_iterator ei = ei_start (bb->preds);
(e = ei_safe_edge (ei));)
if (e->aux)
{
vec<jump_thread_edge *> *path = THREAD_PATH (e);
/* Case 1, threading from outside to inside the loop
after we'd already threaded through the header. */
if ((*path)[0]->e->dest->loop_father
!= path->last ()->e->src->loop_father)
{
delete_jump_thread_path (path);
e->aux = NULL;
ei_next (&ei);
}
else
{
delete_jump_thread_path (path);
e->aux = NULL;
ei_next (&ei);
}
}
else
ei_next (&ei);
edge_iterator ei;
edge e;
FOR_EACH_EDGE (e, ei, bb->preds)
gcc_assert (e->aux == NULL);
}
statistics_counter_event (cfun, "Jumps threaded",