diff options
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 107f082..28f4349 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6666,23 +6666,24 @@ scale_profile_for_vect_loop (struct loop *loop, unsigned vf) edge preheader = loop_preheader_edge (loop); /* Reduce loop iterations by the vectorization factor. */ gcov_type new_est_niter = niter_for_unrolled_loop (loop, vf); - gcov_type freq_h = loop->header->count, freq_e = preheader->count; + profile_count freq_h = loop->header->count, freq_e = preheader->count; /* Use frequency only if counts are zero. */ - if (freq_h == 0 && freq_e == 0) + if (!(freq_h > 0) && !(freq_e > 0)) { - freq_h = loop->header->frequency; - freq_e = EDGE_FREQUENCY (preheader); + freq_h = profile_count::from_gcov_type (loop->header->frequency); + freq_e = profile_count::from_gcov_type (EDGE_FREQUENCY (preheader)); } - if (freq_h != 0) + if (freq_h > 0) { gcov_type scale; /* Avoid dropping loop body profile counter to 0 because of zero count in loop's preheader. */ - freq_e = MAX (freq_e, 1); + if (!(freq_e > profile_count::from_gcov_type (1))) + freq_e = profile_count::from_gcov_type (1); /* This should not overflow. */ - scale = GCOV_COMPUTE_SCALE (freq_e * (new_est_niter + 1), freq_h); + scale = freq_e.apply_scale (new_est_niter + 1, 1).probability_in (freq_h); scale_loop_frequencies (loop, scale, REG_BR_PROB_BASE); } @@ -6695,8 +6696,6 @@ scale_profile_for_vect_loop (struct loop *loop, unsigned vf) int prob = exit_l->probability; exit_l->probability = REG_BR_PROB_BASE - exit_e->probability; exit_l->count = exit_bb->count - exit_e->count; - if (exit_l->count < 0) - exit_l->count = 0; if (prob > 0) scale_bbs_frequencies_int (&loop->latch, 1, exit_l->probability, prob); } |