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