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