]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Fix ABI vector passing on stack and GPR [PR123824].
authorRobin Dapp <rdapp@oss.qualcomm.com>
Mon, 26 Jan 2026 16:59:58 +0000 (17:59 +0100)
committerRobin Dapp <rdapp@oss.qualcomm.com>
Wed, 28 Jan 2026 19:04:50 +0000 (20:04 +0100)
commitcb0d29db88e367a709f32e49bfa540e54db02f82
treeca9347155408a63969a9d1c659e1aa26335e6837
parent00956e55dd2fbbee751e953ca2f6b8a87151f85b
RISC-V: Fix ABI vector passing on stack and GPR [PR123824].

Krister reported that we violate the psABI when one vector argument
halfway fits into a register:

"Aggregates whose total size is no more than 2×XLEN bits are passed in a
pair of registers; if only one register is available, the first XLEN
bits are passed in a register and the remaining bits are passed on the
stack. If no registers are available, the aggregate is passed on the
stack."

This patch fixes this oversight and adds a few tests.

Regtested on rv64gcv_zvl512b.

PR target/123824

gcc/ChangeLog:

* config/riscv/riscv.cc (riscv_vls_mode_fits_in_gprs_p): New
helper.
(riscv_pass_vls_aggregate_in_gpr): Use helper and distribute
half-fitting vector to GPR and stack.
(riscv_pass_aggregate_in_vr): Reformat comment.
(riscv_get_arg_info): Use helper.
(riscv_pass_by_reference): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/abi/vls-gpr-1.c: New test.
* gcc.target/riscv/abi/vls-gpr-10.c: New test.
* gcc.target/riscv/abi/vls-gpr-11.c: New test.
* gcc.target/riscv/abi/vls-gpr-12.c: New test.
* gcc.target/riscv/abi/vls-gpr-13.c: New test.
* gcc.target/riscv/abi/vls-gpr-14.c: New test.
* gcc.target/riscv/abi/vls-gpr-2.c: New test.
* gcc.target/riscv/abi/vls-gpr-3.c: New test.
* gcc.target/riscv/abi/vls-gpr-4.c: New test.
* gcc.target/riscv/abi/vls-gpr-5.c: New test.
* gcc.target/riscv/abi/vls-gpr-6.c: New test.
* gcc.target/riscv/abi/vls-gpr-7.c: New test.
* gcc.target/riscv/abi/vls-gpr-8.c: New test.
* gcc.target/riscv/abi/vls-gpr-9.c: New test.
15 files changed:
gcc/config/riscv/riscv.cc
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/abi/vls-gpr-9.c [new file with mode: 0644]