The following program does not vectorize. With Intel's ifort one gets the message: PERMUTED LOOP WAS VECTORIZED while GCC just prints: test.f90:6: note: not vectorized: data ref analysis failed D.1566_33 = *iz_32(D)[D.1565_31]; test.f90:7: note: not vectorized: data ref analysis failed D.1566_33 = *iz_32(D)[D.1565_31]; test.f90:2: note: vectorized 0 loops in function. In case of GCC, it does not depend on the loop order - permuting does not change anything. Also it is independent of the patch to PR 49957. ! From Polyhedron's ac.f90, line 746 SUBROUTINE SUSCEP(L,Iz,Dsus) INTEGER L , Iz(L,L) , iznum DOUBLE PRECISION Dsus iznum = 0 DO iy = 1 , L DO ix = 1 , L iznum = iznum + Iz(iy,ix) ENDDO ENDDO Dsus = DBLE(iznum) Dsus = Dsus*Dsus Dsus = Dsus/(L*L) END
Well, that's because the evolution of D.1565_31 is {{(stride.2_11 + offset.3_21) + 1, +, 1}_1, +, stride.2_11}_2 the loop needs interchange to be vectorized, but that doesn't work either (no idea for the reason - the .graphite dump isn't very informative here, well, maybe it runs into the exactly same issue and already gives up?) Sebastian? Confirmed anyway. Supposed to be vectorized with -floop-interchange.
Link to vectorizer missed-optimization meta-bug.