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