Hi, my understanding of the code is that trip_count is trying to estimate number of iterations when counts are available and disable modulo scheduler for loops with too few iterations. We now have get_estimated_loop_iterations_int and get_max_loop_iterations_int which keeps information detected upstream and so we should use i there.
I tested the patch very lightly only on the testcase in question as I am not sure when and how modulo sched is used. Seems sane? What are the code size impacts of modulo scheduling? Honza PR 82849 * modulo-sched.c (sms_schedule): Use get_estimated_loop_iterations_int and get_max_loop_iterations_int. Index: modulo-sched.c =================================================================== --- modulo-sched.c (revision 254929) +++ modulo-sched.c (working copy) @@ -1346,7 +1346,7 @@ sms_schedule (void) struct loop *loop; basic_block condition_bb = NULL; edge latch_edge; - gcov_type trip_count = 0; + HOST_WIDE_INT trip_count, max_trip_count; loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_RECORDED_EXITS); @@ -1422,9 +1422,8 @@ sms_schedule (void) get_ebb_head_tail (bb, bb, &head, &tail); latch_edge = loop_latch_edge (loop); gcc_assert (single_exit (loop)); - if (single_exit (loop)->count () > profile_count::zero ()) - trip_count = latch_edge->count ().to_gcov_type () - / single_exit (loop)->count ().to_gcov_type (); + trip_count = get_estimated_loop_iterations_int (loop); + max_trip_count = get_max_loop_iterations_int (loop); /* Perform SMS only on loops that their average count is above threshold. */ @@ -1444,8 +1443,8 @@ sms_schedule (void) (int64_t) bb->count.to_gcov_type ()); fprintf (dump_file, "\n"); fprintf (dump_file, "SMS trip-count "); - fprintf (dump_file, "%" PRId64, - (int64_t) trip_count); + fprintf (dump_file, "%" PRId64 "max %" PRId64, + (int64_t) trip_count, (int64_t) max_trip_count); fprintf (dump_file, "\n"); fprintf (dump_file, "SMS profile-sum-max "); fprintf (dump_file, "%" PRId64, @@ -1552,9 +1551,8 @@ sms_schedule (void) latch_edge = loop_latch_edge (loop); gcc_assert (single_exit (loop)); - if (single_exit (loop)->count ()> profile_count::zero ()) - trip_count = latch_edge->count ().to_gcov_type () - / single_exit (loop)->count ().to_gcov_type (); + trip_count = get_estimated_loop_iterations_int (loop); + max_trip_count = get_max_loop_iterations_int (loop); if (dump_file) { @@ -1648,7 +1646,8 @@ sms_schedule (void) we let the scheduling passes do the job in this case. */ if (stage_count < PARAM_VALUE (PARAM_SMS_MIN_SC) || (count_init && (loop_count <= stage_count)) - || (flag_branch_probabilities && (trip_count <= stage_count))) + || (max_trip_count >= 0 && max_trip_count <= stage_count) + || (trip_count >= 0 && trip_count <= stage_count)) { if (dump_file) { @@ -1657,7 +1656,8 @@ sms_schedule (void) " loop-count=", stage_count); fprintf (dump_file, "%" PRId64, loop_count); fprintf (dump_file, ", trip-count="); - fprintf (dump_file, "%" PRId64, trip_count); + fprintf (dump_file, "%" PRId64 "max %" PRId64, + (int64_t) trip_count, (int64_t) max_trip_count); fprintf (dump_file, ")\n"); } break;