Hello, The issue rate is currently been set in SMS by calling targetm.sched.issue_rate function if it is defined. For rs6000 the issue_rate is 1 if !reload_completed && !flag_sched_pressure. To bypass that, SMS sets reload_completed to 1 before calling targetm.sched.issue_rate and restores it's original value after the call. The problem is that the issue rate is changed again to 1 because of the following chain of calls which occurs right after setting issue_rate in targetm.sched.issue_rate ():
sms_schedule -> haifa_sched_init -> sched_init () -> targetm.sched.issue_rate () (in haifa-sched.c:3474) This time, when calling targetm.sched.issue_rate the issue_rate is set to 1 as reload_completed contains it's original value (zero). The attached patch tries to fix that. Tested (bootstrap and regtest) on ppc64-redhat-linux. OK for mainline? Thanks, Revital Changelog: * modulo-sched.c (sms_schedule): Fix stage_count calculation. Index: modulo-sched.c =================================================================== --- modulo-sched.c (revision 173786) +++ modulo-sched.c (working copy) @@ -924,6 +924,7 @@ sms_schedule (void) basic_block condition_bb = NULL; edge latch_edge; gcov_type trip_count = 0; + int temp; loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_RECORDED_EXITS); @@ -933,22 +934,19 @@ sms_schedule (void) return; /* There are no loops to schedule. */ } + temp = reload_completed; + reload_completed = 1; /* Initialize issue_rate. */ if (targetm.sched.issue_rate) - { - int temp = reload_completed; - - reload_completed = 1; - issue_rate = targetm.sched.issue_rate (); - reload_completed = temp; - } + issue_rate = targetm.sched.issue_rate (); else issue_rate = 1; - + /* Initialize the scheduler. */ setup_sched_infos (); haifa_sched_init (); - + reload_completed = temp; + /* Allocate memory to hold the DDG array one entry for each loop. We use loop->num as index into this array. */ g_arr = XCNEWVEC (ddg_ptr, number_of_loops ());