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.
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.
gcc/
* config/aarch64/aarch64.cc (aarch64_insn_cost): Give PARALLELs
the same cost as the costliest SET.
{
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. */