diff options
author | Pat Haugen <pthaugen@us.ibm.com> | 2016-10-14 17:10:18 +0000 |
---|---|---|
committer | Pat Haugen <pthaugen@gcc.gnu.org> | 2016-10-14 17:10:18 +0000 |
commit | d4919e65cae926b962425ff3d8c71a668f63c209 (patch) | |
tree | 01bb186ac1edba171f8b6bac72910c624b865727 /gcc/cfgloopmanip.c | |
parent | a4744f620f32b6b859a39c6876f5e21b52b1af4b (diff) | |
download | gcc-d4919e65cae926b962425ff3d8c71a668f63c209.tar.gz |
re PR rtl-optimization/68212 (Loop unroller breaks basic block frequencies)
PR rtl-optimization/68212
* cfgloopmanip.c (duplicate_loop_to_header_edge): Use preheader edge
frequency when computing scale factor for peeled copies.
* loop-unroll.c (unroll_loop_runtime_iterations): Fix freq/count
values for switch/peel blocks/edges.
From-SVN: r241170
Diffstat (limited to 'gcc/cfgloopmanip.c')
-rw-r--r-- | gcc/cfgloopmanip.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 487b91df0e5..eb868393fac 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -1276,10 +1276,13 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, } else { + int preheader_freq = EDGE_FREQUENCY (e); scale_main = REG_BR_PROB_BASE; for (i = 0; i < ndupl; i++) scale_main = combine_probabilities (scale_main, scale_step[i]); - scale_act = REG_BR_PROB_BASE - prob_pass_thru; + if (preheader_freq > freq_in) + preheader_freq = freq_in; + scale_act = GCOV_COMPUTE_SCALE (preheader_freq, freq_in); } for (i = 0; i < ndupl; i++) gcc_assert (scale_step[i] >= 0 && scale_step[i] <= REG_BR_PROB_BASE); |