This patch makes the scheduling score execution-side aware. --- gcc/config/s390/s390.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 249df00268a..4dcf1be4445 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -344,11 +344,11 @@ extern int reload_completed; /* Kept up to date using the SCHED_VARIABLE_ISSUE hook. */ static rtx_insn *last_scheduled_insn; -#define MAX_SCHED_UNITS 4 -static int last_scheduled_unit_distance[MAX_SCHED_UNITS]; - #define NUM_SIDES 2 +#define MAX_SCHED_UNITS 4 +static int last_scheduled_unit_distance[MAX_SCHED_UNITS][NUM_SIDES]; + /* Estimate of number of cycles a long-running insn occupies an execution unit. */ static int fxd_longrunning[NUM_SIDES]; @@ -14421,8 +14421,8 @@ s390_sched_score (rtx_insn *insn) CPU. */ for (i = 0; i < units; i++, m <<= 1) if (m & unit_mask) - score += (last_scheduled_unit_distance[i] * MAX_SCHED_MIX_SCORE / - MAX_SCHED_MIX_DISTANCE); + score += (last_scheduled_unit_distance[i][sched_state.side] + * MAX_SCHED_MIX_SCORE / MAX_SCHED_MIX_DISTANCE); int other_side = 1 - sched_state.side; @@ -14622,9 +14622,10 @@ s390_sched_variable_issue (FILE *file, int verbose, rtx_insn *insn, int more) for (i = 0; i < units; i++, m <<= 1) if (m & unit_mask) - last_scheduled_unit_distance[i] = 0; - else if (last_scheduled_unit_distance[i] < MAX_SCHED_MIX_DISTANCE) - last_scheduled_unit_distance[i]++; + last_scheduled_unit_distance[i][sched_state.side] = 0; + else if (last_scheduled_unit_distance[i][sched_state.side] + < MAX_SCHED_MIX_DISTANCE) + last_scheduled_unit_distance[i][sched_state.side]++; } if ((mask & S390_SCHED_ATTR_MASK_CRACKED) != 0 @@ -14686,9 +14687,10 @@ s390_sched_variable_issue (FILE *file, int verbose, rtx_insn *insn, int more) s390_get_unit_mask (insn, &units); - fprintf (file, ";;\t\tBACKEND: units unused for: "); + fprintf (file, ";;\t\tBACKEND: units on this side unused for: "); for (j = 0; j < units; j++) - fprintf (file, "%d:%d ", j, last_scheduled_unit_distance[j]); + fprintf (file, "%d:%d ", j, + last_scheduled_unit_distance[j][sched_state.side]); fprintf (file, "\n"); } } @@ -14713,9 +14715,6 @@ s390_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED, int max_ready ATTRIBUTE_UNUSED) { - last_scheduled_insn = NULL; - memset (last_scheduled_unit_distance, 0, MAX_SCHED_UNITS * sizeof (int)); - /* If the next basic block is most likely entered via a fallthru edge we keep the last sched state. Otherwise we start a new group. The scheduler traverses basic blocks in "instruction stream" ordering @@ -14729,7 +14728,12 @@ s390_sched_init (FILE *file ATTRIBUTE_UNUSED, ? NEXT_INSN (current_sched_info->prev_head) : NULL; basic_block bb = insn ? BLOCK_FOR_INSN (insn) : NULL; if (s390_tune < PROCESSOR_2964_Z13 || !s390_bb_fallthru_entry_likely (bb)) - sched_state.group_state = 0; + { + last_scheduled_insn = NULL; + memset (last_scheduled_unit_distance, 0, + MAX_SCHED_UNITS * NUM_SIDES * sizeof (int)); + sched_state.group_state = 0; + } } /* This target hook implementation for TARGET_LOOP_UNROLL_ADJUST calculates -- 2.17.0