re PR tree-optimization/57075 (verify_flow_info failed: control flow in the middle of basic block)

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

	PR middle-end/57075
	* tree-inline.c (copy_edges_for_bb): Still split the bbs,
	even if not adding abnormal edges for calls that can make
	abnormal gotos.

	* gcc.dg/torture/pr57075.c: New testcase.

From-SVN: r198423
This commit is contained in:
Richard Biener 2013-04-29 15:06:18 +00:00 committed by Richard Biener
parent 0c2b20400c
commit a6f30e668a
4 changed files with 32 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2013-04-29 Richard Biener <rguenther@suse.de>
PR middle-end/57075
* tree-inline.c (copy_edges_for_bb): Still split the bbs,
even if not adding abnormal edges for calls that can make
abnormal gotos.
2013-04-29 Richard Biener <rguenther@suse.de>
PR middle-end/57103

View File

@ -1,3 +1,8 @@
2013-04-29 Richard Biener <rguenther@suse.de>
PR middle-end/57075
* gcc.dg/torture/pr57075.c: New testcase.
2013-04-29 Richard Biener <rguenther@suse.de>
PR middle-end/57103

View File

@ -0,0 +1,15 @@
/* { dg-do compile } */
extern int baz (void) __attribute__ ((returns_twice));
int __attribute__ ((__leaf__))
foo (void)
{
return __builtin_printf ("$");
}
void
bar ()
{
foo ();
baz ();
}

View File

@ -1923,11 +1923,7 @@ 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);
/* 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);
nonlocal_goto = stmt_can_make_abnormal_goto (copy_stmt);
if (can_throw || nonlocal_goto)
{
@ -1955,6 +1951,10 @@ copy_edges_for_bb (basic_block bb, gcov_type count_scale, basic_block ret_bb,
else if (can_throw)
make_eh_edges (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;
if (nonlocal_goto)
make_abnormal_goto_edges (gimple_bb (copy_stmt), true);