diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5fc85caaf7d4..0b08748b9c1d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-10-18 Andrew Pinski + + PR tree-opt/65950 + * predict.c (is_exit_with_zero_arg): New function. + (tree_bb_level_predictions): Don't consider paths leading to exit(0) + as nottaken. + 2016-10-18 Uros Bizjak PR target/77991 diff --git a/gcc/predict.c b/gcc/predict.c index 9950c095cc02..1bf04d18c1c7 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2512,6 +2512,21 @@ tree_predict_by_opcode (basic_block bb) } } +/* Returns TRUE if the STMT is exit(0) like statement. */ + +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 @@ -2638,7 +2653,9 @@ tree_bb_level_predictions (void) if (is_gimple_call (stmt)) { - if (gimple_call_noreturn_p (stmt) && has_return_edges) + if (gimple_call_noreturn_p (stmt) + && has_return_edges + && !is_exit_with_zero_arg (stmt)) predict_paths_leading_to (bb, PRED_NORETURN, NOT_TAKEN); decl = gimple_call_fndecl (stmt);