<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/118104>118104</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[KnownBits] `(Trunc X) != 1` implies `X != 1`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
missed-optimization,
llvm:analysis
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
dtcxzyw
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dtcxzyw
</td>
</tr>
</table>
<pre>
Alive2: https://alive2.llvm.org/ce/z/3yxP4T
```
define i1 @src1(i64 %x) {
entry:
%trunc = trunc i64 %x to i32
%cond = icmp ne i32 %trunc, 1
call void @llvm.assume(i1 %cond)
%cmp = icmp eq i64 %x, 1
ret i1 %cmp
}
define i1 @tgt1(i64 %x) {
entry:
ret i1 false
}
define i1 @src2(i64 %x) {
entry:
%trunc = trunc i64 %x to i1
%not = xor i1 %trunc, true
call void @llvm.assume(i1 %not)
%cmp = icmp eq i64 %x, 1
ret i1 %cmp
}
define i1 @tgt2(i64 %x) {
entry:
ret i1 false
}
```
The second pattern is common in Rust applications. See also https://github.com/dtcxzyw/llvm-tools/issues/36.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVMFu2zAM_Rr6IjSwKNuxDz64DXzZZdh66FWW2USDLHmWnCb9-kGekxbFtmZAEMjS4yPfEynpvd5bohrye0Dsgzq9nl8AEfJdIudwcFO9biad6891Y_SREETDDiGMHkQD2AK2ctnfGHMcNm7aA7aKANtXwFacT1-zR0gbKNL1lzY9PWtLTHMGWeonxQFLXWQMMD8BVgy295A2ZMN0jjnSJp6EabaKgdix36tLAAuOaYERFb-Vs_2C0moYWcwi8BoO-MD4glTSGHZ0uo8lLIVL7-eBYiX8wgNYXWmH8Y2VfrK3ci-MEwW2hg5jFLzdxf8PasM-fK72wvUsjae_UvlJ4edUnznHLyjrwoI5uWnVcbUsTDPd5pp14X9Mu9mzG4T-2bN3Xfd4IOZp6Y9RhkCTZdoz5YbBWaYt-zb7wOQ4Gq1k0M76DftOxKTx7kO_73U4zN1GuQGwvY5NGw25C84ZD9hq72eKC1FsIG2SvhZ9JSqZUM23AsuqyMsiOdRFwWWeVZkoOPaYI1GWbdW2Vz3npKhLdI0pZpxjxYu0yrIN70opeCdKEl2qhIIspUFqc52_ZMldc17yNEuM7Mj4dcYH7T31d24MetCvi8w47_gAiDEcRCOtNGev_foOTPUiq5v3Pt659sG_JQo6mOX5-GLdi73XwUO-Y9FuLB-XXntabgt5bAMORcr0MBpNPoKe3h8k82Tqf9i8VLd6PE7uB6nw3uVV7LHGXwEAAP__qvJo8Q">