<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/56516>56516</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISCV] Missing instruction selection for andn
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:RISC-V,
performance
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
preames
</td>
</tr>
</table>
<pre>
In Zbb, we have the andn instruction, but we don't appear to be using it. This might be an order of combines issue as the test case I have requires us to turn a urem into the and-mask form before the opportunity for andn becomes apparent.
```
$ cat sub-to-andn.ll
define i64 @test1(i64 %TC) {
%vscale = call i64 @llvm.vscale.i64()
%n.mod.vf = urem i64 %TC, %vscale
%n.vec = sub nuw nsw i64 %TC, %n.mod.vf
ret i64 %n.vec
}
define i64 @test2(ptr %p, i64 %TC) {
%vscale = call i64 @llvm.vscale.i64()
%n.mod.vf = urem i64 %TC, %vscale
%n.vec = sub nuw nsw i64 %TC, %n.mod.vf
store i64 %n.mod.vf, ptr %p
ret i64 %n.vec
}
declare i64 @llvm.vscale.i64()
$ ./llc -march=riscv64 -mattr=+v,+m,+zba,+zbb < sub-to-andn.ll -O3
.text
.attribute 4, 16
.attribute 5, "rv64i2p0_m2p0_f2p0_d2p0_v1p0_zba1p0_zbb1p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0"
.file "<stdin>"
.globl test1 # -- Begin function test1
.p2align 2
.type test1,@function
test1: # @test1
.cfi_startproc
# %bb.0:
csrr a1, vlenb
srli a1, a1, 3
neg a1, a1
and a0, a0, a1
ret
.Lfunc_end0:
.size test1, .Lfunc_end0-test1
.cfi_endproc
# -- End function
.globl test2 # -- Begin function test2
.p2align 2
.type test2,@function
test2: # @test2
.cfi_startproc
# %bb.0:
csrr a2, vlenb
srli a2, a2, 3
addi a2, a2, -1
and a2, a1, a2
sub a1, a1, a2
sd a2, 0(a0)
mv a0, a1
ret
.Lfunc_end1:
.size test2, .Lfunc_end1-test2
.cfi_endproc
# -- End function
.section ".note.GNU-stack","",@progbits
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVVkuTnDYQ_jXMpQsKxMDuHObgnbVTW5VHVWL7kMuWBIJRLASRBOv1r083DDCz3t3YSS6ZmpKafn79QEi05eP-zsDvQgTsAA8SjnyQ4I8SuCkNKOO87QuvWkNy0XvSKenpygPvOskt-BaEhN4pU4PyEcD7o3LQqProScANtLaUFtoKirYRykgHyrkeRW4M5aXzUHAn4W6Kb-WfvbKo1jvy7ntrgENvZYOIiDHhCxvuPkHV2gbj4DYBb7uutb43yj-SbEpESAyNDhEyt9IQyiC-DeI3pzWPT__pkW0RjwfXi9C3IXmItL6wKGWFiYDKtxBsY8ogCdj1-Miy94eA7SC4upl0gXiDK7iWEKS36BqdnSy1HppokkXIQh9oemZmoqYto6EaDacKrDEOq-MLk0EWoz7iB9M_gHEPX5nNjmdDK_2sMzo4JXt1-3rWDBF33pJZR57_xxVwnkZoqcFJiLpLft9XqkJzK78hS5q2KGDvtC4AR9oWR0RulSsGNEWG9xYZAbsZEAxuzbR9EXwmBOZ6eDqt4S_pjGcXefnZr0_kUuHLjDXbbSnDJH9emE2lYhahKNbF9w0tFS0lLUOCCwKZNjFug0xZtVCfT1S-LReqWqiTVCfs-mSsUzZT-ZYojL5iqxT1eUe89OB8qUyQvr3QqHUrNBLjGwkv_wKWQhjCjayVgao34xkH03u8OOsY16o2SJ5F8I-dnANQA7bxbD7pTIL0zSvBzzAsh8fiv6jUvfPc-s6282iRIsuEiGJ0vKgWzlrcOMGAQUsjFpGzWi2iaV2nwcj6XDazcXBojUd2_ESIMz_R0Y-U7r005QWWyKkv52WBM73wmQyRv-b396W6aNpbU8JlzZ92nv2jzrNv7zx7qfPsezvP_k3n2cudH0XTunael-VTYfjVALB1ZviKDk-XJwN1LlwNcXCuaXp2i7AZ1rF6daCSlwaKXQ5UEj5TuP9-oJw8Mei8iUzrZfTDzx9C7FDxic4cOnzZidjGGLwWyrtnLxSbcp-Wu3THN155LfdBdvPr3W-Hj0F2Cz_hXWi8Oq13LXBST8GXG8ymt3p_9L5zVCT2Dv-18sdeRHixGT8ew7yFCOUPNMfH8ZrlkMjyLMk3x30u2DYupcgKmSYx5_k1K7IdF3FRJqJg6UZzIbUjgJiZwEyxrhiR0IYfp2Tpg9BJS_cubgpJzOx2o_YsZiy-StLkmmVZEuW5TEW-y2RepVlacqyRbLjS0fgpbG29sfsRruhrR19I5bxbhRyrUhs51or8894fW7vvrOR4kduMme3HtP4CrUkACw">