diff options
author | Jan Hubicka <jh@suse.cz> | 2005-03-18 21:15:06 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2005-03-18 20:15:06 +0000 |
commit | 33156717fa04cfb12d1b2c70ba1bdcd236e5a6b9 (patch) | |
tree | c8155205eea9acda3648c08b1f00c2d20be9270e /gcc/cfg.c | |
parent | 76ef0a0d97acb099fe476a8394704c6db73a4109 (diff) | |
download | gcc-33156717fa04cfb12d1b2c70ba1bdcd236e5a6b9.zip gcc-33156717fa04cfb12d1b2c70ba1bdcd236e5a6b9.tar.gz gcc-33156717fa04cfb12d1b2c70ba1bdcd236e5a6b9.tar.bz2 |
basic-block.h (scale_bbs_frequencies_int, [...]): Declare.
* basic-block.h (scale_bbs_frequencies_int,
scale_bbs_frequencies_gcov_type): Declare.
* cfg.c (RDIV): New macro.
(update_bb_frequency_for_threading): Fix.
* basic-block.h (scale_bbs_frequencies_int,
scale_bbs_frequencies_gcov_type): New.
* cfgloopmanip.c (scale_bbs_frequencies): Kill.
(scale_loop_frequencies, duplicate_loop_to_header_edge): Use
scale_bbs_frequencies_int.
* tree-ssa-loop-ch.c (copy_loop_headers): Fix profiling info.
Co-Authored-By: Dale Johannesen <dalej@apple.com>
From-SVN: r96700
Diffstat (limited to 'gcc/cfg.c')
-rw-r--r-- | gcc/cfg.c | 43 |
1 files changed, 41 insertions, 2 deletions
@@ -96,6 +96,8 @@ static void free_edge (edge); /* Indicate the presence of the profile. */ enum profile_status profile_status; +#define RDIV(X,Y) (((X) + (Y) / 2) / (Y)) + /* Called once at initialization time. */ void @@ -933,10 +935,10 @@ update_bb_profile_for_threading (basic_block bb, int edge_frequency, } else if (prob != REG_BR_PROB_BASE) { - int scale = REG_BR_PROB_BASE / prob; + int scale = 65536 * REG_BR_PROB_BASE / prob; FOR_EACH_EDGE (c, ei, bb->succs) - c->probability *= scale; + c->probability *= scale / 65536; } if (bb != taken_edge->src) @@ -945,3 +947,40 @@ update_bb_profile_for_threading (basic_block bb, int edge_frequency, if (taken_edge->count < 0) taken_edge->count = 0; } + +/* Multiply all frequencies of basic blocks in array BBS of length NBBS + by NUM/DEN, in int arithmetic. May lose some accuracy. */ +void +scale_bbs_frequencies_int (basic_block *bbs, int nbbs, int num, int den) +{ + int i; + edge e; + for (i = 0; i < nbbs; i++) + { + edge_iterator ei; + bbs[i]->frequency = (bbs[i]->frequency * num) / den; + bbs[i]->count = RDIV (bbs[i]->count * num, den); + FOR_EACH_EDGE (e, ei, bbs[i]->succs) + e->count = (e->count * num) /den; + } +} + +/* Multiply all frequencies of basic blocks in array BBS of length NBBS + by NUM/DEN, in gcov_type arithmetic. More accurate than previous + function but considerably slower. */ +void +scale_bbs_frequencies_gcov_type (basic_block *bbs, int nbbs, gcov_type num, + gcov_type den) +{ + int i; + edge e; + + for (i = 0; i < nbbs; i++) + { + edge_iterator ei; + bbs[i]->frequency = (bbs[i]->frequency * num) / den; + bbs[i]->count = RDIV (bbs[i]->count * num, den); + FOR_EACH_EDGE (e, ei, bbs[i]->succs) + e->count = (e->count * num) /den; + } +} |