On 3/27/25 1:39 PM, Robin Dapp wrote:
Hi Paul-Antoine,
This pattern enables the combine pass to merge a vec_duplicate into a
plus-mult
or minus-mult RTL instruction.
Before this patch, we have two instructions, e.g.:
vfmv.v.f v6,fa0
vfmadd.vv v9,v6,v7
After, we get only one:
vfmadd.vf v9,fa0,v7
On SPEC2017's 503.bwaves_r, depending on the workload, the reduction
in dynamic
instruction count varies from -4.66% to -4.75%.
The general issue with this kind of optimization (we have discussed it a
few times already) is that, depending on the uarch, we want the local
combine optimization that you show but not the fwprop/late-combine one
where we propagate a vector broadcast into a loop.
So IMHO in order to continue with this and similar patterns we need at
least accompanying rtx_cost handling that would allow us to tune per uarch.
Pan Li sent a similar patch for vadd.vv/vadd.vx I think in November and
I believe he intended to continue when stage 1 opens.
An outstanding question is how to distinguish the combine case from the
late-combine case. I haven't yet thought about that in detail.
The other thing we should consider is that we can certainly theorize
that this kind of register file crossing case can have an extra penalty
(it traditionally does), we don't have actual evidence that it's causing
a problem on any RISC-V designs.
So may be the way to go is add a field to the uarch tuning structure
indicating the additional cost (if any) of a register file crossing
vector op of this nature. Then query that in riscv_rtx_costs or
whatever our rtx_cost function is named.
Default that additional cost to zero initially. Then uarch experts can
fill in the appropriate value. Yea, such a simplistic approach wouldn't
handle cases like ours where you really need nearby context to be sure,
but I don't think we want to over-engineer this solution too badly right
now.
Note that since this isn't a regression it'll need to wait for gcc-16
development to open before the patch can go forward.
Thanks!
JEff
ps. I know Baylibre's remit was to test dynamic icounts and there were
good reasons for that. So don't worry about not having run it on
design. If you happen to still have executables, pass them along
privately, I can run them on a BPI. ROMS is a few hours of runtime, but
that's not a big deal.