<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/85453>85453</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [RISC-V] Overzealous transformation of `~x - 1` to `-2 - x` and unnecessary `-1` loads, rather than just using `~x`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Validark
      </td>
    </tr>
</table>

<pre>
    [Godbolt link](https://zig.godbolt.org/z/faf3Ea5jx)

```zig
export fn cto(a: u64) u64 {
    if (~a == 0) return 64;
    return a & (~a -% 1);
}
```

Gives this emit on RISC-V:

```asm
cto:
 li      a1, -2
        sub     a2, a1, a0
        li      a1, 64
        li      a3, -1
        beq     a0, a3, .LBB0_2
 and     a1, a2, a0
.LBB0_2:
        mv      a0, a1
 ret
```

The C equivalent gives this emit:

```asm
cto: # @cto
        li      a1, -1
 bne     a0, a1, .LBB0_2
        li      a0, 64
 ret
.LBB0_2:
        li      a1, -2
        sub     a1, a1, a0
 and     a0, a0, a1
        ret
```

Here is what I would have handwritten:

```asm
cto:
        not     a1, a0
 beqz    a1, .LBB0_2
        addi    a1, a1, -1
        and     a0, a1, a0
.LBB0_2:
        li      a0, 64
        ret
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVE1v4zYQ_TWjy0AGPyTFOuiQxPV2gQIF2mKvBWVSErM0mZCUk81hf3tBSU5sN0nTgWGCM4-j9x6JESHo3irVQHkD5SYTYxycb74Jo6Xw37PWyR-p9sXJ1pmIRtvvUG6ArYcY7wPwa2BbYNtn3a_6GbNyvk8ZYNtOdPwXUd49AauBbIBcL_8VmX_Pup8z6une-YidxV10wNYC-DWOVQGsTgvC1c0MRETUHQJb_xQIfAN8gyShvIqjt1gVwE-gS1YgsGo5lAMrkSZGRyBcbS54nZL9og8qYBx0QLXXEZ3FP77-eZt_S-LfEiXCfs4kKUcMGo1TCArsFnP2yjFFGNu5ylJ1xghyjjnvUBXvVPnUn55XW_UwV8nUecKsfru5IX8fiQgrT7ovPBYGR-SLmCX2BzztevymV_EDP_8aFN6iehj1QRhlI_bnBn_SVgTGEQqSdh_Y9GJEa9U51385cHmenNn8Iuo9Mz55wfSNC37xnizpUzeX-NjUX5VXqAM-DiLiV3x0o5E4iIPCQVj56HWMyv6_B7uEdfGU-JFyqx6eX9NvGimk1JeSL9_lhXL6mVf3zgX9h0-ZbLiseS0y1dArSkpO-LrKhoZXV2XBu5YqVdGWrGva1l3LKWeESSJlphtGWEE4LWlN66JckXbXVpQRpshaEiKhIGovtFkZc9in8ZfpEEbVrMui5JkRrTJhGrCMWfWIUxEYS_PWN-lM3o59gIIYHWJ47RJ1NNNkXuZNucHfD8o_K2HcGDB6YUPn_F5E7Sy6DqEiP58wRwoVwejSPmeY41PaJ6tHa9VOhSD8j6k4AY0TMiQrvYiD8hgHYfFuDBHHoG0_d4WKZKM3zfnY73Ucxna1c3tg28R7WfJ77-7ULgLbTmoDsO3kxj8BAAD__1SBplQ">