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

    <tr>
        <th>Summary</th>
        <td>
            Constants are not reused for their inverse (andn/orn)
        </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>
    I have this code:

```zig
export fn missed_andn(v: u64) u64 {
    const mask: u64 = 0x7F7F7F7F7F7F7F7F;
 const low_7_bits = v & mask;
    const non_zero = low_7_bits + mask;
 return non_zero & ~mask;
}
```

[On x86_64 Zen 4, I get](https://zig.godbolt.org/z/vsebWje1r):

```asm
missed_andn:
 movabs  rcx, 9187201950435737471
        movabs  rax, -9187201950435737472
        and     rdi, rcx
        add     rcx, rdi
        and     rax, rcx
        ret
```

I think we could have used an `andn` instruction rather than load 2 constants.

I believe the the same principle applies on other architectures even without `andn`/`orn`, especially load-store architectures like the RISC-V SiFive U74, on which we get:

```asm
.LCPI0_0:
        .quad -9187201950435737472
missed_andn:
        lui     a1, 522232
 addiw   a1, a1, -129
        slli    a2, a1, 32
        lui     a3, %hi(.LCPI0_0)
        add     a1, a1, a2
        and     a0, a0, a1
 add     a0, a0, a1
        ld      a1, %lo(.LCPI0_0)(a3)
 and     a0, a0, a1
        ret
```

It could probably have been:

```asm
missed_andn:
        lui     a1, 522232
 addiw   a1, a1, -129
        slli    a2, a1, 32
        add     a1, a1, a2
        and     a0, a0, a1
        add     a0, a0, a1
        not a1, a1
        and     a0, a0, a1
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VVuP6jYQ_jXmZQRKbOf2kIezICSkSq161FOpL8iJB-Kzxqa2A7v70N9eOYHlspfepAawkWe-mS8znzzCe7U1iDXJHki2mIg-dNbV34RWUrjHSWPlc72CThwQQqc8tFYiYV9IsiDJec2T8fuituMJPu2tC7AxsFPeo1wLIw2h5YGwL9DnnNAqbkCKhxEAANBa4wPshH88eQFhC0ieiuXth7AzaERoe1wX60YFPwAOQGh-CvMmurFm_YLODp7XQPpwB3EYemeuADSHP25cSLG4e_-bomQPPxp4KvN1zuE3NMAJncMKthhItiC07ELY-1hJuiR0-aK2s62VjdVhZt02nhC6PHhsfv2OqSO0-qjowu_Gk-tSn31hZw-i8QCufYr5q7QsaJJWWcJZVrCCF-mlRPF59ReD__QtgN4ChJHD7qSKgJjn1i5P9pFAdHsfPyZ8g3cYPqnyKorSPMIRobW9lqNQe48ShIFYnViNPAFlfHB9G5Q14ETo0EHohAFthQQ6qkOY4Ge30RvUCgfpjz8vdgh7p0yr9hpB7PdaoQdrwA4xhWs7FbANvUMPeEADRxU624crMrHjeWLd-H8O6PfYKqH180Bn6oN1eBdKq8eRwc-rr_PpN_iqluqA8EsxyMoaOHaq7WIdosD-SiqzH-Y_rZJ1ctHJ6Zn93gv5Sdff1djp0b0aO5pGShmllJ21IqRUx1fTuE5TWt0G8FoPEQS9eDH6QRIWrYRmnSK0fH2f-5Bn9V0nFh8oWAzNOK3phfnHxjMnCVdJCM20veNEy8j3zO3ThH9P9uEk972zjWj086j7BtH8u2vi_2zhf-7JfZxPfIwNlzz_OMPbJkxkzWTFKjHBOs2rihZZxfmkq9NNmlLeSmzyTSMYb6uUs1QKzvNUlpxPVE0TytI0yVOWZJzNZFk2FdsUnJU5L_OU8AR3QumZ1oddnAET5X2PdZGysppo0aD2w5Sm1OARBiOhNA5tV0fMtOm3nvBEKx_8JUpQQWM9P19wIBwOZXE4XJMbG29CVA6UOaDzCFGtw7hexiuKVpPe6fp2Wm1V6Ppm1todocuY6bRN985-xzYQuhz4eUKXA_8_AwAA__9NUULO">