[PATCH] RISC-V: Handle overlap in expand_vec_perm PR121724.

Jeff Law jeffreyalaw@gmail.com
Mon Sep 1 17:44:23 GMT 2025



On 9/1/25 4:26 AM, Robin Dapp wrote:
> Hi,
> 
> In a two-source gather we unconditionally overwrite target with the
> first gather already.  If op1 == target this clobbers the source operand
> for the second gather.  This patch uses a temporary in that case.
> 
> Regtested on rv64gcv_zvl512b.
> 
> Regards
> Robin
> 
>      PR target/121724
> 
> gcc/ChangeLog:
> 
>      * config/riscv/riscv-v.cc (expand_vec_perm): Use temporary if
>      op1 and target overlap.
> 
> gcc/testsuite/ChangeLog:
> 
>      * gcc.target/riscv/rvv/autovec/pr121724.c: New test.
OK.  Though I think you've got the wrong PR.  121724 is a C++ 
rejects-valid bug :-)


> ---
> gcc/config/riscv/riscv-v.cc                   | 11 +++++--
> .../gcc.target/riscv/rvv/autovec/pr121724.c   | 30 +++++++++++++++++++
> 2 files changed, 38 insertions(+), 3 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121724.c
> 
> diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
> index daa1b37bfe5..eb9afffe2ac 100644
> --- a/gcc/config/riscv/riscv-v.cc
> +++ b/gcc/config/riscv/riscv-v.cc
> @@ -3323,15 +3323,17 @@ expand_vec_perm (rtx target, rtx op0, rtx op1, 
> rtx sel)
>    mask_mode = get_mask_mode (data_mode);
>    rtx mask = gen_reg_rtx (mask_mode);
>    rtx max_sel = gen_const_vector_dup (sel_mode, nunits);
> +  bool overlap = target == op1;
> +  rtx tmp_target = overlap ? gen_reg_rtx (data_mode) : target;
Consider reg_overlap_mentioned_p.   It may not really matter in practice 
here, hence the "consider" :-)

jeff



More information about the Gcc-patches mailing list