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