<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/112425>112425</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[x86-64 BMI1] Allow `andn` to be emitted from `NOT` + <some bit/byte reordering> + `AND`
</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>
Zen 5 Assembly:
```diff
.LCPI0_0:
.byte 1
.byte 2
.byte 4
.byte 8
.byte 16
.byte 32
.byte 64
.byte 128
foo:
vpbroadcastq xmm1, qword ptr [rip + .LCPI0_0]
mov rax, rdi
bswap rax
bswap rsi
vmovq xmm0, rax
vmovq xmm2, rsi
vgf2p8affineqb xmm0, xmm0, xmm1, 0
vgf2p8affineqb xmm2, xmm2, xmm1, 0
vpsubq xmm0, xmm0, xmm2
vgf2p8affineqb xmm0, xmm0, xmm1, 0
vmovq rax, xmm0
- not rax
bswap rax
- and rax, rdi
+ andn rax, rax, rdi
ret
```
Zig version: ([Godbolt](https://zig.godbolt.org/z/bGzofYos9))
LLVM version (optimized): ([Godbolt](https://llvm.godbolt.org/z/cjv7oMf5Y))
```llvm
define dso_local i64 @foo(i64 %0, i64 %1) local_unnamed_addr {
Entry:
%2 = tail call i64 @llvm.bswap.i64(i64 %0)
%3 = bitcast i64 %2 to <8 x i8>
%4 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %3)
%5 = bitcast <8 x i8> %4 to i64
%6 = tail call i64 @llvm.bswap.i64(i64 %1)
%7 = bitcast i64 %6 to <8 x i8>
%8 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %7)
%9 = bitcast <8 x i8> %8 to i64
%10 = tail call <2 x i64> asm "vpsubq ${2}, ${1}, ${0}", "=v,v,v,~{dirflag},~{fpsr},~{flags}"(i64 %5, i64 %9) #2
%11 = extractelement <2 x i64> %10, i64 0
%12 = bitcast i64 %11 to <8 x i8>
%13 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %12)
%14 = bitcast <8 x i8> %13 to i64
%15 = xor i64 %14, -1
%16 = tail call i64 @llvm.bswap.i64(i64 %15)
%17 = and i64 %16, %0
ret i64 %17
}
declare i64 @llvm.bswap.i64(i64) #1
declare <8 x i8> @llvm.bitreverse.v8i8(<8 x i8>) #1
define dso_local i64 @bar(i64 %0, i64 %1) local_unnamed_addr {
Entry:
%2 = tail call i64 @llvm.bswap.i64(i64 %0)
%3 = bitcast i64 %2 to <8 x i8>
%4 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %3)
%5 = bitcast <8 x i8> %4 to i64
%6 = tail call i64 @llvm.bswap.i64(i64 %1)
%7 = bitcast i64 %6 to <8 x i8>
%8 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %7)
%9 = bitcast <8 x i8> %8 to i64
%10 = tail call <2 x i64> asm "vpsubq ${2}, ${1}, ${0}", "=v,v,v,~{dirflag},~{fpsr},~{flags}"(i64 %5, i64 %9) #2
%11 = extractelement <2 x i64> %10, i64 0
%12 = bitcast i64 %11 to <8 x i8>
%13 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %12)
%14 = bitcast <8 x i8> %13 to i64
%15 = tail call i64 @llvm.bswap.i64(i64 %14)
%16 = tail call i64 asm "andn ${1}, ${2}, ${0}", "=r,r,r,~{dirflag},~{fpsr},~{flags}"(i64 %0, i64 %15) #2
ret i64 %16
}
```
Problem occurs in `foo` even when you manually change the last 3 statements to:
```llvm
%15 = tail call i64 @llvm.bswap.i64(i64 %14)
%16 = xor i64 %15, -1
%17 = and i64 %16, %0
```
The code contains my workaround for https://github.com/llvm/llvm-project/issues/111046
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEuP2jwX_jVmczQoPrmyYDEMnapS26-LqlK7GTmJE9wmMWMbBrr4fvsrOwGSTMo7vSzeRREQbJ_bc57jEwemtSgbzpckXJFwPWM7s5Fq-YlVImfq2yyV-XH5hTcQwq3WvE6rI_Fvibcm3uk78tp3LoqinZq_vfvwxnvwzpIwT4-GAwDtxt3rNI3T08HUdDItS6Ppef8HtqNgHBp2lgspL4F3r_02VZLlGdPm0Y4PdU0J3sHjk1Q5bI0CEq6U2ALBFZzhh-uhlVru3VWxg1VWuRiup_qJbbv1iQWlR_L7Wu4f22g8Z3Cs1xNAJ3C2sC8L3CasKETDH9OLid7VAfRGBp-rYSeO19S2epc-TnrBf3Xworg6oF1mnbQTuOkEGmnOqW81nyX7JMqafJIlS-1ZoulLjOlU3Iz2Rn_DfBEl7LnSQjbEvwWCCQlXr2WeysrYksFkY8xW2xrEe4L330U5L9vluVSlnSF4n77-LovPUi8Iurcz_fbtp3cn29aw3BpRi-88txIv8VVV-3rCWfZ1H8t3Rfi572wE0aq2Uzm37EGu5UMlM1aBiAIggWc3FiZugKFjs_tNCS7AiT7smobVPH9gea6AxKvW4qvGqGNvUxIMEYi_BsNEBRmrzj4cAEftXETBwN2ip-077VQYu6NPYSAYCcS_S-AAIiH-q55CMHLXF7v4FUZxm34-3ycisdkeiGHoD8MIB2GMhQMbjzg3KjsV_RxqOnQXT6GOrqBO_gzqeBjG4irqZIjaovCeh4FWJQqsDtM1EMSuxxAMSLxCEq9tgbUjOhh5boTtBBJ_vSd4d_r8n8SrXKiiYmWrZCeKrVa9UcVKfbJxynTYK2e7RYDg5c5jMVCHgR-MYpnhFa95Y0ZAHNSTHa-vjFPEUXqFOer_GeooXrizw-Aqd9R_XrK0LfKDVOfAAwvyhvaFfraww2FJ0ba0bes-SUQtweE5kYpfUhd3zSte93tZzrOKKX7NeUctnVL7hRRPm5tunylTf9vn3_b5c-3zb__87_TP32ugL6_aYORyquo70t1JdopkvE65Inh3-vwq5YMWFo4573fraNytp47VH5RMK16DzLKd0iAaIJE7ckYe8D1v4GnDGzjKHdSs2bGqOkK2YU3JwWw4VJYNH7RhxpWWBiN_9KB7Oen-QXr698dwcH980e1tMiUfNxwymduvxjDRaKiP8CTVN6bkrsmhkAqG5_9SmM0unWey7h4GusvNVsmvPDME74XWO64J3lNKvSDq-5vlSz9f-As240sa48JD9BBnm2VcsCKO8wWLEhYuChbQrEhjngV-wn0_ymZiiR4G1KMhXYR-gPPcz_wizXyPFVnixT4JPF4zUc1dWqUqZy6OJaUYYDirWMor7f7EQGz4E7hVW27heqaWDkK6K7XlRWijL2aMMJX79-OQRDdRAKt3bygJ13BbVfLJlpDdIraGjISUA6-FMTyHQsnarr7_30e7aJ8NiX-nZc3t3rbPZ0fDQXGpcq5EU7b7e2VVbt-vSeTNdqpa_k7yHe79Ev8JAAD__yeEsYE">