diff options
Diffstat (limited to 'gcc/profile.c')
-rw-r--r-- | gcc/profile.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/gcc/profile.c b/gcc/profile.c index 6f05581711c..b8333987e02 100644 --- a/gcc/profile.c +++ b/gcc/profile.c @@ -1085,18 +1085,20 @@ branch_prob (void) or __builtin_setjmp_dispatcher calls. These are very special and don't expect anything to be inserted before them. */ - if (!is_gimple_call (first) - || (fndecl = gimple_call_fndecl (first)) == NULL - || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL - || (DECL_FUNCTION_CODE (fndecl) != BUILT_IN_SETJMP_RECEIVER - && (DECL_FUNCTION_CODE (fndecl) - != BUILT_IN_SETJMP_DISPATCHER))) - { - if (dump_file) - fprintf (dump_file, "Splitting bb %i after labels\n", - bb->index); - split_block_after_labels (bb); - } + if (is_gimple_call (first) + && (((fndecl = gimple_call_fndecl (first)) != NULL + && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL + && (DECL_FUNCTION_CODE (fndecl) + == BUILT_IN_SETJMP_RECEIVER + || (DECL_FUNCTION_CODE (fndecl) + == BUILT_IN_SETJMP_DISPATCHER))) + || gimple_call_flags (first) & ECF_RETURNS_TWICE)) + continue; + + if (dump_file) + fprintf (dump_file, "Splitting bb %i after labels\n", + bb->index); + split_block_after_labels (bb); } } } |