This fixes PR58532, a bootstrap-debug issue with -O3. Debug stmts got in the way of adding abnormal edges during inlining.
Bootstrapped on x86_64-unkown-linux-gnu (with -O3 and default flags), committed to trunk. Richard. 2013-09-30 Richard Biener <rguent...@suse.de> PR middle-end/58532 * tree-cfg.c (make_abnormal_goto_edges): Skip debug statements before looking for setjmp-like calls. * g++.dg/torture/pr58552.C: New testcase. Index: gcc/tree-cfg.c =================================================================== --- gcc/tree-cfg.c (revision 202971) +++ gcc/tree-cfg.c (working copy) @@ -1013,6 +1013,9 @@ make_abnormal_goto_edges (basic_block bb break; } } + if (!gsi_end_p (gsi) + && is_gimple_debug (gsi_stmt (gsi))) + gsi_next_nondebug (&gsi); if (!gsi_end_p (gsi)) { /* Make an edge to every setjmp-like call. */ Index: gcc/testsuite/g++.dg/torture/pr58552.C =================================================================== --- gcc/testsuite/g++.dg/torture/pr58552.C (revision 0) +++ gcc/testsuite/g++.dg/torture/pr58552.C (working copy) @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-additional-options "-fcompare-debug" } + +extern void fancy_abort () __attribute__ ((__noreturn__)); +extern "C" { + struct __jmp_buf_tag { }; + typedef struct __jmp_buf_tag jmp_buf[1]; + extern int _setjmp (struct __jmp_buf_tag __env[1]) throw (); +} +extern void *gfc_state_stack; +static jmp_buf eof_buf; +static void push_state () +{ + if (!gfc_state_stack) + fancy_abort (); +} +bool gfc_parse_file (void) +{ + int seen_program=0; + if (_setjmp (eof_buf)) + return false; + if (seen_program) + goto duplicate_main; + seen_program = 1; + push_state (); + push_state (); +duplicate_main: + return true; +}