From becb7a366039fe2738d56017cfe9eac74a5512fd Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 8 Dec 2017 08:22:08 +0000 Subject: [PATCH] re PR tree-optimization/81303 (410.bwaves regression caused by r249919) 2017-12-08 Richard Biener PR tree-optimization/81303 * gfortran.dg/pr81303.f: New testcase. * gfortran.dg/vect/pr81303.f: Likewise. From-SVN: r255499 --- gcc/testsuite/ChangeLog | 6 +++ gcc/testsuite/gfortran.dg/pr81303.f | 44 +++++++++++++++++++++ gcc/testsuite/gfortran.dg/vect/pr81303.f | 50 ++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/pr81303.f create mode 100644 gcc/testsuite/gfortran.dg/vect/pr81303.f diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 258c6d03fe4..3b1a7e29111 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-12-08 Richard Biener + + PR tree-optimization/81303 + * gfortran.dg/pr81303.f: New testcase. + * gfortran.dg/vect/pr81303.f: Likewise. + 2017-12-08 Julia Koval * gcc.target/i386/avx512f-vnni-1.c: Add checks for vdpdwssds. diff --git a/gcc/testsuite/gfortran.dg/pr81303.f b/gcc/testsuite/gfortran.dg/pr81303.f new file mode 100644 index 00000000000..f83a859d8ff --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr81303.f @@ -0,0 +1,44 @@ +! { dg-do compile } +! { 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) + + 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 + y(l,i,j,k)=0.0d0 + do m=1,nb + y(l,i,j,k)=y(l,i,j,k)+ + 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 + enddo + enddo + enddo + enddo + return + end + +! { dg-final { scan-tree-dump-times "is interchanged" 1 "linterchange" } } diff --git a/gcc/testsuite/gfortran.dg/vect/pr81303.f b/gcc/testsuite/gfortran.dg/vect/pr81303.f new file mode 100644 index 00000000000..16deb7d38d2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/vect/pr81303.f @@ -0,0 +1,50 @@ +! { dg-do compile } +! { dg-require-effective-target vect_cond_mixed } +! { dg-require-effective-target vect_double } +! { dg-additional-options "-O3 -ffast-math -floop-interchange -fdump-tree-linterchange-details" } +! vect_cond_mixed lies on x86, we cannot do vcond[_eq]v2div2df +! { dg-additional-options "-msse4.1" { target { x86_64-*-* i?86-*-* } } } + + 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) + + 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 + y(l,i,j,k)=0.0d0 + do m=1,nb + y(l,i,j,k)=y(l,i,j,k)+ + 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 + enddo + enddo + enddo + enddo + return + end + +! verify we can vectorize the inner loop after interchange +! { dg-final { scan-tree-dump-times "is interchanged" 1 "linterchange" } } +! { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } -- 2.30.2