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).