<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55615>55615</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISCV] Selection of VL for splat constants causing vsetvli toggles
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:RISC-V,
llvm:codegen,
performance
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
preames
</td>
</tr>
</table>
<pre>
I noticed that we unconditionally treating splat constants as effecting all lanes in a vector register.
Example:
```
define void @vector_splat_toggle(double* %a, double* %b) {
entry:
%addr = bitcast double* %a to <vscale x 1 x double>*
tail call void @llvm.riscv.vse.nxv1f64.i64(<vscale x 1 x double> zeroinitializer, <vscale x 1 x double>* %addr, i64 4)
%addr2 = bitcast double* %b to <vscale x 1 x double>*
tail call void @llvm.riscv.vse.nxv1f64.i64(<vscale x 1 x double> zeroinitializer, <vscale x 1 x double>* %addr2, i64 4)
ret void
}
; Function Attrs: nounwind writeonly
declare void @llvm.riscv.vse.nxv1f64.i64(<vscale x 1 x double>, <vscale x 1 x double>* nocapture, i64)
```
Repro command:
`$ ./llc -march=riscv64 -mattr=+v < debug-splat.ll `
Key output:
```
vsetvli a2, zero, e64, m1, ta, mu
vmv.v.i v8, 0
vsetivli zero, 4, e64, m1, ta, mu
vse64.v v8, (a0)
vse64.v v8, (a1)
```
As you can see here, we setup VL to be VLMAX for the splat, despite the fact we only use four lanes of the resulting value. We could have used AVL=4 the whole way through on this example.
This example is written with scalable vectors, but this also shows up in idiomatic fixed length vector loops. As an example, see `@vector_init_vsetvli_fv` from `test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVVsmO4zYQ_Rr5UrCgxfJy8MFtTweDTC4zQU9uDUoqSUwoUuAit_P1KVKye0F3ZoCcAsgSRbKK9apePblU9WX_GaSyvMIabMcsnBGcrJSsueVKMiEuYDUyy2ULZhC0gxaNZdIaYAawabAKi7QVBJNogEtgMNK00qCx5caijgGi5BQlh-n-6Yn1g8Aon9-jdTJf4bXGhkuEUfEaolUy-XoMxz9a1bZkmW1r5Uo_OECUFSzKjvBqpoyyHUSbu8kjSqsvt-MgmNS1hig_QcltxYx9bc7AKlo9jqZiAuEJUvrNO_JPtOnqyTIuoPLor-EKMfax5qYa49FgLJ_GtFmvYr5eUdQfuoS_USsuKe1McBp7QP92_hWC30eugZzv3qDLPoZX_l_gZe_h02hDODN5NqeX3IryO7gnDnv-wsFabajuRHInz1zWcNbcopLicqVaJZjG_4juh2ikqthgncYZzg3MG-Z_xUErarG-Z7J-1R7ZCuIouxeigmXPdNVRbUOclBuaIJw0EWV3ow8EaixduwwdE1Ptbv6n-694AeXs4OxHHRglO4JvR8FpxEIRfAH9E330R-hTf7eh8Xr3bNVT4mJvNW790mt_fHJ4dbX6CX-G1uPx5o-qwJLn7L2_IX2x4R1wBwMX5YjVEgwidDiVhaSPQnQDPHzx3VEiDX47_AEN6ZjtcJK_oDNoBiJRmGxYFUTTMwqcoQnl9CyEqglbNBongkaOTDgkKfyOVGInaujYiN6qhsPDF6rfKhicO0UsOjOS3k4r13bknYac5HbSzfgluN9fLAANPcEtSjhz24EnJCMaznpsfPils5M3JowC06mzAUJNss1rrohKvIKGP1FQAmVLTmYtF0oNhqKn9FHm5hO9Q5_EQLGbVPtGf5wJ9NiMtAaNVr3fZNFQEu-PqsZfUNLo6-dvxwd66nGk-2y05NKgtstKK2PKkjhMpnT2ot7n9S7fsYXlVuA-Ku4m--IE31Dg1PWUeKqhr9vbT1bFnAmVmI6B6WtiFk6LfWft4LWCoqCrpfS5MqZWDF03Xh9LatA_6Rx65cY4pJTeF8U6LRbdfsNyLIt1scmLOtnlmzplm2y32xRb3GKVpwuqBQrjo46yrGTVXxi63ENYUg6yicBZOC4_VJSj1ufoOj-gJlAkDRX6yeK04PssybKkyJJ0s0pX23jH1kla1Hm6WdN7s6WaYE8aHgdhU7pd6H2AQfpgvN7R59k8LzJjeCsxJNb7Z852Su8H-gvQU5oC4n2A-w9Yvo0q">