re PR tree-optimization/59322 (ICE with segfault on valid code at -O1, -O2, and -O3 on x86_64-linux-gnu)

PR tree-optimization/59322
	* tree-ssa-threadedge.c (create_edge_and_update_destination_phis):
	Remove code which copied jump threading paths.

	PR tree-optimization/59322
	* gcc.c-torture/compile/pr59322.c: New test

From-SVN: r205617
This commit is contained in:
Jeff Law 2013-12-02 20:36:58 -07:00 committed by Jeff Law
parent 80f1fd0dab
commit 4dd0ef2765
4 changed files with 42 additions and 20 deletions

View File

@ -1,3 +1,9 @@
2013-12-02 Jeff Law <law@redhat.com>
PR tree-optimization/59322
* tree-ssa-threadedge.c (create_edge_and_update_destination_phis):
Remove code which copied jump threading paths.
2013-12-02 Sriraman Tallam <tmsriram@google.com>
PR target/58944

View File

@ -1,3 +1,8 @@
2013-12-02 Jeff Law <law@redhat.com>
PR tree-optimization/59322
* gcc.c-torture/compile/pr59322.c: New test
2013-12-02 Sriraman Tallam <tmsriram@google.com>
PR target/58944

View File

@ -0,0 +1,16 @@
int a, b, d;
short c;
int
foo ()
{
for (b = 0; b; b = a)
for (c = 18; c < 10; c++)
{
d = c;
if (d)
return 0;
}
return 0;
}

View File

@ -421,27 +421,22 @@ create_edge_and_update_destination_phis (struct redirection_data *rd,
e->probability = REG_BR_PROB_BASE;
e->count = bb->count;
/* We have to copy path -- which means creating a new vector as well
as all the jump_thread_edge entries. */
if (rd->path->last ()->e->aux)
{
vec<jump_thread_edge *> *path = THREAD_PATH (rd->path->last ()->e);
vec<jump_thread_edge *> *copy = new vec<jump_thread_edge *> ();
/* We used to copy the thread path here. That was added in 2007
and dutifully updated through the representation changes in 2013.
/* Sadly, the elements of the vector are pointers and need to
be copied as well. */
for (unsigned int i = 0; i < path->length (); i++)
{
jump_thread_edge *x
= new jump_thread_edge ((*path)[i]->e, (*path)[i]->type);
copy->safe_push (x);
}
e->aux = (void *)copy;
}
else
{
e->aux = NULL;
}
In 2013 we added code to thread from an interior node through
the backedge to another interior node. That runs after the code
to thread through loop headers from outside the loop.
The latter may delete edges in the CFG, including those
which appeared in the jump threading path we copied here. Thus
we'd end up using a dangling pointer.
After reviewing the 2007/2011 code, I can't see how anything
depended on copying the AUX field and clearly copying the jump
threading path is problematical due to embedded edge pointers.
It has been removed. */
e->aux = NULL;
/* If there are any PHI nodes at the destination of the outgoing edge
from the duplicate block, then we will need to add a new argument