diff options
author | Jan Hubicka <jh@suse.cz> | 2020-08-01 17:02:24 +0200 |
---|---|---|
committer | Jan Hubicka <jh@suse.cz> | 2020-08-01 17:02:24 +0200 |
commit | 13cdbb6a97c3d853cd380e5a03be8e0d35966c1e (patch) | |
tree | 55d99999374dc0f56f0da39c15f51d626179f0a1 /gcc | |
parent | 7d599ad27b9bcf5165f87710f1abc64bbabd06ae (diff) | |
download | gcc-13cdbb6a97c3d853cd380e5a03be8e0d35966c1e.zip gcc-13cdbb6a97c3d853cd380e5a03be8e0d35966c1e.tar.gz gcc-13cdbb6a97c3d853cd380e5a03be8e0d35966c1e.tar.bz2 |
Cap frequency of recursive calls by 90%
* predict.c (estimate_bb_frequencies): Cap recursive calls by 90%.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/predict.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index a7ae977..0a317a7 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 |