<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/142879>142879</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISC-V] [RVV] The vd isn't marked as input operand for some instructions
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
s-khechnev
</td>
</tr>
</table>
<pre>
In the [sail-riscv](https://github.com/riscv/sail-riscv/) (the official formal specification of the RISC-V architecture), many RVV instructions (e.g., `vadd.vv`, `vadd.vx`, etc.) treat the `vd` operand as an input (so the final value of `vd` depends on the initial value of `vd`). Apparently, this is due to masking.
However, in LLVM TableGen definitions of these instructions, `vd` is not marked as an input operand.
**So, could this lead to incorrect compilation?**
For example, `vadd.vv`.
In [model/riscv_insts_vext_arith.sail:61](https://github.com/riscv/sail-riscv/blob/61b93a3ba5c37999093f50615f21b219a1e8ede2/model/riscv_insts_vext_arith.sail#L61):
```
function clause execute(VVTYPE(funct6, vm, vs2, vs1, vd)) = {
let SEW_pow = get_sew_pow();
let SEW = get_sew();
let LMUL_pow = get_lmul_pow();
let num_elem = get_num_elem(LMUL_pow, SEW);
if illegal_normal(vd, vm) then return Illegal_Instruction();
let 'n = num_elem;
let 'm = SEW;
let vm_val : bits('n) = read_vmask(num_elem, vm, zvreg);
let vs1_val : vector('n, bits('m)) = read_vreg(num_elem, SEW, LMUL_pow, vs1);
let vs2_val : vector('n, bits('m)) = read_vreg(num_elem, SEW, LMUL_pow, vs2);
//// ====== READING `vd` ======
let vd_val : vector('n, bits('m)) = read_vreg(num_elem, SEW, LMUL_pow, vd);
let (initial_result, mask) : (vector('n, bits('m)), bits('n)) = match init_masked_result(num_elem, SEW, LMUL_pow, vd_val, vm_val) {
Ok(v) => v,
Err(()) => return Illegal_Instruction()
};
var result = initial_result;
foreach (i from 0 to (num_elem - 1)) {
if mask[i] == bitone then {
result[i] = match funct6 {
VV_VADD => vs2_val[i] + vs1_val[i],
...
}
}
};
write_vreg(num_elem, SEW, LMUL_pow, vd, result);
set_vstart(zeros());
RETIRE_SUCCESS
}
```
And in [RISCVInstrInfoV.td:1134](https://github.com/llvm/llvm-project/blob/479f9922912e3385655f0ca6e6238aaf09e6320d/llvm/lib/Target/RISCV/RISCVInstrInfoV.td#L1134):
```
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
// op vd, vs2, vs1, vm
class VALUVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
: RVInstVV<funct6, opv, (outs VR:$vd),
(ins VR:$vs2, VR:$vs1, VMaskOp:$vm), // The `vd` is not marked as an input
opcodestr, "$vd, $vs2, $vs1$vm">;
multiclass VALU_IV_V<string opcodestr, bits<6> funct6> {
def V : VALUVV<funct6, OPIVV, opcodestr # ".vv">,
SchedBinaryMC<"WriteVIALUV", "ReadVIALUV", "ReadVIALUV">;
}
multiclass VALU_IV_V_X_I<string opcodestr, bits<6> funct6>
: VALU_IV_V<opcodestr, funct6>,
VALU_IV_X<opcodestr, funct6>,
VALU_IV_I<opcodestr, funct6>;
defm VADD_V : VALU_IV_V_X_I<"vadd", 0b000000>;
```
In fact, I was able to find that for the 430 instructions below, `vd` is not marked as an input operand in tableGen defs.
`vaadd.vv` `vaadd.vx` `vaaddu.vv` `vaaddu.vx` `vadc.vim` `vadc.vvm` `vadc.vxm` `vadd.vi` `vadd.vv` `vadd.vx` `vand.vi` `vand.vv` `vand.vx` `vasub.vv` `vasub.vx` `vasubu.vv` `vasubu.vx` `vcompress.vm` `vdiv.vv` `vdiv.vx` `vdivu.vv` `vdivu.vx` `vfadd.vf` `vfadd.vv` `vfclass.v` `vfcvt.f.x.v` `vfcvt.f.xu.v` `vfcvt.rtz.x.f.v` `vfcvt.rtz.xu.f.v` `vfcvt.x.f.v` `vfcvt.xu.f.v` `vfdiv.vf` `vfdiv.vv` `vfmax.vf` `vfmax.vv` `vfmerge.vfm` `vfmin.vf` `vfmin.vv` `vfmul.vf` `vfmul.vv` `vfmv.v.f` `vfncvt.f.f.w` `vfncvt.f.x.w` `vfncvt.f.xu.w` `vfncvt.rod.f.f.w` `vfncvt.rtz.x.f.w` `vfncvt.rtz.xu.f.w` `vfncvt.x.f.w` `vfncvt.xu.f.w` `vfrdiv.vf` `vfrec7.v` `vfredmax.vs` `vfredmin.vs` `vfredosum.vs` `vfredusum.vs` `vfrsqrt7.v` `vfrsub.vf` `vfsgnj.vf` `vfsgnj.vv` `vfsgnjn.vf` `vfsgnjn.vv` `vfsgnjx.vf` `vfsgnjx.vv` `vfslide1down.vf` `vfslide1up.vf` `vfsqrt.v` `vfsub.vf` `vfsub.vv` `vfwadd.vf` `vfwadd.vv` `vfwadd.wf` `vfwadd.wv` `vfwcvt.f.f.v` `vfwcvt.f.x.v` `vfwcvt.f.xu.v` `vfwcvt.rtz.x.f.v` `vfwcvt.rtz.xu.f.v` `vfwcvt.x.f.v` `vfwcvt.xu.f.v` `vfwmul.vf` `vfwmul.vv` `vfwredosum.vs` `vfwredusum.vs` `vfwsub.vf` `vfwsub.vv` `vfwsub.wf` `vfwsub.wv` `vid.v` `viota.m` `vle16.v` `vle16ff.v` `vle32.v` `vle32ff.v` `vle64.v` `vle64ff.v` `vle8.v` `vle8ff.v` `vlm.v` `vloxei16.v` `vloxei32.v` `vloxei64.v` `vloxei8.v` `vloxseg2ei16.v` `vloxseg2ei32.v` `vloxseg2ei64.v` `vloxseg2ei8.v` `vloxseg3ei16.v` `vloxseg3ei32.v` `vloxseg3ei64.v` `vloxseg3ei8.v` `vloxseg4ei16.v` `vloxseg4ei32.v` `vloxseg4ei64.v` `vloxseg4ei8.v` `vloxseg5ei16.v` `vloxseg5ei32.v` `vloxseg5ei64.v` `vloxseg5ei8.v` `vloxseg6ei16.v` `vloxseg6ei32.v` `vloxseg6ei64.v` `vloxseg6ei8.v` `vloxseg7ei16.v` `vloxseg7ei32.v` `vloxseg7ei64.v` `vloxseg7ei8.v` `vloxseg8ei16.v` `vloxseg8ei32.v` `vloxseg8ei64.v` `vloxseg8ei8.v` `vlse16.v` `vlse32.v` `vlse64.v` `vlse8.v` `vlseg2e16.v` `vlseg2e16ff.v` `vlseg2e32.v` `vlseg2e32ff.v` `vlseg2e64.v` `vlseg2e64ff.v` `vlseg2e8.v` `vlseg2e8ff.v` `vlseg3e16.v` `vlseg3e16ff.v` `vlseg3e32.v` `vlseg3e32ff.v` `vlseg3e64.v` `vlseg3e64ff.v` `vlseg3e8.v` `vlseg3e8ff.v` `vlseg4e16.v` `vlseg4e16ff.v` `vlseg4e32.v` `vlseg4e32ff.v` `vlseg4e64.v` `vlseg4e64ff.v` `vlseg4e8.v` `vlseg4e8ff.v` `vlseg5e16.v` `vlseg5e16ff.v` `vlseg5e32.v` `vlseg5e32ff.v` `vlseg5e64.v` `vlseg5e64ff.v` `vlseg5e8.v` `vlseg5e8ff.v` `vlseg6e16.v` `vlseg6e16ff.v` `vlseg6e32.v` `vlseg6e32ff.v` `vlseg6e64.v` `vlseg6e64ff.v` `vlseg6e8.v` `vlseg6e8ff.v` `vlseg7e16.v` `vlseg7e16ff.v` `vlseg7e32.v` `vlseg7e32ff.v` `vlseg7e64.v` `vlseg7e64ff.v` `vlseg7e8.v` `vlseg7e8ff.v` `vlseg8e16.v` `vlseg8e16ff.v` `vlseg8e32.v` `vlseg8e32ff.v` `vlseg8e64.v` `vlseg8e64ff.v` `vlseg8e8.v` `vlseg8e8ff.v` `vlsseg2e16.v` `vlsseg2e32.v` `vlsseg2e64.v` `vlsseg2e8.v` `vlsseg3e16.v` `vlsseg3e32.v` `vlsseg3e64.v` `vlsseg3e8.v` `vlsseg4e16.v` `vlsseg4e32.v` `vlsseg4e64.v` `vlsseg4e8.v` `vlsseg5e16.v` `vlsseg5e32.v` `vlsseg5e64.v` `vlsseg5e8.v` `vlsseg6e16.v` `vlsseg6e32.v` `vlsseg6e64.v` `vlsseg6e8.v` `vlsseg7e16.v` `vlsseg7e32.v` `vlsseg7e64.v` `vlsseg7e8.v` `vlsseg8e16.v` `vlsseg8e32.v` `vlsseg8e64.v` `vlsseg8e8.v` `vluxei16.v` `vluxei32.v` `vluxei64.v` `vluxei8.v` `vluxseg2ei16.v` `vluxseg2ei32.v` `vluxseg2ei64.v` `vluxseg2ei8.v` `vluxseg3ei16.v` `vluxseg3ei32.v` `vluxseg3ei64.v` `vluxseg3ei8.v` `vluxseg4ei16.v` `vluxseg4ei32.v` `vluxseg4ei64.v` `vluxseg4ei8.v` `vluxseg5ei16.v` `vluxseg5ei32.v` `vluxseg5ei64.v` `vluxseg5ei8.v` `vluxseg6ei16.v` `vluxseg6ei32.v` `vluxseg6ei64.v` `vluxseg6ei8.v` `vluxseg7ei16.v` `vluxseg7ei32.v` `vluxseg7ei64.v` `vluxseg7ei8.v` `vluxseg8ei16.v` `vluxseg8ei32.v` `vluxseg8ei64.v` `vluxseg8ei8.v` `vmadc.vi` `vmadc.vim` `vmadc.vv` `vmadc.vvm` `vmadc.vx` `vmadc.vxm` `vmand.mm` `vmandn.mm` `vmax.vv` `vmax.vx` `vmaxu.vv` `vmaxu.vx` `vmerge.vim` `vmerge.vvm` `vmerge.vxm` `vmfeq.vf` `vmfeq.vv` `vmfge.vf` `vmfgt.vf` `vmfle.vf` `vmfle.vv` `vmflt.vf` `vmflt.vv` `vmfne.vf` `vmfne.vv` `vmin.vv` `vmin.vx` `vminu.vv` `vminu.vx` `vmnand.mm` `vmnor.mm` `vmor.mm` `vmorn.mm` `vmsbc.vv` `vmsbc.vvm` `vmsbc.vx` `vmsbc.vxm` `vmsbf.m` `vmseq.vi` `vmseq.vv` `vmseq.vx` `vmsgt.vi` `vmsgt.vx` `vmsgtu.vi` `vmsgtu.vx` `vmsif.m` `vmsle.vi` `vmsle.vv` `vmsle.vx` `vmsleu.vi` `vmsleu.vv` `vmsleu.vx` `vmslt.vv` `vmslt.vx` `vmsltu.vv` `vmsltu.vx` `vmsne.vi` `vmsne.vv` `vmsne.vx` `vmsof.m` `vmul.vv` `vmul.vx` `vmulh.vv` `vmulh.vx` `vmulhsu.vv` `vmulhsu.vx` `vmulhu.vv` `vmulhu.vx` `vmv.v.i` `vmv.v.v` `vmv.v.x` `vmv1r.v` `vmv2r.v` `vmv4r.v` `vmv8r.v` `vmxnor.mm` `vmxor.mm` `vnclip.wi` `vnclip.wv` `vnclip.wx` `vnclipu.wi` `vnclipu.wv` `vnclipu.wx` `vnsra.wi` `vnsra.wv` `vnsra.wx` `vnsrl.wi` `vnsrl.wv` `vnsrl.wx` `vor.vi` `vor.vv` `vor.vx` `vredand.vs` `vredmax.vs` `vredmaxu.vs` `vredmin.vs` `vredminu.vs` `vredor.vs` `vredsum.vs` `vredxor.vs` `vrem.vv` `vrem.vx` `vremu.vv` `vremu.vx` `vrgather.vi` `vrgather.vv` `vrgather.vx` `vrgatherei16.vv` `vrsub.vi` `vrsub.vx` `vsadd.vi` `vsadd.vv` `vsadd.vx` `vsaddu.vi` `vsaddu.vv` `vsaddu.vx` `vsbc.vvm` `vsbc.vxm` `vsext.vf2` `vsext.vf4` `vsext.vf8` `vslide1down.vx` `vslide1up.vx` `vslidedown.vi` `vslidedown.vx` `vslideup.vi` `vslideup.vx` `vsll.vi` `vsll.vv` `vsll.vx` `vsmul.vv` `vsmul.vx` `vsra.vi` `vsra.vv` `vsra.vx` `vsrl.vi` `vsrl.vv` `vsrl.vx` `vssra.vi` `vssra.vv` `vssra.vx` `vssrl.vi` `vssrl.vv` `vssrl.vx` `vssub.vv` `vssub.vx` `vssubu.vv` `vssubu.vx` `vsub.vv` `vsub.vx` `vwadd.vv` `vwadd.vx` `vwadd.wv` `vwadd.wx` `vwaddu.vv` `vwaddu.vx` `vwaddu.wv` `vwaddu.wx` `vwmul.vv` `vwmul.vx` `vwmulsu.vv` `vwmulsu.vx` `vwmulu.vv` `vwmulu.vx` `vwredsum.vs` `vwredsumu.vs` `vwsub.vv` `vwsub.vx` `vwsub.wv` `vwsub.wx` `vwsubu.vv` `vwsubu.vx` `vwsubu.wv` `vwsubu.wx` `vxor.vi` `vxor.vv` `vxor.vx` `vzext.vf2` `vzext.vf4` `vzext.vf8`
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0Wltv47YS_jXKC7GCTN0f8uDcegxkT4tk6_Y8GbRE2ezq4pKirM2vPyBlWxyKPds9QIMg8TczHH4czlBj2kQIdmgpvffiBy9-uiOyP3b8Xnz6eqTFsaXD3b4rv91vWtQfKfLiB0FY_YkzUQxe_OTh7Nj3J-GFaw-_ePjlwPqj3PtF13j4ZbLCL8YQZZQjD2fKW1dVrGCkRlXHG1IjcaIFq1hBeta1qKv0lG-b98dPW0R4cWQ9LXrJqYdzDz-ihrTf0Nt2i1grei4LNUoo39Q_-MrAS4KBlKU_DF4SAMF4EdC-8BWhnlPSTytMgqH0kgB1J8pJWyIiEGkRa0-yV75Fp80q1pIaDaSWahnzqJKeaFsK1E3xYi3rmcvQw7mP1qcT4bTt62-KS39kAjGBSklR36GGiK-sPfhesP5Xd6YD5cqItej1dfsZfSH7mv5EW1TSSk-ilj5FTFAQkOu6NT0mUNv1qCH8K4VLuyxXTedh9fveqZFFJ-tyolZTUipirC06zmnRo6JrTqzWu-WFL9MwNT5Yv3Qc0ZE0p5ouNkJNsWlVKjVdSetrnuwUabEb6NjvCGf90Vdp44XrZPX_Jdq-7vYefklW-zwk4Z7ERZjmeR7kYRUHySqu8GqPVzlZ0YyWFHv45e_wweFrslIJGOqlJsHlN1hXstURR0VNpKCIjrSQPfVwtt1--c8vzx7OtEmiIjI0-q_A07-V_lfqxM6RFz4hL33wgjVCNe3R-_Nvu1N3RlpxoP1O0LMSeDjTTIAl0j-G5dLq9fOvr9rh1apuZO122MpmR2va3EyvAg9nVzeK-_vzb7eRejCrEKtreiD1rtXV7eFMLXBaeq4StUWc9pK3aHMx3MxpazK5kfFw2moiNxIGUw-nE0tFBY4bmt1AahWUNdqzXmjnaatoXGPFKSl3g6o5D2fzGq8b9TFwerBCM4iVdqu8DrToO37z-2hM0xibOs2iXYFJdPQekRlQnRPWfPgfnQ_DgE9lNv0qZ9YventeP23-_dN8tixtZurlvAH_APXSlSrZ5ezdcSpk3U8PDLW9uaah0vG7TKCwNeg1pC-O-njfKa-0vE3zfbYqFlNqTa_yW7Ej9LPKv2HKTB3EZzR4-PGifeYT3Wxmoiy-W0Z6P9OnSzYNhKOJrV6KFac5jlXHKSmOOpao4l2DAnX-G0tEn9DqSmVaAqumKMcPzIufLjmhYti1dKr5ea3owsIwvsR1Oievptvtbrt-ekK3n2tgpoK4DccP15q8iObAqR_f929IBWN6fXl1i44Wnznr6Q9k3-N1JbeKFbTfDaInXGXEB-WduO3atabfnr9s3p53778-Pj6_v6upNRXzkeIF63Vbqoe-Fz-oRmir93bTVt3W70svXK9WYfTdx2NdD9d_n068-4MW_fx8jNK8ynOM8xWmYZjFSRxXQUESmuAwI6QKcpqEOCgNP0yN-0L4gSo_mtf1P-SHw1dN0PW4VFV6JOKdlfS5qmjRC50AwVSo3147UgLBe99xOkl0QHRuXI6n7nTZBuuB2njBuqiJEGi7fv11u_XCR13O4WOiEmh-HGvu2xf1oFKtkCo5JHrO2gPqTkVXUtFzL3y-5ky4Rm96qdrl7OYy0sNZJ3uBtm96P6LLg91Mxlsqq3PKsJz4z1CvY_uZiK8_ny6y5nIwXR3oCHwxW9e_7PIUgXk9mim-8FOvr9NfZ9ZzYbXua2k0su7ZHNHdZrtTEViE6npuwkCHz7fqL2mFtlMkb1szx_HnXzbb7RTQi0fk4VCxVS3kRGkK53txpOUDawn_9vnRCx89jH9TxbvdKK96eXqVb5SU_1t2W-VUhe617n7fbX5kvUbCmPECA2djI0Ou1r__kPXmr62vO1jSqkHqON1tIa3L0jyMVat-iVKwD_TP7AGeTpsWVaTQD9cNOqtM29f63UvFWvW2gfTqKaLfCkVhAN-o7Wk9naB__92JKvzeeOcj_InSQG7vLtAMRxNKSy1NfVn4A2sAHCAcDVj6AwNoAGh22wLLFli2wFLIvanUEGilpTbpq7dhnArhz5xLNhgDNBoNJKHSdFbpNVQQ3owrXQ--gYfer_xxKZGWiPcf_uhXLqlciJeGlpFeUQXhrG3IaGo1NLSUH6g_VM0sYS2wV9CwlzXQKmhoB3_wZ207Lb_yz7ZodIikLeNd6Rp9DZ5LLJdyh6llxq0AclqkRng5LXXQBJCosABJJ2RjiaQtEn_yHrjWuT3PLA7tH0s8ANzaBq1tMdoWYMdFzUq6KrszdKSl8gRkf_LeIGtzBVVana1SOVu1ovHZ0p8N_TVXFqLRIZK2bFlR578oqfOyps6OojpbmX62Uv3s2PKzY8_PVtjOdtwUPlv6OS6snDmxrif-rVBrukpmnUJVZeIQQwS1SQQR1GYAAF1jvO5GygAJJQDzKgGYSgkygAU94IWbSWi5moSWu0m4cBm6XIYul6HLZehwGblcRi6Xkctl5HAZu1zGLpexy2XscJm4XCYul4nLZeJwmbpcpi6Xqctl6nCZuVxmLpeZy2UGXQpYCgLmvoDJLigcesD2aC0BSa9lllMtWVpZc2nJ0mpBIbNtwgWr0MEqXLAKHazCBavQwSq0WYVLVtGCVeRgFS1YRQ5W0YJV5GAV2ayiJat4wSp2sIoXrGIHq3jBKnawim1W8ZJVsmCVOFglC1aJg1WyYJU4WCU2q2TJKl2wSh2s0gWr1MEqXbBKHaxSm1W6ZJUtWGUOVtmCVeZglS1YZQ5Wmc0qs1k5jgbHOeAo-mWFO-rZUbyOSl2WpaMIHRXnKK9lLTkqx1EmjppYFoAj3R257UjkZdY6ctSRkI7sW6aaI7EcWeRImUV-SLvTkXanI-1OR1qdjnR1OtLV6UhXpyMdnY50dTrS1elIV6cjHZ2OdHU60tXpSFenIx2djnR1OtLV6UhXpyMdnY50dTrS1elIV6cjHZ2OdHU60tXpSFenIx2djnR1OtLV6UhXpyOXnU4zXc5YsIHYsh4s9WhBQ92WfgNgC_AIfI_A1Sih0rxFudwxGDwnwWALDC4V_dN41zTB2X-l7ywM2ANY0wU0xtaWcQ-0LRzbgrHgLkSj0UASKkEIWiu4bcdNaCMQeLEHuzpBSz1a0FRXvoFUIBmEA4SGKxVXBiHQSksNliwYmFjtAoNwgHA0obSspWUOp4KbqCHQWqMtoi2kBvdcQ8O4M1cF7gQ0Gg10hMqjpRXS0gtpWdgGQD_4g88AGgAyLFfc1GGAIoAyE41Wlo4AtkXNTv6ZWXiw8AiwtAdIe4Q0hwhOzAEaDhCaxjU0rqFxbRh33NhyBQYT3Mw4LfXltDAE8DJwEkhLAm4HJ4FloqYxMbw24rQcLYvG4KiRQbKRUGnmCT-Q_kjN5d4kw0Jij5oeXrOdvrxiEN7GCPhpgIA3gAJ-HiCmjx2YhQcLz_bw1LNOOUFHdapjC0cWzm7YuAQdoVCebNFkxhwyaKdGsoXEsKmB3jw6NJot4bki4MGist7wo9AAkGEJZuTAKQc-LaeWV8ut5ddybHsG953CShnr0xxhfZpjDQZjrRvmM8wv6355gkArrcHSGi2t4ebBZN0Gn-EOKQgO96sAWNgGQL84ES4S8xSxrpLPVnjgRfIEgVZag6U1WlrDzQCM4AAdwQk6giP0wyrND6s0P-bS9IL1XXkflnmYkzt6v0qjPMjCZJXeHe_zVRitVlEeRSucFSuShTineZriGOc0W-3v2D0OcBwkQRwEYRimfpIHZbQiZYgLmsU58aKANoTVfl0Pjd_xwx0TQtL7VYSzNL-ryZ7WQn_zF-OWnpHWehh78dMdv9ffF9nLg_CioGaiF7ObnvW1_srw9O1c_fWb-OFtq199OVI0lIiJ1sOp-XEu_Cy36jgSXQO_rXoneX3_w19l0byFh18uCxvu8X8DAAD__-lFVyk">