https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121492
Bug ID: 121492
Summary: union/struct copy should be able to optimized without
SRA when it comes to a loop
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: pinskia at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
CC: unassigned at gcc dot gnu.org
Blocks: 121364
Target Milestone: ---
Testcase from PR 32964 (note PR 25500 has the same pattern):
```
union A
{
float a;
};
float t(float a)
{
union A a1, a2, a3;
a1.a = a;
for(int i =0;i<100;i++)
{
a2 = a1;
a2.a += a;
a1 = a2;
}
a3 = a1;
return a3.a;
}
```
We should be able to optimize away the 3 unions even with SRA turned off.
Currently we have this in the inner loop:
```
a2 = a1;
_1 = a2.a;
_2 = _1 + a_6(D);
a2.a = _2;
a1 = a2;
```
So the load from a2.a could become a load from a1.a. That will get rid of one
copy.
And then the copy `a1 = a2` could become just a store `a1.a = _2` That will get
rid of another copy.
And then LIM will be able to do the rest.
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121364
[Bug 121364] [meta-bug] copy prop for aggregates