This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR84068: Fix sort order of SCHED_PRESSURE_MODEL
- From: Richard Sandiford <richard dot sandiford at linaro dot org>
- To: Wilco Dijkstra <Wilco dot Dijkstra at arm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, nd <nd at arm dot com>, maxim dot kuvyrkov at linaro dot org
- Date: Wed, 31 Jan 2018 13:04:09 +0000
- Subject: Re: [PATCH] PR84068: Fix sort order of SCHED_PRESSURE_MODEL
- Authentication-results: sourceware.org; auth=none
- References: <DB6PR0801MB2053A5536707256D8EF14AAB83FB0@DB6PR0801MB2053.eurprd08.prod.outlook.com>
Wilco Dijkstra <Wilco.Dijkstra@arm.com> writes:
> The comparison order for SCHED_PRESSURE_MODEL is incorrect. If either
> instruction is not in target_bb, the ordering is not well defined. To fix
> this, give all instructions in target_bb the highest priority and sort all
> other instructions behind it. This way instructions in target_bb will be
> sorted using the pressure model, and instructions outside it will use
> RFS_DEP_COUNT and/or RFS_TIE for their order.
>
> Bootstrap OK on AArch64, OK for commit?
>
> ChangeLog:
> 2018-01-31 Wilco Dijkstra <wdijkstr@arm.com>
>
> PR rlt-optimization/84068
> * haifa-sched.c (rank_for_schedule): Fix SCHED_PRESSURE_MODEL sorting.
>
> PR rlt-optimization/84068
> * gcc.dg/pr84068.c: New test.
> --
>
> diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
> index ebdec46bf04f1ba07e8b70607602a3bc9e7ec7de..2c9dd87426930ee99b2a4c0950cadea96f9553bc 100644
> --- a/gcc/haifa-sched.c
> +++ b/gcc/haifa-sched.c
> @@ -2783,12 +2783,18 @@ rank_for_schedule (const void *x, const void *y)
> }
>
> /* Prefer instructions that occur earlier in the model schedule. */
> - if (sched_pressure == SCHED_PRESSURE_MODEL
> - && INSN_BB (tmp) == target_bb && INSN_BB (tmp2) == target_bb)
> + if (sched_pressure == SCHED_PRESSURE_MODEL)
> {
> - diff = model_index (tmp) - model_index (tmp2);
> - gcc_assert (diff != 0);
> - return rfs_result (RFS_PRESSURE_INDEX, diff, tmp, tmp2);
> + if (INSN_BB (tmp) == target_bb && INSN_BB (tmp2) == target_bb)
> + {
> + diff = model_index (tmp) - model_index (tmp2);
> + gcc_assert (diff != 0);
> + return rfs_result (RFS_PRESSURE_INDEX, diff, tmp, tmp2);
> + }
> + else if (INSN_BB (tmp) == target_bb)
> + return rfs_result (RFS_PRESSURE_INDEX, -1, tmp, tmp2);
> + else if (INSN_BB (tmp2) == target_bb)
> + return rfs_result (RFS_PRESSURE_INDEX, 1, tmp, tmp2);
> }
This was the original intent, but was changed in r213708. TBH I'm not
sure what the second hunk in that revision fixed, since model_index is
supposed to return an index greater than all valid indices when passed
an instruction outside the current block. Maxim, do you remember?
Thanks,
Richard