Commit 92e776e9 by Richard Biener Committed by Richard Biener

re PR middle-end/57036 (ice in update_ssa_across_abnormal_edges)

2013-04-23  Richard Biener  <rguenther@suse.de>

	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
parent a15ee567
2013-04-23 Richard Biener <rguenther@suse.de>
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 <sofiane.naci@arm.com> 2013-04-23 Sofiane Naci <sofiane.naci@arm.com>
* config/aarch64/aarch64.md (*mov<mode>_aarch64): Add simd attribute. * config/aarch64/aarch64.md (*mov<mode>_aarch64): Add simd attribute.
......
2013-04-23 Richard Biener <rguenther@suse.de>
PR middle-end/57036
* gcc.dg/torture/pr57036-1.c: New testcase.
* gcc.dg/torture/pr57036-2.c: Likewise.
2013-04-23 Sofiane Naci <sofiane.naci@arm.com> 2013-04-23 Sofiane Naci <sofiane.naci@arm.com>
* gcc.target/aarch64/scalar-mov.c: New testcase. * gcc.target/aarch64/scalar-mov.c: New testcase.
......
/* { 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);
}
/* { 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;
}
...@@ -1866,7 +1866,8 @@ update_ssa_across_abnormal_edges (basic_block bb, basic_block ret_bb, ...@@ -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. */ debug stmts are left after a statement that must end the basic block. */
static bool 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; basic_block new_bb = (basic_block) bb->aux;
edge_iterator ei; edge_iterator ei;
...@@ -1921,7 +1922,11 @@ copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb) ...@@ -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 into a COMPONENT_REF which doesn't. If the copy
can throw, the original could also throw. */ can throw, the original could also throw. */
can_throw = stmt_can_throw_internal (copy_stmt); 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) if (can_throw || nonlocal_goto)
{ {
...@@ -2270,10 +2275,13 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale, ...@@ -2270,10 +2275,13 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale,
last = last_basic_block; last = last_basic_block;
/* Now that we've duplicated the blocks, duplicate their edges. */ /* 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) FOR_ALL_BB_FN (bb, cfun_to_copy)
if (!blocks_to_copy if (!blocks_to_copy
|| (bb->index > 0 && bitmap_bit_p (blocks_to_copy, bb->index))) || (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) if (new_entry)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment