In expand_vec_perm, the branch handling a selector that is a constant
duplicate (all indices identical) emits a VLMAX vrgather and is then
meant to be done. The missing return let control fall through into the
generic modulo-index handling below, which recomputes and overwrites
the target with another gather sequence.
Add the return so the duplicate path stops after the gather.
No test case is added: without the return the first gather is a dead
store to the target that the generic path immediately overwrites, so it
is removed by later RTL dead-store elimination and the final assembly is
identical with and without the fix. No test can therefore observe the
change.
gcc/ChangeLog:
* config/riscv/riscv-v.cc (expand_vec_perm): Add missing return
after emit_vlmax_gather_insn.
---
gcc/config/riscv/riscv-v.cc | 1 +
1 file changed, 1 insertion(+)
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index c2b2e346d0a..9a0c747f8a0 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -3321,6 +3321,7 @@ expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel)
op = op1;
}
emit_vlmax_gather_insn (target, op, sel);
+ return;
}
/* Note: vec_perm indices are supposed to wrap when they go beyond the
--
2.52.0