From ca627219761c5811677e552b40df991e51299408 Mon Sep 17 00:00:00 2001 From: shivac Date: Tue, 3 May 2016 15:39:37 +0800 Subject: [PATCH 2/8] Use get_simple_loop_desc to get loop iteration count --- gcc/modulo-sched.c | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index 36c1b1f..a6a7e16 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -1665,8 +1665,9 @@ sms_schedule (void) rtx_insn *head, *tail; rtx_insn *count_init; int mii, rec_mii, stage_count, min_cycle; - int64_t loop_count = 0; bool opt_sc_p; + struct niter_desc *desc; + bool loop_version_p = true; if (! sms_loop_p [loop->num]) continue; @@ -1717,14 +1718,6 @@ sms_schedule (void) gcc_assert (count_reg); - if (dump_file && count_init) - { - fprintf (dump_file, "SMS const-doloop "); - fprintf (dump_file, "%" PRId64, - loop_count); - fprintf (dump_file, "\n"); - } - node_order = XNEWVEC (int, g->num_nodes); mii = 1; /* Need to pass some estimate of mii. */ @@ -1769,20 +1762,41 @@ sms_schedule (void) gcc_assert (stage_count >= 1); } + /* Get loop iteration information. */ + desc = get_simple_loop_desc (loop); + + if (desc->const_iter && desc->niter != 0) + { + if (dump_file) + { + fprintf (dump_file, "SMS loop iteration count = "); + fprintf (dump_file, HOST_WIDE_INT_PRINT_DEC, desc->niter); + fprintf (dump_file, "\nSMS stage_count = %d\n", stage_count); + } + + if (desc->niter < (uint64_t)stage_count) + { + if (dump_file) + fprintf (dump_file, "SMS failed due to loop count" + "< stage_count.\n"); + break; + } + else + loop_version_p = false; + } + /* The default value of PARAM_SMS_MIN_SC is 2 as stage count of 1 means that there is no interleaving between iterations thus 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))) { if (dump_file) { fprintf (dump_file, "SMS failed... \n"); fprintf (dump_file, "SMS sched-failed (stage-count=%d," - " loop-count=", stage_count); - fprintf (dump_file, "%" PRId64, loop_count); - fprintf (dump_file, ", trip-count="); + , stage_count); + fprintf (dump_file, " trip-count="); fprintf (dump_file, "%" PRId64, trip_count); fprintf (dump_file, ")\n"); } @@ -1834,7 +1848,7 @@ sms_schedule (void) } /* case the BCT count is not known , Do loop-versioning */ - if (count_reg && ! count_init) + if (count_reg && loop_version_p) { rtx comp_rtx = gen_rtx_GT (VOIDmode, count_reg, gen_int_mode (stage_count, -- 2.5.0