aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2017-06-24 07:07:56 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2017-06-24 07:07:56 +0000
commite56e3fda6092548f3cd5336d131b412be986b1e6 (patch)
tree2c28733ee096cbdb641e42b511b18f7c28205330 /gcc
parentef5b7d19b688bb92178f41f504133f0ee51bffc6 (diff)
downloadgcc-e56e3fda6092548f3cd5336d131b412be986b1e6.zip
gcc-e56e3fda6092548f3cd5336d131b412be986b1e6.tar.gz
gcc-e56e3fda6092548f3cd5336d131b412be986b1e6.tar.bz2
re PR fortran/52473 (CSHIFT slow - inline it?)
2017-06-24 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/52473 * Makefile.am: Add i_cshift1a_c. Add rules to generate files from cshift1a.m4. * Makefile.in: Regenerated. * m4/cshift1a.m4: New file. * m4/cshift.m4 (cshift1): Split up inner loop by removing condition. Use memcpy where possible. Call helper functions based on dtype. * libgfortran.h: Add prototypes for cshift1_16_c10, cshift1_16_c16, cshift1_16_c4, cshift1_16_c8, cshift1_16_i1, cshift1_16_i16, cshift1_16_i2, cshift1_16_i4, cshift1_16_i8, cshift1_16_r10, cshift1_16_r16, cshift1_16_r4, cshift1_16_r8, cshift1_4_c10, cshift1_4_c16, cshift1_4_c4, cshift1_4_c8, cshift1_4_i1, cshift1_4_i16, cshift1_4_i2, cshift1_4_i4, cshift1_4_i8, cshift1_4_r10, cshift1_4_r16, cshift1_4_r4, cshift1_4_r8, cshift1_8_c10, cshift1_8_c16, cshift1_8_c4, cshift1_8_c8, cshift1_8_i1, cshift1_8_i16, cshift1_8_i2, cshift1_8_i4, cshift1_8_i8, cshift1_8_r10, cshift1_8_r16, cshift1_8_r4 and cshift1_8_r8. * generated/cshift1_16_c10.c: New file, generated from cshift1a.m4. * generated/cshift1_16_c16.c: New file, generated from cshift1a.m4. * generated/cshift1_16_c4.c: New file, generated from cshift1a.m4. * generated/cshift1_16_c8.c: New file, generated from cshift1a.m4. * generated/cshift1_16_i1.c: New file, generated from cshift1a.m4. * generated/cshift1_16_i16.c: New file, generated from cshift1a.m4. * generated/cshift1_16_i2.c: New file, generated from cshift1a.m4. * generated/cshift1_16_i4.c: New file, generated from cshift1a.m4. * generated/cshift1_16_i8.c: New file, generated from cshift1a.m4. * generated/cshift1_16_r10.c: New file, generated from cshift1a.m4. * generated/cshift1_16_r16.c: New file, generated from cshift1a.m4. * generated/cshift1_16_r4.c: New file, generated from cshift1a.m4. * generated/cshift1_16_r8.c: New file, generated from cshift1a.m4. * generated/cshift1_4_c10.c: New file, generated from cshift1a.m4. * generated/cshift1_4_c16.c: New file, generated from cshift1a.m4. * generated/cshift1_4_c4.c: New file, generated from cshift1a.m4. * generated/cshift1_4_c8.c: New file, generated from cshift1a.m4. * generated/cshift1_4_i1.c: New file, generated from cshift1a.m4. * generated/cshift1_4_i16.c: New file, generated from cshift1a.m4. * generated/cshift1_4_i2.c: New file, generated from cshift1a.m4. * generated/cshift1_4_i4.c: New file, generated from cshift1a.m4. * generated/cshift1_4_i8.c: New file, generated from cshift1a.m4. * generated/cshift1_4_r10.c: New file, generated from cshift1a.m4. * generated/cshift1_4_r16.c: New file, generated from cshift1a.m4. * generated/cshift1_4_r4.c: New file, generated from cshift1a.m4. * generated/cshift1_4_r8.c: New file, generated from cshift1a.m4. * generated/cshift1_8_c10.c: New file, generated from cshift1a.m4. * generated/cshift1_8_c16.c: New file, generated from cshift1a.m4. * generated/cshift1_8_c4.c: New file, generated from cshift1a.m4. * generated/cshift1_8_c8.c: New file, generated from cshift1a.m4. * generated/cshift1_8_i1.c: New file, generated from cshift1a.m4. * generated/cshift1_8_i16.c: New file, generated from cshift1a.m4. * generated/cshift1_8_i2.c: New file, generated from cshift1a.m4. * generated/cshift1_8_i4.c: New file, generated from cshift1a.m4. * generated/cshift1_8_i8.c: New file, generated from cshift1a.m4. * generated/cshift1_8_r10.c: New file, generated from cshift1a.m4. * generated/cshift1_8_r16.c: New file, generated from cshift1a.m4. * generated/cshift1_8_r4.c: New file, generated from cshift1a.m4. * generated/cshift1_8_r8.c: New file, generated from cshift1a.m4. 2017-06-24 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/52473 * gfortran.dg/cshift_2.f90: New test. From-SVN: r249620
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/cshift_2.f90152
2 files changed, 157 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c9d75b7..eefa2c4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-24 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/52473
+ * gfortran.dg/cshift_2.f90: New test.
+
2017-06-23 Jim Wilson <jim.wilson@linaro.org>
PR middle-end/79794
diff --git a/gcc/testsuite/gfortran.dg/cshift_2.f90 b/gcc/testsuite/gfortran.dg/cshift_2.f90
new file mode 100644
index 0000000..66a6e2b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/cshift_2.f90
@@ -0,0 +1,152 @@
+! { dg-do run }
+! Test CSHIFT with array argument for shift
+module rnd
+ implicit none
+contains
+ subroutine fill(a,n)
+ integer, intent(out), dimension(:,:) :: a
+ integer, intent(in) :: n
+ real, dimension(size(a,1),size(a,2)) :: r
+ call random_number(r)
+ a = int(2*n*r-n)
+ end subroutine fill
+end module rnd
+
+module csh
+ implicit none
+contains
+ subroutine emul_cshift(a,sh_in,dim, c)
+ integer, dimension(:,:,:), intent(in) :: a
+ integer, dimension(:,:,:), intent(out) :: c
+ integer, dimension(:,:), intent(in) :: sh_in
+ integer, intent(in) :: dim
+ integer :: sh, rsh
+ integer :: s1, s2, s3, n, i
+ integer :: n1, n2, n3
+ n1 = size(a,1)
+ n2 = size(a,2)
+ n3 = size(a,3)
+ if (dim == 1) then
+ n = n1
+ do s2=1,n2
+ do s3=1,n3
+ sh = modulo(sh_in(s2,s3), n)
+ rsh = n - sh
+ do i=1,rsh
+ c(i,s2,s3) = a(i+sh,s2,s3)
+ end do
+ do i=rsh+1,n
+ c(i,s2,s3) = a(i-rsh,s2,s3)
+ end do
+ end do
+ end do
+ else if (dim == 2) then
+ n = n2
+ do s3=1,n3
+ do s1=1,n1
+ sh = modulo(sh_in(s1,s3),n)
+ rsh = n - sh
+ do i=1,rsh
+ c(s1,i,s3) = a(s1,i+sh,s3)
+ end do
+ do i=rsh+1,n
+ c(s1,i,s3) = a(s1,i-rsh,s3)
+ end do
+ end do
+ end do
+
+ else if (dim == 3) then
+ n = n3
+ do s2=1,n2
+ do s1=1,n1
+ sh = modulo(sh_in(s1,s2),n)
+ rsh = n - sh
+ do i=1,rsh
+ c(s1,s2,i) = a(s1,s2,i+sh)
+ end do
+ do i=rsh+1,n
+ c(s1,s2,i) = a(s1,s2,i-rsh)
+ end do
+ end do
+ end do
+ else
+ stop "Illegal dim"
+ end if
+ end subroutine emul_cshift
+end module csh
+program main
+ use csh
+ use rnd
+ implicit none
+ integer, parameter :: n1=30,n2=40,n3=50
+ integer, dimension(n1,n2,n3) :: a, b,c
+ integer :: s1, s2, s3
+ integer :: dim
+ integer, dimension(:,:), allocatable :: sh1, sh2, sh3
+ integer, dimension(:), allocatable :: sh_shift
+ integer :: sh, rsh
+ integer :: i,j,k,v
+ type t
+ integer :: i1, i2, i3
+ end type t
+ type(t), dimension(n1,n2,n3) :: ta, tb
+
+ v = 1
+ do k=1,n3
+ do j=1,n2
+ do i=1,n1
+ a(i,j,k) = v
+ v = v + 1
+ end do
+ end do
+ end do
+
+ ta%i1 = a
+ ta%i2 = a+a
+ ta%i3 = a+a+a
+ allocate(sh1(n2,n3))
+ allocate(sh2(n1,n3))
+ allocate(sh3(n1,n2))
+
+ call fill(sh1,10)
+ call fill(sh2,10)
+ call fill(sh3,10)
+
+ b = cshift(a,sh1,1)
+ call emul_cshift(a,sh1,1,c)
+ if (any(b /= c)) then
+ print *,b
+ print *,c
+ call abort
+ end if
+ tb = cshift(ta,sh1,1)
+ if (any(tb%i1 /= c)) call abort
+
+ b = cshift(a,sh2,2)
+ call emul_cshift(a,sh2,2,c)
+ if (any(b /= c)) call abort
+ tb = cshift(ta,sh2,2)
+ if (any (tb%i2 /= c*2)) call abort
+
+ b = cshift(a,sh3,3)
+ call emul_cshift(a,sh3,3,c)
+ if (any(b /= c)) call abort
+ tb = cshift(ta,sh3,3)
+ if (any(tb%i3 /= c*3)) call abort
+
+ b = -42
+ c = -42
+ b(1:n1:2,:,:) = cshift(a(1:n1/2,:,:),sh1,1)
+ call emul_cshift(a(1:n1/2,:,:), sh1, 1, c(1:n1:2,:,:))
+ if (any(b /= c)) call abort
+
+ tb%i1 = -42
+ tb%i2 = -2*42
+ tb%i3 = -3*42
+ tb(1:n1:2,:,:) = cshift(ta(1:n1/2,:,:),sh1,1)
+ if (any(tb%i1 /= b)) call abort
+ if (any(tb%i2 /= 2*b)) call abort
+ if (any(tb%i3 /= 3*b)) call abort
+
+9000 format (99(3(I3,1X),2X))
+end program main