<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/83699>83699</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed Optimization (InstCombine): Convert constant mask M: (x&~M)|((x&M)&~(y&M)) to x&~(y&M)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Geotale
</td>
</tr>
</table>
<pre>
Example code:
```rust
#[no_mangle]
pub fn src(prev_value: u32, new_value: u32) -> u32 {
let mut prev_bit = prev_value & 1;
let new_bit = new_value & 1;
prev_bit &= !new_bit;
(prev_value & !1) | prev_bit
}
#[no_mangle]
pub fn tgt(prev_value: u32, new_value: u32) -> u32 {
prev_value & !(new_value & 1)
}
```
Becomes
```llvm
define noundef i32 @src(i32 noundef %prev_value, i32 noundef %new_value) unnamed_addr {
start:
%0 = and i32 %prev_value, 1
%new_bit = and i32 %new_value, 1
%_5 = xor i32 %new_bit, -1
%1 = and i32 %0, %_5
%_6 = and i32 %prev_value, -2
%_0 = or disjoint i32 %1, %_6
ret i32 %_0
}
define noundef i32 @tgt(i32 noundef %prev_value, i32 noundef %new_value) unnamed_addr {
start:
%_4 = and i32 %new_value, 1
%_3 = xor i32 %_4, -1
%_0 = and i32 %_3, %prev_value
ret i32 %_0
}
```
Note that with a non-constant mask, this optimization _is_ applied during the InstCombine pass!!
Tested with nightly Rust on Godbolt
Noticed when checking the output of my own code for bitfields (this is heavily minimized to the core issue)
Godbolt: https://godbolt.org/z/YMd5sn9on
Alive2: https://alive2.llvm.org/ce/z/GQeQTS
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VU1vpDgQ_TXuS6kjKAPdHDgkneloD9nV7M5lT8jgovEM2AibTjKH-e0rQ3_QJFpFWq0UKVB-9arqvWojrFUHTZSx-IHFjysxuNr02RMZJxpaFUa-ZV9eRds1BKWRxPg9Cx5ZcM-SYPrrB-tOIeQsftAmb4U-NMTixyneDQVUGmxfMtx2PR3zo2gGTwUDR4Y70PSyiKWwZvyLfwa2eZh4AAAactAODkaaQjlg_BGunMAwgZDxRYbnP4MvtT7AXlkx8ViG4Sn1BnYzxkjDMAx902yzu5CcRNmcVPiURu7g_rtG73tjuF2Ojemyv7Oh0-sDlaYluzhrmmM7hSRVShNoM2hJFSjfRBRMHvuX8wHDeDYO7mBxeB0LUxi0Fi3JXEjZX2eyTvTusnhe_jgYrRRaToWXNcIZdO79LGFW9xafxyP01fRzqPcTd7CeI8MlZ-AhI8UJ5Z-Tf291jfPa01ymB6nsd6O0OyeFZ-rkDO_pcpgHH-7axxZNK_b_W5RHn5LcI_lS8Tx6J3b-zvKcnzSZNf8ZbW73_HfjCFwtHLwoV4MAbfS6NNo6oR20wv7wVVytLJjOqVb9FE4ZDbmyOYiuaxRJkEOv9AFcTfCbtm5n2sIr3wlrx19fCHNfvpF1JKd6Wh1q17zBn4N1YDQ8GVmYxl16U6VH1qShrKn8ca5iBtcNDkwF7RuYFz3ezVCZHgrlKkWNtP6WGttWFmoSR9W8Qau0n4AkODPylKYnUNaO3k5Fzx3we6id66x3FfcM94fp4M70B4b7nwz3fz_L2OrU6CnzvlFHwveJYozf-bvjlFzSieHpK3399tdKZlymPBUrysJNkEY8TONoVWeYJjwJY4EphUEQJlHFk1RUvEiDZFPyaqUyDDAKeMADDJFHd3LDN2FR8ZCiMEJZsSigVqjmUn01TptteZKmq0YU1Njx24eo6eUsBfpPYZ_5nHUxHCyLgkZZZ68sTrmGsmdlLUn4Y74YDLezHfCy8nvYGX2k3sHNYsGzP2K4fWWY_Hr20M2O4fYUGQOY_GK4fbu8pt6510V4NfRNtjBLuXoo7krTMtyPt_b0b9315juVjuF-nNUy3I9a_BMAAP__uFZYQw">