From 4d731f1702c373c4ce2efcd1adb2b4720cc223d5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 29 Oct 2008 16:19:24 +0100 Subject: [PATCH] re PR middle-end/37913 (ICE: Segmentation fault in link_block, cfg.c:153) PR middle-end/37913 * tree-cfgcleanup.c (split_bbs_on_noreturn_calls): Only split bbs that haven't been removed yet. * gcc.c-torture/compile/pr37913.c: New test. From-SVN: r141426 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr37913.c | 15 +++++++++++++++ gcc/tree-cfgcleanup.c | 5 +++++ 4 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr37913.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 643ca32594b..80e06ce8964 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-10-29 Jakub Jelinek + + PR middle-end/37913 + * tree-cfgcleanup.c (split_bbs_on_noreturn_calls): Only split bbs + that haven't been removed yet. + 2008-10-29 Bernd Schmidt * config/bfin/bfin.c (struct machine_function): New member diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14329874b01..2e23d6d4a1e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-10-28 Jakub Jelinek + + PR middle-end/37913 + * gcc.c-torture/compile/pr37913.c: New test. + 2008-10-28 Jakub Jelinek PR tree-optimization/37663 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37913.c b/gcc/testsuite/gcc.c-torture/compile/pr37913.c new file mode 100644 index 00000000000..98b8f647871 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37913.c @@ -0,0 +1,15 @@ +/* PR middle-end/37913 */ + +void foo (void) __attribute__ ((noreturn)); + +static int __attribute__ ((noreturn)) +bar (void) +{ + foo (); +} + +void +baz (void) +{ + int i = bar (); +} diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 433900c3a14..ba1854aae0f 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -483,7 +483,12 @@ split_bbs_on_noreturn_calls (void) { stmt = VEC_pop (gimple, MODIFIED_NORETURN_CALLS (cfun)); bb = gimple_bb (stmt); + /* BB might be deleted at this point, so verify first + BB is present in the cfg. */ if (bb == NULL + || bb->index < NUM_FIXED_BLOCKS + || bb->index >= n_basic_blocks + || BASIC_BLOCK (bb->index) != bb || last_stmt (bb) == stmt || !gimple_call_noreturn_p (stmt)) continue;