<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/75331>75331</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
missed optimization: redundant operations in loop are not optimized away
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
k-arrows
</td>
</tr>
</table>
<pre>
Test case:
https://godbolt.org/z/qvd3qfYEx
```cpp
int bar(int a, unsigned int k) {
int j = a;
for (unsigned int i = 0; i < k; i++) {
j += j;
j -= a;
}
return j;
}
int baz(int a, unsigned int k) {
int j = a;
for (unsigned int i = 0; i < k; i++) {
j += a;
j -= a;
}
return j;
}
```
GCC can optimize both `bar` and `baz`, but Clang fails to optimize `bar`. I made this example based on the function `foo` of the test program below.
https://github.com/gcc-mirror/gcc/blob/master/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-98.c
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMU81u2zAMfhr5QthwqMRODj40yTzsvsuOkkUnamXJleSmzdMPstc0HYaddhhgwORHfqT4J0LQJ0vUsM2ebY6ZmOLZ-eYpF967S8ikU2_NdwoROhGI8QdWHln5cI5xDEnDlmF7cko6EwvnTwzbK8P2-UXx5_7Hl9fFnVXl8nXjuCDaRpDCM9wmSTA8wGTnpyhIyBPDHbB6v3jDjD0C40cQjN_Q3nlguP3E1LNXyfh-Fg_wNIsM9_P3KSqkmLhPhMe7sAnOf8_F6uO76ClO3t5Rbrb74q7_T3Hi3xT3PsX7Wr8eDtAJC26MetBXAuniGVhVpulWJQirFu2aiHgAOUU4GGFP0AttAkT3wb3RCvgGg1AE8awD0KsYRkMgRSAFzkI8E_ST7aJ2NpF651Iu18-WmNZ19O7kxQCSjLsUf9xaHc-TLDo3JKXr8kF77_yiMGylcZJhO4gQ6QNNwcOkIy1IodLKR0-UhyAYtiGIvPeU77ZFl6mGqx3fiYyaVV3iul7xzTY7N1VfcSwrLnDV40ZSJ9fU10rsZCl7yetMN1giX-GKr3CNfFvU3baveoX1pqyq3XbH1iUNQpvCmJchHV6mQ5ioqTecrzIjJJkw3zSipQvMRoaYTtw3iZPL6RTYujQ6xPARJepoqBl0mDu9zEWkNjP-AJ7UZJWwEdxIfoYDaAvGuRGEJ7Au3oapQFzEWzZ50_yl7ynxr18-evdIXWTYzs8NDNu5nJ8BAAD__2ewXNM">