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>
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>
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,
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);
......
......@@ -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),
......
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