Commit fba7c564 by Richard Biener Committed by Richard Biener

re PR tree-optimization/60280 (gcc.target/arm/ivopts.c and…

re PR tree-optimization/60280 (gcc.target/arm/ivopts.c and gcc.target/arm/ivopts-2.c failed caused by preserving loop structure.)

2014-02-28  Richard Biener  <rguenther@suse.de>

	PR target/60280
	* tree-cfgcleanup.c (tree_forwarder_block_p): Restrict
	previous fix and only allow to remove trivial pre-headers
	and latches.  Also honor LOOPS_MAY_HAVE_MULTIPLE_LATCHES.
	(remove_forwarder_block): Properly update the latch of
	a loop.

From-SVN: r208222
parent 0618dee5
2014-02-28 Richard Biener <rguenther@suse.de>
PR target/60280
* tree-cfgcleanup.c (tree_forwarder_block_p): Restrict
previous fix and only allow to remove trivial pre-headers
and latches. Also honor LOOPS_MAY_HAVE_MULTIPLE_LATCHES.
(remove_forwarder_block): Properly update the latch of
a loop.
2014-02-28 Alexandre Oliva <aoliva@redhat.com> 2014-02-28 Alexandre Oliva <aoliva@redhat.com>
PR debug/59992 PR debug/59992
......
...@@ -316,13 +316,22 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted) ...@@ -316,13 +316,22 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted)
/* Protect loop preheaders and latches if requested. */ /* Protect loop preheaders and latches if requested. */
if (dest->loop_father->header == dest) if (dest->loop_father->header == dest)
{ {
if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS) if (bb->loop_father == dest->loop_father)
&& bb->loop_father->header != dest) {
return false; if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
return false;
if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES) /* If bb doesn't have a single predecessor we'd make this
&& bb->loop_father->header == dest) loop have multiple latches. Don't do that if that
return false; would in turn require disambiguating them. */
return (single_pred_p (bb)
|| loops_state_satisfies_p
(LOOPS_MAY_HAVE_MULTIPLE_LATCHES));
}
else if (bb->loop_father == loop_outer (dest->loop_father))
return !loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS);
/* Always preserve other edges into loop headers that are
not simple latches or preheaders. */
return false;
} }
} }
...@@ -417,6 +426,10 @@ remove_forwarder_block (basic_block bb) ...@@ -417,6 +426,10 @@ remove_forwarder_block (basic_block bb)
can_move_debug_stmts = MAY_HAVE_DEBUG_STMTS && single_pred_p (dest); can_move_debug_stmts = MAY_HAVE_DEBUG_STMTS && single_pred_p (dest);
basic_block pred = NULL;
if (single_pred_p (bb))
pred = single_pred (bb);
/* Redirect the edges. */ /* Redirect the edges. */
for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); ) for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
{ {
...@@ -510,7 +523,7 @@ remove_forwarder_block (basic_block bb) ...@@ -510,7 +523,7 @@ remove_forwarder_block (basic_block bb)
/* Adjust latch infomation of BB's parent loop as otherwise /* Adjust latch infomation of BB's parent loop as otherwise
the cfg hook has a hard time not to kill the loop. */ the cfg hook has a hard time not to kill the loop. */
if (current_loops && bb->loop_father->latch == bb) if (current_loops && bb->loop_father->latch == bb)
bb->loop_father->latch = dest; bb->loop_father->latch = pred;
/* And kill the forwarder block. */ /* And kill the forwarder block. */
delete_basic_block (bb); delete_basic_block (bb);
......
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