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