From 92e776e9971b9fc4e31fd0f23352809cb3680d3a Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 23 Apr 2013 14:36:02 +0000 Subject: [PATCH] re PR middle-end/57036 (ice in update_ssa_across_abnormal_edges) 2013-04-23 Richard Biener PR middle-end/57036 * tree-inline.c (copy_edges_for_bb): Add can_make_abnormal_goto parameter, only add abnormal goto edges from the copied body if the call could perform abnormal gotos. (copy_cfg_body): Adjust. * gcc.dg/torture/pr57036-1.c: New testcase. * gcc.dg/torture/pr57036-2.c: Likewise. From-SVN: r198192 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/torture/pr57036-1.c | 16 +++++++++++++++ gcc/testsuite/gcc.dg/torture/pr57036-2.c | 25 ++++++++++++++++++++++++ gcc/tree-inline.c | 14 ++++++++++--- 5 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr57036-1.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr57036-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 307d38911a8..ca931ae0374 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-04-23 Richard Biener + + PR middle-end/57036 + * tree-inline.c (copy_edges_for_bb): Add can_make_abnormal_goto + parameter, only add abnormal goto edges from the copied body + if the call could perform abnormal gotos. + (copy_cfg_body): Adjust. + 2013-04-23 Sofiane Naci * config/aarch64/aarch64.md (*mov_aarch64): Add simd attribute. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a54279a598d..a9c869490c8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-04-23 Richard Biener + + PR middle-end/57036 + * gcc.dg/torture/pr57036-1.c: New testcase. + * gcc.dg/torture/pr57036-2.c: Likewise. + 2013-04-23 Sofiane Naci * gcc.target/aarch64/scalar-mov.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr57036-1.c b/gcc/testsuite/gcc.dg/torture/pr57036-1.c new file mode 100644 index 00000000000..5aa63bd7506 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57036-1.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +extern void g (void); +extern __inline __attribute__ ((__always_inline__,__leaf__)) +f () +{ + g (); +} +struct __jmp_buf_tag *b; +int jpgDecode_convert (unsigned i) +{ + if (i != 0) + f (); + read_buf_open (); + return _setjmp (b); +} diff --git a/gcc/testsuite/gcc.dg/torture/pr57036-2.c b/gcc/testsuite/gcc.dg/torture/pr57036-2.c new file mode 100644 index 00000000000..25de5cd1509 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57036-2.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ + +int j_; +int jpgDecode_convert (unsigned i) +{ + __label__ label; + int j; + + inline void __attribute__((always_inline,leaf)) f(void) + { + g(); + } + + void __attribute__((noinline)) read_buf_open (void) + { + goto label; + } + + if (i != 0) + f (); + j = j_; + read_buf_open (); +label: + return j; +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index b94ba10ee0b..7fa0245d16c 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1866,7 +1866,8 @@ update_ssa_across_abnormal_edges (basic_block bb, basic_block ret_bb, debug stmts are left after a statement that must end the basic block. */ static bool -copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb) +copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb, + bool can_make_abnormal_goto) { basic_block new_bb = (basic_block) bb->aux; edge_iterator ei; @@ -1921,7 +1922,11 @@ copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb) into a COMPONENT_REF which doesn't. If the copy can throw, the original could also throw. */ can_throw = stmt_can_throw_internal (copy_stmt); - nonlocal_goto = stmt_can_make_abnormal_goto (copy_stmt); + /* If the call we inline cannot make abnormal goto do not add + additional abnormal edges but only retain those already present + in the original function body. */ + nonlocal_goto + = can_make_abnormal_goto && stmt_can_make_abnormal_goto (copy_stmt); if (can_throw || nonlocal_goto) { @@ -2270,10 +2275,13 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale, last = last_basic_block; /* Now that we've duplicated the blocks, duplicate their edges. */ + bool can_make_abormal_goto + = id->gimple_call && stmt_can_make_abnormal_goto (id->gimple_call); FOR_ALL_BB_FN (bb, cfun_to_copy) if (!blocks_to_copy || (bb->index > 0 && bitmap_bit_p (blocks_to_copy, bb->index))) - need_debug_cleanup |= copy_edges_for_bb (bb, count_scale, exit_block_map); + need_debug_cleanup |= copy_edges_for_bb (bb, count_scale, exit_block_map, + can_make_abormal_goto); if (new_entry) { -- 2.30.2