From 13cdbb6a97c3d853cd380e5a03be8e0d35966c1e Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 1 Aug 2020 17:02:24 +0200 Subject: [PATCH] Cap frequency of recursive calls by 90% * predict.c (estimate_bb_frequencies): Cap recursive calls by 90%. --- gcc/predict.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/gcc/predict.c b/gcc/predict.c index a7ae977c866..0a317a7a4ac 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -3892,7 +3892,30 @@ estimate_bb_frequencies (bool force) cfun->cfg->count_max = profile_count::uninitialized (); FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb) { - sreal tmp = BLOCK_INFO (bb)->frequency * freq_max + sreal (1, -1); + sreal tmp = BLOCK_INFO (bb)->frequency; + if (tmp >= 1) + { + gimple_stmt_iterator gsi; + tree decl; + + /* Self recursive calls can not have frequency greater than 1 + or program will never terminate. This will result in an + inconsistent bb profile but it is better than greatly confusing + IPA cost metrics. */ + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + if (is_gimple_call (gsi_stmt (gsi)) + && (decl = gimple_call_fndecl (gsi_stmt (gsi))) != NULL + && recursive_call_p (current_function_decl, decl)) + { + if (dump_file) + fprintf (dump_file, "Dropping frequency of recursive call" + " in bb %i from %f\n", bb->index, + tmp.to_double ()); + tmp = (sreal)9 / (sreal)10; + break; + } + } + tmp = tmp * freq_max + sreal (1, -1); profile_count count = profile_count::from_gcov_type (tmp.to_int ()); /* If we have profile feedback in which this function was never -- 2.30.2