<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/111323>111323</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Constant hoisting results in suboptimal top bit clearing
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dzaima
</td>
</tr>
</table>
<pre>
The code:
```c
#include<stdint.h>
void foo(uint64_t* use, uint64_t x, uint64_t y) {
use[0] = x & 0xffffffffffff;
if (y==0) return;
use[1] = y & 0xffffffffffff;
}
```
emits with `-O3 -march=haswell`:
```asm
foo:
mov al, 48
bzhi rax, rsi, rax
mov qword ptr [rdi], rax
test rdx, rdx
je .LBB0_2
movabs rax, 281474976710655
and rdx, rax
mov qword ptr [rdi + 8], rdx
.LBB0_2:
ret
```
ending up using both `bzhi` and `movabs`+`and`, which ends up worse than consistently picking either approach.
https://godbolt.org/z/c3jfc3Eoe
final LLVM IR being:
```llvm
define dso_local void @foo(ptr nocapture noundef writeonly %use, i64 noundef %x, i64 noundef %y) local_unnamed_addr {
entry:
%const = bitcast i64 281474976710655 to i64
%and = and i64 %x, %const
store i64 %and, ptr %use, align 8
%cmp = icmp eq i64 %y, 0
br i1 %cmp, label %return, label %if.end
if.end: ; preds = %entry
%and1 = and i64 %y, %const
%arrayidx2 = getelementptr inbounds i8, ptr %use, i64 8
store i64 %and1, ptr %arrayidx2, align 8
br label %return
return: ; preds = %entry, %if.end
ret void
}
```
([another issue](https://github.com/llvm/llvm-project/issues/62145) where constant hoisting similarly messes with constant-dependent backend optimizations)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVk1v4zYQ_TX0ZRBDGn1YPvgQx2ugQIoCRVH0FlDi2GKWIrUkFdv59QUpK1GcbLGoEEQS-eZx3hsOLe6cPGqiDSu2rNgt-OBbYzfilcuOL2ojLpu_WoLGCGLZPUt2LJn-l8n411zfMZO6UUMAPjgvpPbLlmXfxtkXIwUcjGFYDVL7Mn_yDO9hcMTwAaYhOH94uzBcA1ttRwoAiPhim7BiByzbwRkYlpCcD7OLZTO8PADD6sKyHct2SaCz5AerP4BG0nQivfwXKVvtbuTPPaFOegcn6VtgZXL3RwZ3HbdNy7Jdy92JlAoBP_GRu24cCTZNGLhenXmJd66CQ3l1na1fWxmGLY_OWSfjjZ-_jv5xMlZA7y2wYmuFZMXuI96T85FPjHzihuiZxvvycbtNnvDTKrx2b8lglearfL0qV2lSFsVHLNcC5gv9asbAcAvVlPeU3pTOrWuW_JfVIi2kPsLQw-DCQ23GigU7WZnE7FiZjIJCFG5DgbSIzw9wamXTAmnhAsfJWEfgW66hMdpJ50l7dYFeNt8DO0nfkgXe99bwpl3Oq99637uQN-4Z7o9G1Eb5pbFHhvtXhvsmez402TdD86CD1FzB4-Pfv8Nvf0JNUh_fN9WkVKmX634SdJCaQDjzpEzDFcRmZHky9mMwV5uG936wBNoMWtABTlZ6MlqFbiiubSrL_G2eYXH-Yiy2bFzladCadySeuBD2vYtJe3uZFYphEUzzsfVq6RvufCS92T7gTRiehcUiZbtYrBAwZTQxTlDnjaUJEWqID-OGetPFlTxqqOYpdX3kluGBfkzRl4BOJlxtQaZXdJhQvCYV3q9nzHxIHpakxbyI15HsHli2hd6ScHFJhsXo0Qel6a3Uy1dSA9ZafpHijDHgSJ4UdaR9UCx1HSrlQFafTQi8kwW3lqUz-NsCXzhX208mzBRPR-9PFY-K5lbFFo779VeOX4YVK7Zcm9hv0rmB4klR3XSZ9O1QLxvTMdzHNhlvd701z9R4hvsY6xjuS0zzIuzpU0uWYn97rj20RjofmtvJTipu1QU6co6up_-EuxPUkxakPdS8-U5agOm97OQr99Jox3A9F7AQm0ysszVf0CZdYYVlXuTFot0gigKTdb1eN7moMKtxla6qvElFXqIo84XcYIJ5miSrJMV1UizztBLrHLE-iLxeHQqWJ9RxqZZBaThgFlHjJk3TDLNFLJuLXwGImk5X9xDDR4HdRHvq4ehYnijpvHun8dKr-PnwT1WGn9CHTxZZcoPyDqQGN9RRP1fgTR_6HRpF3Ep9XAxWbf5_oa46Xjb4bwAAAP__3dmM1A">