From 481e0a49bb403b8bb01550e550f90ed2125b9e04 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 14 Mar 2007 01:45:39 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/cse.c | 29 +++++++++++++++++------------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr31127.c | 15 +++++++++++++++ 4 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr31127.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b90b689e837..9d2fc89953e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-03-13 Steven Bosscher + + 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 * ipa-inline.c (cgraph_maybe_hot_edge_p): Look for hot/cold attributes, diff --git a/gcc/cse.c b/gcc/cse.c index 6976d455753..cdc5ebe4ce3 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c0358cfc826..3007d98f41e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-13 Alexandre Oliva + + PR middle-end/31127 + * gcc.dg/pr31127.c: New. + 2007-03-13 Zdenek Dvorak * gcc.dg/tree-ssa/loop-26.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr31127.c b/gcc/testsuite/gcc.dg/pr31127.c new file mode 100644 index 00000000000..f45b10ed5bb --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr31127.c @@ -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; + } +}