https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99956
Bug ID: 99956 Summary: loop interchange fails when altering bwaves inner loop Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org Target Milestone: --- When scheduling an additional DSE pass the bwaves kernel (gfortran.dg/pr81303.f) is no longer interchanged because prepare_perfect_loop_nest tries to use a too outer loop where we fail to compute access functions for the data references. If artificially restricting the nest to only cover the two innermost loops the interchange still works. A modified testcase simulating the effect of the DSE is provided below: ! { dg-options "-O3 -ffast-math -floop-interchange -fdump-tree-linterchange-details" } subroutine mat_times_vec(y,x,a,axp,ayp,azp,axm,aym,azm, $ nb,nx,ny,nz) implicit none integer nb,nx,ny,nz,i,j,k,m,l,kit,im1,ip1,jm1,jp1,km1,kp1 real*8 y(nb,nx,ny,nz),x(nb,nx,ny,nz),tem real*8 a(nb,nb,nx,ny,nz), 1 axp(nb,nb,nx,ny,nz),ayp(nb,nb,nx,ny,nz),azp(nb,nb,nx,ny,nz), 2 axm(nb,nb,nx,ny,nz),aym(nb,nb,nx,ny,nz),azm(nb,nb,nx,ny,nz) do k=1,nz km1=mod(k+nz-2,nz)+1 kp1=mod(k,nz)+1 do j=1,ny jm1=mod(j+ny-2,ny)+1 jp1=mod(j,ny)+1 do i=1,nx im1=mod(i+nx-2,nx)+1 ip1=mod(i,nx)+1 do l=1,nb tem=0.0 do m=1,nb tem=tem+ 1 a(l,m,i,j,k)*x(m,i,j,k)+ 2 axp(l,m,i,j,k)*x(m,ip1,j,k)+ 3 ayp(l,m,i,j,k)*x(m,i,jp1,k)+ 4 azp(l,m,i,j,k)*x(m,i,j,kp1)+ 5 axm(l,m,i,j,k)*x(m,im1,j,k)+ 6 aym(l,m,i,j,k)*x(m,i,jm1,k)+ 7 azm(l,m,i,j,k)*x(m,i,j,km1) enddo y(l,i,j,k)=tem enddo enddo enddo enddo return end ! { dg-final { scan-tree-dump-times "is interchanged" 1 "linterchange" } }