On 9/5/26 2:56 AM, Zhongyao Chen wrote:
The vector FMA patterns currently match multiply/add trees, which lets
combine fuse operations into FMA instructions even with -ffp-contract=off.
Rewrite these patterns using fma rtxes:
- fma/fnma/fms/fnms in autovec.md.
- *dual_widen_*, *single_widen_* in autovec-opt.md.
- .vf patterns in autovec-opt.md:
*vfmacc_vf, *vfmsac_vf,
*vfwmacc_vf_v_f, *vfwmsac_vf_v_f,
*vfwnmacc_vf_neg_v_f, *vfwnmsac_vf_neg_v_f.
Unlike the old (plus (mult ...)) form, fma folds neg and sub into its operands.
Operands with or without neg create different RTL shapes for vector-scalar
pairs. Cover these by adding:
- *vfnmsac_vf_neg_f_v, *vfnmsac_vf_neg_v_f.
- *vfnmacc_vf_neg_f_v, *vfnmacc_vf_neg_v_f.
- *vfwmacc_vf_f_v, *vfwmsac_vf_f_v.
- *vfwnmacc_vf_neg_f_v, *vfwnmsac_vf_neg_f_v.
Also, testing showed vf-3-f32.c regressed. That's because a scalar is
reused across multiple loop statements and shares a single widening broadcast.
Combine failed to match the inlined broadcast and fell back to vfnmsac.vv.
Add to fix it:
- *vfnmsac_vf_extend_f.
And add the remaining three extend_f variants as well:
- *vfnmacc_vf_extend_f, *vfmacc_vf_extend_f, *vfmsac_vf_extend_f.
PR target/126932
gcc/ChangeLog:
* config/riscv/autovec.md: Rewrite vector FMA patterns.
* config/riscv/autovec-opt.md: Likewise and add new patterns.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/ternop/pr126932.c: New test.
Signed-off-by: Zhongyao Chen<[email protected]>
Thanks for digging into this. Per a discussion with Robin last week,
using the FMA opcode seems like the right thing to do. My question is
do we need a similar change in vector.md?
;;
-------------------------------------------------------------------------------
;; ---- Predicated floating-point ternary operations
;;
-------------------------------------------------------------------------------
;; Includes:
;; - 13.6 Vector Single-Width Floating-Point Fused Multiply-Add Instructions
;;
-------------------------------------------------------------------------------
After which we have the same kind of RTL structure you're fixing in
autovec.md and autovec-opt.md.
Jeff