https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65950
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |pinskia at gcc dot gnu.org --- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Something like: diff --git a/gcc/predict.c b/gcc/predict.c index f2b50be..0a571c5 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2081,6 +2081,19 @@ tree_predict_by_opcode (basic_block bb) } } +static bool +is_exit_with_zero_arg (const gimple *stmt) +{ + /* This is not exit, _exit or _Exit. */ + if (!gimple_call_builtin_p (stmt, BUILT_IN_EXIT) + && !gimple_call_builtin_p (stmt, BUILT_IN__EXIT) + && !gimple_call_builtin_p (stmt, BUILT_IN__EXIT2)) + return false; + + /* Argument is an interger zero. */ + return integer_zerop (gimple_call_arg (stmt, 0)); +} + /* Try to guess whether the value of return means error code. */ static enum br_predictor @@ -2208,7 +2221,8 @@ tree_bb_level_predictions (void) if (is_gimple_call (stmt)) { if ((gimple_call_flags (stmt) & ECF_NORETURN) - && has_return_edges) + && has_return_edges + && !is_exit_with_zero_arg (stmt)) predict_paths_leading_to (bb, PRED_NORETURN, NOT_TAKEN); decl = gimple_call_fndecl (stmt); ------ CUT --- I am testing it right now.