<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/72626>72626</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Missed loop simplifications may be due to failing to identify loop invariants
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          ZY546
      </td>
    </tr>
</table>

<pre>
    Hello, we notice in the code below that `size_` is a loop invariant (if size_==0 then it won't go into the loop).

https://godbolt.org/z/Wxo38e4jG
```cpp
int x,y;
void func(int size_){
    for(int i=1;i<size_+1;i++){
        if(size_){
 size_++;
            x++;
        }
        size_--;
 y++;
    }
}
```

But Clang -O3 -fwrapv:
```asm
func(int):                               # @func(int)
        lea     eax, [rdi + 1]
        cmp     eax, 2
 jl      .LBB0_5
        mov     eax, dword ptr [rip + y]
 xor     ecx, ecx
        mov     edx, dword ptr [rip + x]
        jmp .LBB0_2
.LBB0_6:                                # %if.then
 inc     edx
        mov     dword ptr [rip + x], edx
        inc ecx
        cmp     ecx, edi
        jge     .LBB0_4
.LBB0_2: # %for.body
        test    edi, edi
 jne     .LBB0_6
        mov     edi, -1
        inc     ecx
 cmp     ecx, edi
        jl      .LBB0_2
.LBB0_4: # %for.cond.for.cond.cleanup_crit_edge
        add     eax, ecx
        mov     dword ptr [rip + y], eax
.LBB0_5: # %for.cond.cleanup
        ret
x:
        .long   0 # 0x0

y:
        .long   0 # 0x0
```

GCC -O3 -fwrapv:
```asm
func(int):
        lea     eax, [rdi+1]
 cmp     eax, 1
        jle     .L1
        add     DWORD PTR x[rip], edi
        add     DWORD PTR y[rip], edi
.L1:
        ret
y:
 .zero   4
x:
        .zero   4
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVk2PozgQ_TXOpRRkDOTjwGFIlNnDrmY1Wmm0e2kZbEhFjo2w89W_fmUgH9CJujUIBbDrld97tivm1mKlpUxJkpFkPeEHtzVN-t-_STyb5EZc0j-kUoawFZwkaOOwkIAa3FZCYYSEXCpzArflDsiMWnyXb2RGAS1wUMbUgPrIG-TaAWELLKELidYkWlOfRgM6OBlN2NxBZQC1M216jyZsGRC6JvRb97t1rrYk-kbYhrBNZURulAtMUxG2eSds8-tsooWMd9970Ix2d1HXXQtqB2fCVhcSZV3L0aCA8qALT0-7nh9bknkfAABQmqbvRhKtQxJlSKJVH5p13yxr7yHQX1gStviY9or2dzSC-Ov8oo_M18OGNtF0eg-8PEHeUPeXqzmPBmcHByvFdQXTHxFMy1PD66M3fAjhdt-13I3z2qKBgCcXYRGQmA5RAzFK8vYpuZ8mIEnWCATCMghJMhJe7OvHWNb37lTXHfyZZfQtGWL25viIESfTCKhd046EdTvS5T7S2TRdeNGG-8fzdOJ1uvMH4rt93bPrOXcfs88N7BxkCZaB3zt9WtTFjcVTeq95eVFjlE_3QenN7N4JgSNNlXxwPX7UxbyunnhpmsDXlSHYSes6AThMvtOPWWevzG9R0_CjjCvjruNTDYOVM5ibeKShMFoEt5dCSa4P9VvRoHuTopLDvFyIx0X3chW9Xo0exc-PhJJnhHoew-yNdF3D-baRr12BMroCANpmoudBLbh8OfxZJfm-Wv1mDflCQWiL7m1XjepAOJ7U6xIKn8_K-tePn2v4-5-ffkd422_7Aj8DXJ4D_FBjHbdZeLA1eJeNAYD45fwMA27eTUQaiWW05BOZhnNKWcgWyXKyTctQSi6TghYxp0lJS8kWcVksozyKwrCMJpgyyqIwDOd0yWiyDJK5ECJPRE7lcl7whMRU7jmqQKnj3v-1TtDag0znbMZmE8Vzqez1tNCkPmiaHypLYqrQOnuHOXRKpn-htVJ0RwGL-1phiQV3aLSFPb9ALkEcJDgDJUeFuvKvKKR2WF5GJwg7OTQqHZ0B0G0PeVCYPWEbP3b_mNaN2cnCEbZp-VvCNq2E_wMAAP__uMFV3Q">