<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/91305>91305</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`1 << cttz(z)` should be folded into `z & -z` even on machines with cttz built-in
</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>
> https://alive2.llvm.org/ce/z/on8IIK suggests `1 << cttz(z) = z & -z` is already folded by instcombine
_Originally posted by @RKSimon in https://github.com/llvm/llvm-project/issues/90000#issuecomment-2081442262_
This code:
```zig
export fn bar(y: u64) u64 {
if (y == 0) return 0;
return @as(u64, 1) << @intCast(@ctz(y));
}
```
Gives me this emit for the risc-v sifive u74:
```asm
bar:
neg a1, a0
and a0, a0, a1
ret
```
Exactly what we want.
Now, let's "upgrade" to the sifive x280:
```asm
bar:
ctz a1, a0
li a2, 1
sll a1, a2, a1
bnez a0, .LBB0_2
li a1, 0
.LBB0_2:
mv a0, a1
ret
```
Oops! Same problem occurs on x86 Zen 3:
```asm
bar:
tzcnt rax, rdi
mov ecx, 1
shlx rax, rcx, rax
cmovb rax, rdi
ret
```
And on aarch64 apple_latest:
```asm
bar:
rbit x8, x0
clz x8, x8
mov w9, #1
lsl x8, x9, x8
cmp x0, #0
csel x0, xzr, x8, eq
ret
```
[Godbolt link](https://zig.godbolt.org/z/8be9Ef4h4)
Related: https://github.com/llvm/llvm-project/issues/84763 https://github.com/llvm/llvm-project/issues/90000
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVduO2zYQ_Zrxy2ANeiTr8uCHvcRBkKIBkqIPfVlQ1FhiQ5GuSPn29QUtu-t1nQWyWQgSlnPmcg5pHum9bizzAuYPMH-ayCG0rl_8KY2uZf99Url6v4DkA7YhrD0k90BLoKU0esM0NWbTTV3fAC0VAy0PQEtni0-fPqMfmoZ98AiZmCEkj5A8ogrhAFQcgEqE5AkPCJTh3QEygdqjND3Leo8rZ2qusdqjtj4o11XaMognEPfj-_lLrxttpTF7XDsfRjCk4uvnb7pzFrW9GrjRoR2qqXId0DKOffrcrXv3N6sAtNTeD-yBlqUQQgAlxwXluo5tuCNRzNKUKKPny0n-aLVH5WqOnS7WIRPjc9DNuMK7tesDrixWsgcq9pDc45ClUYshSxHyhxGIiKhXGCFRpKiTiKCew9BbFJBcAE-LkArpgYpjvUecjQIfNYdUaBsepQ9ABaRCHbdgD1TG51wL8qerwS_ZfNQb9tgxhkiXOx1w5XoMLWOvvbrboNcrvWEc8vRHQkjfjSuR_hmDpz_LDcpZHF2K1xFp6_ErTtH4nr3G9BzeGP7DTqpg9rhtZcAt41baML0E_O62sarhAJR7BKJh3fSyZiDC4I40T_x2VIh3EVThMNK4SdLoE1kad-9V0BtzmUq3FKgsH15Umv728CCe6X89xgqn3mfQ9aTdBi8FPzd6W-Mvbu2BZvhNdozr3lWGO3RKDb1HZ3FXZPgXW0zepV04KBviNstdHKmv9dXEbhyZ1e6WfK3Z4UX2CIr_vd6gzm2qW03eJn5v60hQyl61WYpyvTb8bGRgH36Oa1_pyBF3RWy_uzogyozH5xQtbguwLWMUKDlLYLy5TCtvJatuPWLEKfm6tWfzEt8d-lMRekT-52d-hzB_-OjqypmARtvvMH8CKl7f0gfdTJsRc7KV6ChFxeWHVdrGq_Ky4FeOQtfxHn3_ZV-keZb8qllM6kVSl0kpJ7yY5bO5yHJKykm7KFVBKbNKiyqfqRmtKhaqrNJVvsryVS0nekGCUjEXuciTZF5OcyrkPE3Kmqp0nsgKUsGd1OY_r50cWy_KWSLmEyMrNv5o3kSWt3gMAlH08n5xHLoaGg-pMNoH_1Il6GB48QNzjn7sWzeYGis-27G2wUU3vzRt3rCN57-TqtWWPW51aI-VsBq0CXfaTobeLH5B38jz3wAAAP__1JVZ7A">