aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2020-08-01 17:02:24 +0200
committerJan Hubicka <jh@suse.cz>2020-08-01 17:02:24 +0200
commit13cdbb6a97c3d853cd380e5a03be8e0d35966c1e (patch)
tree55d99999374dc0f56f0da39c15f51d626179f0a1 /gcc
parent7d599ad27b9bcf5165f87710f1abc64bbabd06ae (diff)
downloadgcc-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.c25
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