re PR rtl-optimization/82849 (ICE on valid code since r254379)
authorJan Hubicka <hubicka@ucw.cz>
Sat, 16 Dec 2017 16:01:26 +0000 (17:01 +0100)
committerJeff Law <law@gcc.gnu.org>
Sat, 16 Dec 2017 16:01:26 +0000 (09:01 -0700)
2017-12-16  Jan Hubicka  <hubicka@ucw.cz>

PR rtl-optimization/82849
* modulo-sched.c (sms_schedule): Use get_estimated_loop_iterations_int
and get_max_loop_iterations_int.

From-SVN: r255748

gcc/ChangeLog
gcc/modulo-sched.c

index 8124e61..b15d84d 100644 (file)
@@ -1,3 +1,9 @@
+2017-12-16  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR rtl-optimization/82849
+       * modulo-sched.c (sms_schedule): Use get_estimated_loop_iterations_int
+       and get_max_loop_iterations_int.
+
 2017-12-16  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 71b2a61..d02f23f 100644 (file)
@@ -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;