On Wed, Feb 5, 2025 at 12:58 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > gcc.target/aarch64/sve/acle/general/ldff1_8.c and > gcc.target/aarch64/sve/ptest_1.c were failing because the > aarch64 port was giving a zero (unknown) cost to instructions > that compute two results in parallel. This was latent until > r15-1575-gea8061f46a30, which fixed rtl-ssa to treat zero costs > as unknown.
These 2 failures are recorded as part of PR 116589. So it might be useful to put the PR # in the commit too. Thanks, Andrew > > A long-standing todo here is to make insn_cost derive costs from md > information, rather than having to write a lot of matching code in > aarch64_rtx_costs. But that's not something we can do for GCC 15. > > This patch instead treats the cost of a PARALLEL as being the maximum > cost of its constituent sets. I don't like this very much, since it > isn't really target-specific behaviour. If it were stage 1, I'd be > trying to change pattern_cost instead. > > Tested on aarch64-linux-gnu. I'll push this tomorrow if there are no > comments before then. In particular, please let me know if you'd be > happy with experimenting with a pattern_cost change even at this stage. > (The current behaviour is to bail out if more than one set in a parallel > is live and neither of them is a comparison.) > > Richard > > > gcc/ > * config/aarch64/aarch64.cc (aarch64_insn_cost): Give PARALLELs > the same cost as the costliest SET. > --- > gcc/config/aarch64/aarch64.cc | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > > diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc > index 16754fa9e7b..c1e40200806 100644 > --- a/gcc/config/aarch64/aarch64.cc > +++ b/gcc/config/aarch64/aarch64.cc > @@ -15889,7 +15889,24 @@ aarch64_insn_cost (rtx_insn *insn, bool speed) > { > if (rtx set = single_set (insn)) > return set_rtx_cost (set, speed); > - return pattern_cost (PATTERN (insn), speed); > + > + /* If the instruction does multiple sets in parallel, use the cost > + of the most expensive set. This copes with instructions that set > + the flags to a useful value as a side effect. */ > + rtx pat = PATTERN (insn); > + if (GET_CODE (pat) == PARALLEL) > + { > + int max_cost = 0; > + for (int i = 0; i < XVECLEN (pat, 0); ++i) > + { > + rtx x = XVECEXP (pat, 0, i); > + if (GET_CODE (x) == SET) > + max_cost = std::max (max_cost, set_rtx_cost (x, speed)); > + } > + return max_cost; > + } > + > + return pattern_cost (pat, speed); > } > > /* Implement TARGET_INIT_BUILTINS. */ > -- > 2.25.1 >