Committed, thanks!
On Thu, Jan 19, 2023 at 3:03 PM wrote:
> From: Ju-Zhe Zhong
>
> The original constraint is incorrect in pred_mov pattern.
> Take a look at Alternative 2, the operands[0] is "vr",
> operands[1] which is mask operand can be "vm".
> Such alternative matching will give the wrong codegen (vle.v v0,0(a5),v0.t)
> This is illegal according to RVV ISA.
>
> To fix this issue and not destroy the RA performance, fix this pattern in
> this patch.
>
> gcc/ChangeLog:
>
> * config/riscv/vector.md: Fix constraints.
>
> ---
> gcc/config/riscv/vector.md | 29 +++--
> 1 file changed, 15 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
> index 48414e200cf..e1173f2d5a6 100644
> --- a/gcc/config/riscv/vector.md
> +++ b/gcc/config/riscv/vector.md
> @@ -633,22 +633,23 @@
> ;;2. (const_vector:VNx1SF repeat [
> ;;(const_double:SF 0.0 [0x0.0p+0])]).
> (define_insn_and_split "@pred_mov"
> - [(set (match_operand:V 0 "nonimmediate_operand" "=vd,vr,
>m,vr,vr")
> - (if_then_else:V
> - (unspec:
> - [(match_operand: 1 "vector_mask_operand" "vmWc1, vmWc1,
> vmWc1, Wc1, Wc1")
> -(match_operand 4 "vector_length_operand"" rK,rK,
> rK,rK,rK")
> -(match_operand 5 "const_int_operand""i, i,
> i, i, i")
> -(match_operand 6 "const_int_operand""i, i,
> i, i, i")
> -(match_operand 7 "const_int_operand""i, i,
> i, i, i")
> -(reg:SI VL_REGNUM)
> -(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (match_operand:V 3 "vector_move_operand" "m, m,
> vr,vr, viWc0")
> - (match_operand:V 2 "vector_merge_operand" "0,vu,
> vu, vu0, vu0")))]
> + [(set (match_operand:V 0 "nonimmediate_operand" "=vr,vr,
> vd, m,vr,vr")
> +(if_then_else:V
> + (unspec:
> +[(match_operand: 1 "vector_mask_operand" "vmWc1, Wc1,
> vm, vmWc1, Wc1, Wc1")
> + (match_operand 4 "vector_length_operand"" rK,rK,
> rK,rK,rK,rK")
> + (match_operand 5 "const_int_operand""i, i,
> i, i, i, i")
> + (match_operand 6 "const_int_operand""i, i,
> i, i, i, i")
> + (match_operand 7 "const_int_operand""i, i,
> i, i, i, i")
> + (reg:SI VL_REGNUM)
> + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> + (match_operand:V 3 "vector_move_operand" "m, m,
> m,vr,vr, viWc0")
> + (match_operand:V 2 "vector_merge_operand" "0,vu,
> vu,vu, vu0, vu0")))]
>"TARGET_VECTOR"
>"@
> vle.v\t%0,%3%p1
> - vle.v\t%0,%3%p1
> + vle.v\t%0,%3
> + vle.v\t%0,%3,%1.t
> vse.v\t%3,%0%p1
> vmv.v.v\t%0,%3
> vmv.v.i\t%0,%v3"
> @@ -657,7 +658,7 @@
> && satisfies_constraint_vu (operands[2])"
>[(set (match_dup 0) (match_dup 3))]
>""
> - [(set_attr "type" "vlde,vlde,vste,vimov,vimov")
> + [(set_attr "type" "vlde,vlde,vlde,vste,vimov,vimov")
> (set_attr "mode" "")])
>
> ;; Dedicated pattern for vse.v instruction since we can't reuse pred_mov
> pattern to include
> --
> 2.36.3
>
>