re PR tree-optimization/58343 (ICE in dfs_enumerate_from, at cfganal.c:1036)

PR tree-optimization/58343
	* tree-ssa-threadupdate.c (thread_block): Identify and disable
	jump threading requests through loop headers buried in the middle
	of a jump threading path.

	* tree-ssa-threadedge.c (thread_around_empty_blocks): Fix thinko
	in return value/type.

	* gcc.c-torture/compile/pr58343.c: New test.

From-SVN: r202441
This commit is contained in:
Jeff Law 2013-09-10 06:29:58 -06:00 committed by Jeff Law
parent 84cf4ab655
commit 581aedec91
5 changed files with 58 additions and 7 deletions

View File

@ -1,3 +1,13 @@
2013-09-10 Jeff Law <law@redhat.com>
PR tree-optimization/58343
* tree-ssa-threadupdate.c (thread_block): Identify and disable
jump threading requests through loop headers buried in the middle
of a jump threading path.
* tree-ssa-threadedge.c (thread_around_empty_blocks): Fix thinko
in return value/type.
2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365

View File

@ -1,3 +1,7 @@
2013-09-10 Jeff Law <law@redhat.com>
* gcc.c-torture/compile/pr58343.c: New test.
2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365

View File

@ -0,0 +1,15 @@
int a;
int main ()
{
int b = a;
for (a = 1; a > 0; a--)
;
lbl:
if (b && a)
goto lbl;
return 0;
}

View File

@ -764,7 +764,7 @@ thread_around_empty_blocks (edge taken_edge,
when threading. Thus they can not have visible side effects such
as PHI nodes. */
if (!gsi_end_p (gsi_start_phis (bb)))
return NULL;
return false;
/* Skip over DEBUG statements at the start of the block. */
gsi = gsi_start_nondebug_bb (bb);

View File

@ -640,14 +640,36 @@ thread_block (basic_block bb, bool noloop_only)
else
e2 = THREAD_TARGET (e);
if (!e2
if (!e2 || noloop_only)
{
/* If NOLOOP_ONLY is true, we only allow threading through the
header of a loop to exit edges. */
|| (noloop_only
&& bb == bb->loop_father->header
header of a loop to exit edges.
There are two cases to consider. The first when BB is the
loop header. We will attempt to thread this elsewhere, so
we can just continue here. */
if (bb == bb->loop_father->header
&& (!loop_exit_edge_p (bb->loop_father, e2)
|| THREAD_TARGET2 (e))))
continue;
|| THREAD_TARGET2 (e)))
continue;
/* The second occurs when there was loop header buried in a jump
threading path. We do not try and thread this elsewhere, so
just cancel the jump threading request by clearing the AUX
field now. */
if (bb->loop_father != e2->src->loop_father
&& !loop_exit_edge_p (e2->src->loop_father, e2))
{
/* Since this case is not handled by our special code
to thread through a loop header, we must explicitly
cancel the threading request here. */
free (e->aux);
e->aux = NULL;
continue;
}
}
if (e->dest == e2->src)
update_bb_profile_for_threading (e->dest, EDGE_FREQUENCY (e),