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

    <tr>
        <th>Summary</th>
        <td>
            [LICM] Missed optimization: var_1 + var_6 + var_5 / var_6
        </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 in the code below, in fact` var_1 + var_6 + var_5 / var_6` is a loop invariant, but clang just optimized `var_1 + var_6` , `var_5 / var_6` as loop invariants respectively:
https://godbolt.org/z/nvcGz4cqj
```C
extern int var_23;
void test(int var_1, int var_4, int var_5, int var_6) {
    for (int i_3 = var_1 - 1277502689; i_3 < var_4 + 19; i_3 += 4) 
    {
 var_23 += var_1;
        var_23 += var_6 + var_5 / var_6;

 i_3+=i_3/3;
    }
}
```

Clang16 -O3:
```
entry:
 %sub = add nsw i32 %var_1, -1277502689
  %add = add nsw i32 %var_4, 19
 %cmp13 = icmp slt i32 %sub, %add
  br i1 %cmp13, label %for.body.lr.ph, label %for.cond.cleanup

for.body.lr.ph: ; preds = %entry
  %var_23.promoted = load i32, ptr @var_23, align 4
  %div = sdiv i32 %var_5, %var_6
  %add2 = add i32 %var_6, %var_1
 br label %for.body

for.cond.for.cond.cleanup_crit_edge: ; preds = %for.body
  store i32 %add3, ptr @var_23, align 4
  br label %for.cond.cleanup

for.cond.cleanup:                                 ; preds = %for.cond.for.cond.cleanup_crit_edge, %entry
  ret void

for.body:                                         ; preds = %for.body.lr.ph, %for.body
  %i_3.015 = phi i32 [ %sub, %for.body.lr.ph ], [ %add6, %for.body ]
  %add31214 = phi i32 [ %var_23.promoted, %for.body.lr.ph ], [ %add3, %for.body ]
  %add1 = add i32 %add2, %add31214
  %add3 = add i32 %add1, %div
  %div4 = sdiv i32 %i_3.015, 3
  %add5 = add i32 %i_3.015, 4
  %add6 = add i32 %add5, %div4
 %cmp = icmp slt i32 %add6, %add
  br i1 %cmp, label %for.body, label %for.cond.for.cond.cleanup_crit_edge
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVlFv6ygT_TXkZZQIg3HiBz80ifJ9V9qrfd59ibAhCRUxXsDp3v76FdhJbNftrVWpwMycOZwZCNw5da6lLBDbIrZf8NZfjC3-_oul2aI04lfxf6m1QWQHP6A2XlVSgL9wD6oGf5FQGSGhlNq8BR9Vw4lXHmUYbtweE0BkG0fZY8QAkUO3FtyUAw7amAZUfeNW8doHoLL1UGlen-G1dR5M49VVvUsBKMMT5IASQnrLBJ-7CboDK10jK69uUv9C9AXhPcIvF-8bF2bkgMjhbERptF8Ze0bk8I7Iob5V_3tPq39eO3eU4e5v183lv17aGlTtY2pCEd12lptRArx0HpHN3Zx0WnWTdDhhw0mGSA5o3QMBAJyMhR5HHSkguu91XkJC1muGSbbJEd321l2XIGqVPNfJNgSmEf0B_czTbeDu1vGlAxLh--gzX-F7XB-tjrQLiYMDHeGi9b53fgzuKg9BdqEtkgyWf9JH9SaOsvb2WVpAhLm2jGpxIaB2b6AoCcuPYiwH8vWEEGHB-5OoWLUkf2aork3SVURV1wac9nd315axPyPeHb20oJJHXLBrXkodVk7GrsLRW2m7ai4fTJWpxarSktdtM9RlEkZfIBS8sVK4SAsR1uny3F9XxVVjzdV42e1VGy4C85C38RZQivuOJjvgWp1rSAcQQt1imAuDgT6s33LXBiNJyUPTgX828E96_9J-FGW646jGVJZjZZU_SnGWszKMsQCcN1beyXAh6Hf2PiX3VVlGNvo4RJ9-s4x_t9NOv1GJrfQQ7p-5NvkOjy_5jFt0RlZEmDrSFU5YDGsuqtOYbcenYgwGiO2joXPjQmQTv-gx6iiakCSdSzJp8G8mpL9NmExbOLT185BHPhOKMxFJHyHUbXyi0g9HqhcyBNAxMJsCD1wnHLIZDuzJIR1dZrNX2aAan9xlszfZ_B32RS-PL_WFKKjIac4XskiyPMEMr_P14lIwSassTcWG0E2WpbIUpcwznFYnchKnDVmogmBC8QZTvElytl7lOTvlm1Mu8IaSE8YoxfLKlV5pfbuGn_uFcq6VRZbSNVlEzi6-jQip5RtEIyIkPJVsEWKWZXt2KMVaOe-eKF55HR9Vf_zY_URsDz-Vc1LcHzLcK1OHE_iNV9KitbqYPE-Uv7TlqjJXRA4hZ_9v2VjzKiuPyCEydYgc4k7-CwAA__8Q4MHq">