summaryrefslogtreecommitdiff
path: root/gcc/cfgloopmanip.c
diff options
context:
space:
mode:
authorPat Haugen <pthaugen@us.ibm.com>2016-10-14 17:10:18 +0000
committerPat Haugen <pthaugen@gcc.gnu.org>2016-10-14 17:10:18 +0000
commitd4919e65cae926b962425ff3d8c71a668f63c209 (patch)
tree01bb186ac1edba171f8b6bac72910c624b865727 /gcc/cfgloopmanip.c
parenta4744f620f32b6b859a39c6876f5e21b52b1af4b (diff)
downloadgcc-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.c5
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);