On 11/22/24 10:48 AM, Robin Dapp wrote:
Hi,

as discussed in PR117544 the VTYPE register is not preserved across
function calls.  Even though vmv1r-like instructions operate
independently of the actual vtype they still require a valid vtype.  As
we cannot guarantee that the vtype is valid we must make sure to emit a
vsetvl between a function call and vmv1r.v.

This patch makes the necessary changes by splitting the full-reg-move
insns into patterns that use the vtype register and adding vmov to the
types of instructions requiring a vset.

Regtested on rv64gcv but the CI knows best :)

Regards
  Robin

        PR target/117544

gcc/ChangeLog:

        * config/riscv/vector.md (*mov<mode>_whole): Split.
        (*mov<mode>_fract): Ditto.
        (*mov<mode>): Ditto.
        (*mov<mode>_vls): Ditto.
        (*mov<mode>_reg_whole_vtype): New pattern with vtype use.
        (*mov<mode>_fract_vtype): Ditto.
        (*mov<mode>_vtype): Ditto.
        (*mov<mode>_vls_vtype): Ditto.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/base/abi-call-args-4.c: Expect vsetvl.
        * gcc.target/riscv/rvv/base/pr117544.c: New test.
OK.

Jeff

Reply via email to