From a9eafe819c64a5f6dbc52dbe908ca680de8ca103 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Mon, 20 Aug 2007 07:42:55 +0000 Subject: [PATCH] re PR tree-optimization/30564 (ice for legal code with -O3) 2007-08-20 Andrew Pinski PR middle-end/30564 * tree-inline.c (optimize_inline_calls): Move the cgraph checking code in front of the compacting of basic blocks. Move the folding of statements inbetween the cgraph checking and compacting of basic blocks. 2007-08-20 Andrew Pinski PR middle-end/30564 * gcc.c-torture/compile/pr30564-1.c: New test. * gcc.c-torture/compile/pr30564-2.c: New test. From-SVN: r127638 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.c-torture/compile/pr30564-1.c | 15 +++++++++++++++ gcc/testsuite/gcc.c-torture/compile/pr30564-2.c | 12 ++++++++++++ gcc/tree-inline.c | 15 +++++++++------ 5 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr30564-1.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr30564-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 544218059e9..6f486f805ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-08-20 Andrew Pinski + + PR middle-end/30564 + * tree-inline.c (optimize_inline_calls): Move the cgraph checking + code in front of the compacting of basic blocks. + Move the folding of statements inbetween the cgraph checking + and compacting of basic blocks. + 2007-08-19 Andrew Pinski Serge Belyshev diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 34a5659e2ed..22e5df78637 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-08-20 Andrew Pinski + + PR middle-end/30564 + * gcc.c-torture/compile/pr30564-1.c: New test. + * gcc.c-torture/compile/pr30564-2.c: New test. + 2007-08-19 Joseph Myers * gcc.dg/debug/dwarf2/aranges-fnsec-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr30564-1.c b/gcc/testsuite/gcc.c-torture/compile/pr30564-1.c new file mode 100644 index 00000000000..6c373f74bb3 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr30564-1.c @@ -0,0 +1,15 @@ +static int spready[] = {0, 1, 2, 3}; +void explosion_map (int y) +{ + int i; + for (i = 0; i < 4; i++) + if (y * spready[i] < 0) + break; +} +void explosion (void) +{ + int i; + explosion_map (0); + for (i = 0; i < 2; i++) + continue; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr30564-2.c b/gcc/testsuite/gcc.c-torture/compile/pr30564-2.c new file mode 100644 index 00000000000..403f3966172 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr30564-2.c @@ -0,0 +1,12 @@ + +static int RawOrEnc = 0; +static inline void addpair(int fp, int un) +{ + if (RawOrEnc == 0 && fp != un) + RawOrEnc = 1; +} +int f(int un0, char *a, unsigned int __s2_len) +{ + addpair(un0, un0); + __s2_len < 4 ? __builtin_strcmp (a, "-") : 0; +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 3609480dc43..c078166bd16 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2823,10 +2823,6 @@ optimize_inline_calls (tree fn) gimple_expand_calls_inline (bb, &id); pop_gimplify_context (NULL); - /* Renumber the (code) basic_blocks consecutively. */ - compact_blocks (); - /* Renumber the lexical scoping (non-code) blocks consecutively. */ - number_blocks (fn); #ifdef ENABLE_CHECKING { @@ -2839,13 +2835,20 @@ optimize_inline_calls (tree fn) gcc_assert (e->inline_failed); } #endif + + /* Fold the statements before compacting/renumbering the basic blocks. */ + fold_marked_statements (last, id.statements_to_fold); + pointer_set_destroy (id.statements_to_fold); + + /* Renumber the (code) basic_blocks consecutively. */ + compact_blocks (); + /* Renumber the lexical scoping (non-code) blocks consecutively. */ + number_blocks (fn); /* We are not going to maintain the cgraph edges up to date. Kill it so it won't confuse us. */ cgraph_node_remove_callees (id.dst_node); - fold_marked_statements (last, id.statements_to_fold); - pointer_set_destroy (id.statements_to_fold); fold_cond_expr_cond (); if (current_function_has_nonlocal_label) make_nonlocal_label_edges ();