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

    <tr>
        <th>Summary</th>
        <td>
            [LICM]Missed optimization: loop invariants for global variables
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Hello, I noticed that clang16 doesn't seem to recognize loop invariants very well for global variables:

https://godbolt.org/z/Y34G5W5bY

```c
extern int var_14;
extern int var_24;
void test(int var_2, int var_3, int var_8) {
    
    for (int i_2 = -3247424; i_2 < 19; i_2 += var_3 + 1056714155) 
    {
        var_24 += var_8;
        var_24 += var_14 + var_2;  //loop invariants

        i_2+=i_2/3;
 }
}
```

clang16 -O3: 
Missed optimization of `var_14 + var_2`:

```
define dso_local void @test(int, int, int)(i32 noundef %var_2, i32 noundef %var_3, i32 noundef %var_8) local_unnamed_addr {
entry:
  %0 = load i32, ptr @var_14, align 4
  %add3 = add i32 %var_3, 1056714155
  %var_24.promoted = load i32, ptr @var_24, align 4
 br label %for.body

for.cond.cleanup: ; preds = %for.body
  store i32 %add2, ptr @var_24, align 4
  ret void

for.body:                                         ; preds = %entry, %for.body
  %i_2.011 = phi i32 [ -3247424, %entry ], [ %add5, %for.body ]
  %add2910 = phi i32 [ %var_24.promoted, %entry ], [ %add2, %for.body ]
  %add = add nsw i32 %add2910, %var_8
  %add1 = add i32 %add, %var_2
  %add2 = add i32 %add1, %0
  %div = sdiv i32 %i_2.011, 3
  %add4 = add i32 %add3, %i_2.011
  %add5 = add i32 %add4, %div
 %cmp = icmp slt i32 %add5, 19
  br i1 %cmp, label %for.body, label %for.cond.cleanup
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVluP6jYQ_jXmZbTItwTywMNhEe2RetTHavuCnNiAK2NHtmG7--srm4SEwJ5TtNr4Mt83M_7GFxGCPlilVqhYo2IzE-d4dH7191vBy1nt5Mfqd2WMQ_QVvoN1UTdKQjyKCI0R9kBKkE4Fi-giQlDqBNGBV407WP2pwDjXgrYX4bWwMcBF-Q94V8bA3nk4GFcLA3m2Niog9g3hDcLd_2OMbR6jW0S3BydrZ-Lc-QOi209Et2-M_1b8VdRvYxAq8fWvufbVv1F5C9rG5GdHOGLrpzN0mLk4LSGqEBFd3qbTCvQdNu4sEa0ALTosAMDQSll2JHpHAbENvDDKFzx768ZegVS3Hl0no-wkdYDgolwQTooiuxl8jB2m3zWHMcHyltDXNiT3ugzZGuC62BPdxgvcc-m0JIknN7ZscIYWmw5wa_SijIn6-nn5kyH2rUvthw5BSXBt1Cf9KaJ2FtweUIkfoi3xpF4mXqTaa6tABrczrkl1lmRFHA_KdjLePlUaZhSsO1up9oBoMWj_OM6-GM8VkX3uztaKk5I7IaUfNFM2-o9b9GnRC5yLwzghE2MibqNP0XZVS19BGH2wwEcgISXLOCEz7C6wUeUMiGsFzFvvTi4q-TOn9InT2oMRtTKJau_8PB0QYwnSWOOsnDdGCXtus7BsDa1XMmRnD0CAEJ1XffhCyv8TCHgVs6BT75mY3ar0l7-H6K7a0NdnkSJa6B2dY0KydXvU17CL9bCtr8jMAqjY5H6x7lIrJsTZ4k5PWhH8QP4o3M_d0F-6uVWNDe_jpa8I7rDXQr4DkWmtCSlH1nSSyRNr0pnjkanUl2wZUqMz7VY5WbN7Vv6ElXWsPeoOUDwB9CpJfenPLFo0pzab6tQIJo7ss2yk6olrD5p0kDTzuCWmg3d74ouzcSZXTFasEjO1ImVFMF_iks-Oq6ZZNrTZq4ZzvucEV7VqlsuG7GuOS1UvZ3pFMWV4iRleME75nOIC43JBCCX1kpEacaxOQpu5MZdTukFnOoSzWpWcldUsRxryA4BSq94hTyJK03vArxLmpT4fAuLY6BDDwBJ1NPnl8Mf31x-o2Dw5vdNenL4Cnt39s7M3q8mNr-PxXM8bd0o3krn0n5fWu39UExHd5kgDotucyX8BAAD__0r4bls">