re PR middle-end/31127 (ICE in cse_find_path, at cse.c:5930)

gcc/ChangeLog:
PR middle-end/31127
* cse.c (cse_find_path): Do not bail out if a basic block that
we already visited now becomes part of a path that starts at a
different basic block.  Just disallow this, to make sure we
visit each basic block at most once.
gcc/testsuite/ChangeLog:
PR middle-end/31127
* gcc.dg/pr31127.c: New.

From-SVN: r122900
This commit is contained in:
Alexandre Oliva 2007-03-14 01:45:39 +00:00
parent 4cdb798f6c
commit 481e0a49bb
4 changed files with 45 additions and 12 deletions

View File

@ -1,3 +1,11 @@
2007-03-13 Steven Bosscher <steven@gcc.gnu.org>
PR middle-end/31127
* cse.c (cse_find_path): Do not bail out if a basic block that
we already visited now becomes part of a path that starts at a
different basic block. Just disallow this, to make sure we
visit each basic block at most once.
2007-03-13 Jan Hubicka <jh@suse.cz>
* ipa-inline.c (cgraph_maybe_hot_edge_p): Look for hot/cold attributes,

View File

@ -5876,13 +5876,20 @@ cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
{
bb = FALLTHRU_EDGE (previous_bb_in_path)->dest;
if (bb != EXIT_BLOCK_PTR
&& single_pred_p (bb))
&& single_pred_p (bb)
/* We used to assert here that we would only see blocks
that we have not visited yet. But we may end up
visiting basic blocks twice if the CFG has changed
in this run of cse_main, because when the CFG changes
the topological sort of the CFG also changes. A basic
blocks that previously had more than two predecessors
may now have a single predecessor, and become part of
a path that starts at another basic block.
We still want to visit each basic block only once, so
halt the path here if we have already visited BB. */
&& !TEST_BIT (cse_visited_basic_blocks, bb->index))
{
#if ENABLE_CHECKING
/* We should only see blocks here that we have not
visited yet. */
gcc_assert (!TEST_BIT (cse_visited_basic_blocks, bb->index));
#endif
SET_BIT (cse_visited_basic_blocks, bb->index);
data->path[path_size++].bb = bb;
break;
@ -5921,14 +5928,12 @@ cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
e = NULL;
if (e && e->dest != EXIT_BLOCK_PTR
&& single_pred_p (e->dest))
&& single_pred_p (e->dest)
/* Avoid visiting basic blocks twice. The large comment
above explains why this can happen. */
&& !TEST_BIT (cse_visited_basic_blocks, e->dest->index))
{
basic_block bb2 = e->dest;
/* We should only see blocks here that we have not
visited yet. */
gcc_assert (!TEST_BIT (cse_visited_basic_blocks, bb2->index));
SET_BIT (cse_visited_basic_blocks, bb2->index);
data->path[path_size++].bb = bb2;
bb = bb2;

View File

@ -1,3 +1,8 @@
2007-03-13 Alexandre Oliva <aoliva@redhat.com>
PR middle-end/31127
* gcc.dg/pr31127.c: New.
2007-03-13 Zdenek Dvorak <dvorakz@suse.cz>
* gcc.dg/tree-ssa/loop-26.c: New test.

View File

@ -0,0 +1,15 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
void ParseStringSidToSid(char *s, int* p) {
int i = 0;
while (*s) {
while (*s && *s != '-')
s++;
if (*s== '-')
s++;
p[i++] = *s;
}
}