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