Commit 581aedec by Jeff Law Committed by Jeff Law

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
parent 84cf4ab6
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> 2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365 PR rtl-optimization/58365
......
2013-09-10 Jeff Law <law@redhat.com>
* gcc.c-torture/compile/pr58343.c: New test.
2013-09-10 Jakub Jelinek <jakub@redhat.com> 2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365 PR rtl-optimization/58365
......
int a;
int main ()
{
int b = a;
for (a = 1; a > 0; a--)
;
lbl:
if (b && a)
goto lbl;
return 0;
}
...@@ -764,7 +764,7 @@ thread_around_empty_blocks (edge taken_edge, ...@@ -764,7 +764,7 @@ thread_around_empty_blocks (edge taken_edge,
when threading. Thus they can not have visible side effects such when threading. Thus they can not have visible side effects such
as PHI nodes. */ as PHI nodes. */
if (!gsi_end_p (gsi_start_phis (bb))) if (!gsi_end_p (gsi_start_phis (bb)))
return NULL; return false;
/* Skip over DEBUG statements at the start of the block. */ /* Skip over DEBUG statements at the start of the block. */
gsi = gsi_start_nondebug_bb (bb); gsi = gsi_start_nondebug_bb (bb);
......
...@@ -640,14 +640,36 @@ thread_block (basic_block bb, bool noloop_only) ...@@ -640,14 +640,36 @@ thread_block (basic_block bb, bool noloop_only)
else else
e2 = THREAD_TARGET (e); e2 = THREAD_TARGET (e);
if (!e2 if (!e2 || noloop_only)
{
/* If NOLOOP_ONLY is true, we only allow threading through the /* If NOLOOP_ONLY is true, we only allow threading through the
header of a loop to exit edges. */ header of a loop to exit edges.
|| (noloop_only
&& bb == bb->loop_father->header 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) && (!loop_exit_edge_p (bb->loop_father, e2)
|| THREAD_TARGET2 (e)))) || THREAD_TARGET2 (e)))
continue; 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) if (e->dest == e2->src)
update_bb_profile_for_threading (e->dest, EDGE_FREQUENCY (e), update_bb_profile_for_threading (e->dest, EDGE_FREQUENCY (e),
......
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