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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Opportunities to improve the efficiency of loop
        </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>
    Hi, I've noticed that `InstCombine` seems to have missed an optimization opportunity to improve the efficiency of the loop code:

https://godbolt.org/z/YExefEeTo
```c
extern int var_23;
extern int var_24;
void test(int var_1, int var_4, int var_6) {
    for (int i_3 = var_1 - 1277502689; i_3 < var_4 + 19; i_3 += 4) 
 {
        var_23 += var_1;
        var_24 += var_1;
        var_23 += var_6;

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

Clang -O3:
```
for.body:                                         ; preds = %for.body.preheader, %for.body
  ...
  %add31115 = phi i32 [ %add3, %for.body ], [ %var_23.promoted, %for.body.preheader ]
  ...
  %add1 = add nsw i32 %add31115, %var_1
  ...
  %add3 = add nsw i32 %add1, %var_6
  ...
```

Expected results:
```
for.body.preheader: ; preds = %entry
  ...
  %0 = add i32 %var_1, %var_6
  ...

for.body: ; preds = %for.body.preheader, %for.body
  ...
  %add51317 = phi i32 [ %add5, %for.body ], [ %var_23.promoted, %for.body.preheader ]
  ...
 %add5 = add i32 %add51317, %0
  ...
```

In fact, for the following code Clang will output the expected result:
```c
void test2(int var_1, int var_4, int var_6) {
    for (int i_3 = var_1 - 1277502689; i_3 < var_4 + 19; i_3 += 4) 
    {
        var_23 += -var_1;
        var_24 += var_1;
        var_23 += -var_6;

 i_3+=i_3/3;
    }
}
```
```
for.body.preheader: ; preds = %entry
  ...
  %0 = add i32 %var_1, %var_6
  ...

for.body:                                         ; preds = %for.body.preheader, %for.body
  ...
  %add51317 = phi i32 [ %add5, %for.body ], [ %var_23.promoted, %for.body.preheader ]
  ...
 %add5 = sub i32 %add51317, %0
  ...
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVktvpDgQ_jXmUmpkbB7NgcN0Oq3NaS57mb1EBorGK8DINp1kfv3KPPqV7plZbVYTFKWx66uviir7Uwlj5L5DzEi0IdHWE4Otlc7--haFsZer8i37QxL2AE-EJQeETllZYAm2FhZITJ86Yx9Um8sOSUzBILYGrIJaHBBaaQyWIDpQvZWt_C6sVG7RK22HTto3B5Vtr9UBwdYIWFWykNgVb6CqcadRqodClUj4F0K3hM7_a2t74_bYjrDdXpW5aqyv9J6w3XfCdt8eX7F6xD_V7BTT6a-Y1vhqUXcgOwsHoZ8ZJ3xz2xIeLQclS7BoLGHrxRy42iyL8HwRE5YCSWZfAIBKaZhd5TMHwrcTBawgYEkSURavU8I3s_Vh4gTCNhCc9tnGOYYj-0R9EcQ90xct0ClNfgsT_gLmgic-Yi6R8plPqPFlxy-oSLKdfY4vSzfOuR4a0e1h9ZWfOn0Jq5T23Ykk_Bj3p48rW6-xNGO5CYsWEr_XWKMoUbumnRmWvH3fX14Ji0RZ8iAIopGmryVIzoBEm8V2RQIk2o5bE2IqpN9r1SqL5RX4lMrodi9-MMYWZQmdeZnin_KaKac-3v2COwzBmXf8zvtmsx5feywslqDRDI01P-vZWbn5l_ddwc7qO5Wnx6TnhI_X7n7G747LBx6DKOBBcucYRP_nMZhDXJdjSWlmo7_Wv6cOKlFY5-RkySltpZpGvchuP8otTNfxRTYNqMH2g50E-rLv79teXGkl-2RiOerRD3Vu9VGCubqpmP9RKj_l9foNavwprqEZ8n9_Db0y42XKU-FhFsRpQCO-ptyrs2qNIuYY50ESYVLkLI7iUHCe5rmIqzT1ZMYo43RNOU0DSrmP8TpKAy4qSsNAxEhCiq2Qjd80h9YNQ540ZsAsDnkSeY3IsTHLoKczB1rlw96QkDbSWHNys9I240h4Pt9FW_h6HN0kmh8Pb25w8wbdZFeTmrT1kPuFagnbuXjzz6rX6m90irQbczaE7ca0_wkAAP__fvzYng">