<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">