https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66142
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
On this testcase, I believe it is most important to change FRE and SRA.
Without -fopenmp, we have before fre2:
MEM[(struct ray_ *)&ray] = 1.0e+0;
MEM[(struct ray_ *)&ray + 4B] = _8;
ray.dir.x = x_10;
ray.dir.y = y_11;
...
_23 = ray.org.x;
_26 = ray.org.y;
_29 = ray.dir.x;
_31 = ray.dir.y;
and fre2 optimizes this into the values stored in there. With -fopenmp, we
have the SIMD_LANE based array references:
_12 = GOMP_SIMD_LANE (simduid.0_11(D));
_9 = &D.2881[_12].org;
MEM[(struct vec_ *)_9] = 1.0e+0;
MEM[(struct vec_ *)_9 + 4B] = _8;
D.2881[_12].dir.x = x_13;
D.2881[_12].dir.y = y_14;
...
_26 = MEM[(const struct Ray *)&D.2881][_12].org.x;
_29 = MEM[(const struct Ray *)&D.2881][_12].org.y;
_32 = MEM[(const struct Ray *)&D.2881][_12].dir.x;
_34 = MEM[(const struct Ray *)&D.2881][_12].dir.y;
that fre2 isn't able to optimize. Doing something here on the vectorizer side
is too late, we really need to scalarize those or remove completely (through
fre2).