From 2ad072527291c3fcf3a8e9d4dda4cb548f4f75df Mon Sep 17 00:00:00 2001 From: Honza Date: Sun, 7 May 2023 21:47:26 +0200 Subject: Minor heuristics improvements --- gcc/tree-ssa-loop-ivcanon.cc | 46 ++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/gcc/tree-ssa-loop-ivcanon.cc b/gcc/tree-ssa-loop-ivcanon.cc index 38ddfdb301e..f0066d00ee8 100644 --- a/gcc/tree-ssa-loop-ivcanon.cc +++ b/gcc/tree-ssa-loop-ivcanon.cc @@ -1106,13 +1106,6 @@ try_peel_loop (class loop *loop, npeel = estimated_loop_iterations_int (loop); if (npeel < 0) npeel = likely_max_loop_iterations_int (loop); - if (npeel >= 0 && maxiter >= 0 && maxiter <= npeel) - { - if (dump_file) - fprintf (dump_file, "Not peeling: upper bound is known so can " - "unroll completely\n"); - return false; - } auto_vec good_peels; auto_vec prcnt; prcnt.safe_push (0); @@ -1130,28 +1123,24 @@ try_peel_loop (class loop *loop, gcov_type rest = sum; gcov_type psum = 0; int good_percentage = param_profile_histogram_peel_prcnt; - for (int i = 0; i < loop->counters->lin->length (); i++) + for (int i = 0; i < (int)loop->counters->lin->length (); i++) { psum += (*(loop->counters->lin))[i]; + if ((maxiter >= 0 && maxiter <= i) + || (i >= param_max_peel_times - 1) + || rest == 0) + break; // iteration has enough cumulated in partial sum and itself has at // least 1 percent or we have complete peeling if ((100 * psum) / sum >= good_percentage || psum == rest) { prcnt.safe_push (prcnt.last () + (100 * psum) / sum); good_peels.safe_push (i); - if ((maxiter >= 0 && maxiter <= good_peels.last ()) - || (good_peels.last () > param_max_peel_times - 1) - || rest == 0) - { - good_peels.pop (); - prcnt.pop (); - break; - } good_percentage = 0; rest -= psum; psum = 0; } - good_percentage = MIN (100, good_percentage + param_profile_histogram_peel_prcnt); + good_percentage = MIN (100, good_percentage + param_profile_histogram_peel_prcnt); } if (!good_peels.is_empty ()) { @@ -1159,6 +1148,29 @@ try_peel_loop (class loop *loop, // we do not pop() prcnt because we want it to be last for current // iteration } + else + { + if (dump_file) + fprintf (dump_file, + "Not peeling: found no good candidates in th ehistogram\n"); + return false; + } + } + else + { + if (!flag_peel_loops_without_histogram) + { + if (dump_file) + fprintf (dump_file, "Not peeling: histogram is not available\n"); + return false; + } + if (npeel >= 0 && maxiter >= 0 && maxiter <= npeel) + { + if (dump_file) + fprintf (dump_file, "Not peeling: upper bound is known so can " + "unroll completely\n"); + return false; + } } if (npeel < 0) -- cgit v1.2.3