mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-08 19:31:06 +08:00
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:
parent
84cf4ab655
commit
581aedec91
@ -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
|
||||
|
@ -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
|
||||
|
15
gcc/testsuite/gcc.c-torture/compile/pr58343.c
Normal file
15
gcc/testsuite/gcc.c-torture/compile/pr58343.c
Normal 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;
|
||||
}
|
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user