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

    <tr>
        <th>Summary</th>
        <td>
            [Reassociate] Missed optimization of expression of addition
        </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>
    Test code: https://godbolt.org/z/3v5sbe3Ej
```c++
int test()
{
    int a,b,c,d,e,f,g;
    cin>>a>>b>>c>>d>>g;
    e=a+b+c;  
    f=d+b+c; //can be replaced with the value at line 5
    cout<<e<<f;
    return 0;
}
```

IR at -O1:
```
  %0 = load i32, ptr %a, align 4
  %1 = load i32, ptr %b, align 4
  %2 = load i32, ptr %c, align 4
 %add = add i32 %2, %1
  %add5 = add i32 %add, %0
  %3 = load i32, ptr %d, align 4
  %add6 = add i32 %2, %1
  %add7 = add i32 %add6, %3
```

We can easily notice that `b+c` at line 6 in the test code can be replaced with the value at line 5, but the intermediate code generated by LLVM at the optimization level of O1 does not.
I noticed that under the optimization level of O1, `ReassociatePass` changed the order of addition calculation in a+b+c in an attempt to optimize, but the final generated ir only changed the order of addition calculation, whether it missed the value substitution step.
In addition, if we perform the `EarlyCSEPass` after the `ReassociatePass`, then this missed optimization can be done without changing the optimization level.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVVGPozYQ_jWTl9FGxAYSHnjYkESqdKerrlWr9s3gIfjk2BEedpv79ZWB7GX3sqeVUEYw33zzzccQqxDM0RGVkG0h2y3UwJ3vy3__ydJ8UXt9Kf-kwNh4TSAfsWM-B5CPIA4gDkeva2956fsjiMN3EAf5lIWa5P4bJDtIHiFPpqsBsY3X-NQ4RqbAIDYgihm5npOIiBGgQFQ1iKoBUWkQFYGoWhDVEeQNsjEO5B7kXk2hnkIzBT2F1yUEcqdAbGsQ2wbkFvFHrgW507e5ac5GOawJezpb1ZDGZ8Mdckf4pOxAqBitcYTZjS4_MMgKZEVTaF9p6ImH3mHy8hDWuzeOzbfj729fY4-HL6vo_D0YIogsQZA7tF5pNFKAqPDMfUxEK1FZc3SY3uBX7-Hr-3jxHr75GR-7aj0WxGikGBkiMHa-YVVaZ29xSusZeTuffK-_vq9XaZ1_UMH6joJ8hspfvJi_CeNukArGXtB5Ng0hd4oR8mRaojx52Y8cjRvXhq-fFH54s0SF9cBjyjim_kTaKKaJ5UiOesWksb7gp09_fY6FEerPbE7mu2LjHVp6Iou-xS8r1J5C1LucF2zWrifxg9PU_5Jg9CZPvpIKwTdRye8qhDhs0yl3HIkIfR95fBudNSNFo2wz2InOOHz5Dscbh4qZTmdG9tfOdDt5a5yyN9OaHr2zl4_3jGTPHXFHPRrGkwlhLpv8DkMd2PAw1gWm89Uf90IXKUyLz4Rn6lvfn8ZyyJO96u2l-mN_NUK1PJt416jIwx3FhTDhquSV3fNuaO9o3As_8DSpccd3Xs5yoUupC1moBZWrfFMUQspNtuhKlVKWtbIt2jpdNZtMJfUmr8UqSet2s0nVwpQiETJZi1WyToo0W26SdSZIb5IiXYt6TZAmdFLGLq19OsW__IUJYaAyl0WxXlhVkw3jKSKEo2cckyBEPFT6MtY81MMxQJpYEzj8YGHDdjx-bjyCbIef71jiW6T_zj2FMN9d38pi6G355nAy3A31svEnEIfYbQ4P595_o4ZBHEaNAcRhnOH_AAAA__9Ioxuv">