<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62149>62149</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
failure to fold comparisons after llvm.assume / __builtin_assume with unsigned value
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:optimizations
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zmodem
</td>
</tr>
</table>
<pre>
Consider:
```
void g();
void f(int *p) {
__builtin_assume(*p > 100);
if (--*p < 42) g();
if (--*p < 42) g();
if (--*p < 42) g();
if (--*p < 42) g();
if (--*p < 42) g();
}
```
LLVM will fold all the comparisons nicely:
```
$ clang -O2 -S -o - a.c
[...]
addl $-5, (%rdi)
retq
```
But if the value is unsigned, it will only fold the first three:
```
$ clang -O2 -S -o - a.c -Dint=unsigned
.text
.file "a.c"
.globl f # -- Begin function f
.p2align 4, 0x90
.type f,@function
f: # @f
.cfi_startproc
# %bb.0: # %entry
pushq %rbx
.cfi_def_cfa_offset 16
.cfi_offset %rbx, -16
movq %rdi, %rbx
movl (%rdi), %eax
addl $-4, %eax
movl %eax, (%rdi)
cmpl $41, %eax
ja .LBB0_2
# %bb.1: # %if.then12
xorl %eax, %eax
callq g@PLT
movl (%rbx), %eax
.LBB0_2: # %if.end13
decl %eax
movl %eax, (%rbx)
cmpl $41, %eax
ja .LBB0_3
# %bb.4: # %if.then16
xorl %eax, %eax
popq %rbx
.cfi_def_cfa_offset 8
jmp g@PLT # TAILCALL
.LBB0_3: # %if.end17
.cfi_def_cfa_offset 16
popq %rbx
.cfi_def_cfa_offset 8
retq
```
(GCC folds all of them in both cases, see https://godbolt.org/z/ssPEfM5Gd)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVl2vmzgQ_TXmZQQyNnDhgYd8NNVKqbbSVvsaGbDBlcEUmzTpr18Z8sFNb9u0bxtFRDDjc84cT8YwY2TdcZ6jeI3ircdG2-gh_9bqirdeoatzvtGdkRUfEF0hvEX4ek3w5TvdHrWsoEYkRSRDdL3MnEICkVR2FhBZ9YhkgF4uOQCHQzFKZWV3YMaMLZ9AVj0g-g5CjJeAAFIAIqnvXzI2EBEH98j8f0hEL9s3rZyv-_2_H-CrVAqEVhUwpcA2HErd9myQRncGOllydf75viASQalYV4P_NwH_H_A1-MCC8hKO10EQoPiqBGesqhTCGSKRHyOygUl0PFTSSb8mDdx--Yn29WidCU7vkamRgzQwdlOnVQ5T2rky3anzXJ5LFXIwFmwzcP6HNYG_lZ1FdHsjuwoOLD_Z-52Qik9FEucEIfdIrXTh6ndbSMH3Yc1r2YEYu9JK3YG4p_aEKVl3CGeRKwqfMrzgO_eOQSCyQRG-Lp_jAtEVPPVxGtzyO24p5MFYNth-0Nc9dEkkLooAPwF8yeadHc432H40zZfJkHgoTq_ZKi4OpWAHLYThFsLkdfjy-LKSbMBfZLT6eIV1DbSBB4JWH-dmW_TYnMXZ6a2WjN4I30Cmpz9q2bLtLyBR-AbIZ-YK2q_X-EAebQ2ft1WKwDa8C-8dddLDo7pXxCVTynlUowh_3H_6gTXO2u-sucqlqwU976qQ3lAqXi7Yf-XYzPL7jtFHx6LXmiZLkqct6XX_ZDOmdzVtfzdxov60-mu_We33S6_ob-2ks_Ll2T_Dn4j-xRhFJH2_2UwD0kwHgJ5maguyg0LbBkpmuHEGGs6hsbY3bnCSHSK7WleFVjbQQ43I7hsiO2M-vhMf4vcVIplX5bTKaMY8nodJGsY4SSj2mlyU7EVkNIlSUWRRmmQFixPCSJoVYYFp6MmcYEJxFEYkDDHFARVJyaoSh2GaCkoSFGHeMqkCpY6to_ekMSPPExJGmadYwZWZ3jYIcRmIrnRvZSu_MTcgjRvG8dYbchf0i7E2KMJKGmvugFZaxXPBpBoHDlbPR8jyZGTC8gGmBfM7BSCy--5FA75K29wOpvmo8sZB5Q9WStuMRVDqFpHdpHn-8ftBf-alRWQ3lWgQ2U1V_hcAAP__PT927w">