aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2008-04-13 20:15:58 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2008-04-13 20:15:58 +0000
commitc7d0f4d5fabc279dd81330ebffdf037b31420706 (patch)
treee022b93b7ac1c858cd02bc0f837fdaae49b136ff /gcc
parent92d4508a7db153423b0572047fa6947af569d4b6 (diff)
downloadgcc-c7d0f4d5fabc279dd81330ebffdf037b31420706.zip
gcc-c7d0f4d5fabc279dd81330ebffdf037b31420706.tar.gz
gcc-c7d0f4d5fabc279dd81330ebffdf037b31420706.tar.bz2
re PR libfortran/32972 (performance of pack/unpack)
2008-04-13 Thomas Koenig <tkoenig@gcc.gnu.org> Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> PR libfortran/32972 PR libfortran/32512 configure.ac: Add test for uintptr_t. configure: Regenerated. config.h.in: Regenerated. * libgfortran.h: GFC_DTYPE_DERIVED_1: New macro. GFC_DTYPE_DERIVED_2: New macro. GFC_DTYPE_DERIVED_4: New macro. GFC_DTYPE_DERIVED_8: New macro. GFC_DTYPE_DERIVED_16: New macro. GFC_UNALIGNED_2: New macro. GFC_UNALIGNED_4: New macro. GFC_UNALIGNED_8: New macro. GFC_UNALIGNED_16: New macro. intptr_t: Define if we don't have it. uintptr_t: Likewise. * runtime/backtrace.c (show_backtrace): Use intptr_t. * intrinsics/signal.c (signal_sub): Likewise. (signal_sub_int): Likewise. (alarm_sub_int_i4): Likewise. * intrinsics/spread_generic.c (spread): Use the integer routines for handling derived types of sizes 1, 2, 4, 8 and 16 if the alignment of all pointers is correct. (spread_scalar): Likewise. * intrinsics/pack_generic.c (pack): Likewise. Use GFD_DTYPE_TYPE_SIZE to avoid nested switch statements. * intrinsics/unpack_generic.c (unpack1): Likewise. (unpack0): Likewise. * runtime/in_pack_generic.c (internal_pack): Likewise. * runtime/in_unpack_generic.c (internal_unpack): Likewise. 2008-04-13 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/32972 PR libfortran/32512 * gfortran.dg/internal_pack_1.f90: Add test for derived type. * gfortran.dg/intrinsic_spread_1.f90: Likewise. * gfortran.dg/intrinsic_pack_1.f90: Likewise. * gfortran.dg/intrinsic_unpack_1.f90: Likewise. Co-Authored-By: Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> From-SVN: r134245
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gfortran.dg/internal_pack_1.f9021
-rw-r--r--gcc/testsuite/gfortran.dg/intrinsic_pack_1.f9028
-rw-r--r--gcc/testsuite/gfortran.dg/intrinsic_spread_1.f9019
-rw-r--r--gcc/testsuite/gfortran.dg/intrinsic_unpack_1.f9016
5 files changed, 93 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6932bed..aaa76f5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2008-04-13 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/32972
+ PR libfortran/32512
+ * gfortran.dg/internal_pack_1.f90: Add test for derived type.
+ * gfortran.dg/intrinsic_spread_1.f90: Likewise.
+ * gfortran.dg/intrinsic_pack_1.f90: Likewise.
+ * gfortran.dg/intrinsic_unpack_1.f90: Likewise.
+
2008-04-13 Samuel Tardieu <sam@rfc1149.net>
PR ada/17985
diff --git a/gcc/testsuite/gfortran.dg/internal_pack_1.f90 b/gcc/testsuite/gfortran.dg/internal_pack_1.f90
index 6c3781b..aded78d 100644
--- a/gcc/testsuite/gfortran.dg/internal_pack_1.f90
+++ b/gcc/testsuite/gfortran.dg/internal_pack_1.f90
@@ -11,6 +11,11 @@ program main
real(kind=8), dimension(3) :: r8
complex(kind=4), dimension(3) :: c4
complex(kind=8), dimension(3) :: c8
+ type i8_t
+ sequence
+ integer(kind=8) :: v
+ end type i8_t
+ type(i8_t), dimension(3) :: d_i8
i1 = (/ -1, 1, -3 /)
call sub_i1(i1(1:3:2))
@@ -46,6 +51,10 @@ program main
if (any(real(c8) /= (/ 3.0_4, 1.0_4, 2.0_4/))) call abort
if (any(aimag(c8) /= 0._4)) call abort
+ d_i8%v = (/ -1, 1, -3 /)
+ call sub_d_i8(d_i8(1:3:2))
+ if (any(d_i8%v /= (/ 3, 1, 2 /))) call abort
+
end program main
subroutine sub_i1(i)
@@ -113,3 +122,15 @@ subroutine sub_c4(r)
r(1) = 3._4
r(2) = 2._4
end subroutine sub_c4
+
+subroutine sub_d_i8(i)
+ type i8_t
+ sequence
+ integer(kind=8) :: v
+ end type i8_t
+ type(i8_t), dimension(2) :: i
+ if (i(1)%v /= -1) call abort
+ if (i(2)%v /= -3) call abort
+ i(1)%v = 3
+ i(2)%v = 2
+end subroutine sub_d_i8
diff --git a/gcc/testsuite/gfortran.dg/intrinsic_pack_1.f90 b/gcc/testsuite/gfortran.dg/intrinsic_pack_1.f90
index e464503..22d110b 100644
--- a/gcc/testsuite/gfortran.dg/intrinsic_pack_1.f90
+++ b/gcc/testsuite/gfortran.dg/intrinsic_pack_1.f90
@@ -29,6 +29,34 @@ program main
integer(kind=8), dimension(9) :: vi8
integer(kind=8), dimension(9) :: ri8
+ type i1_t
+ integer(kind=1) :: v
+ end type i1_t
+ type(i1_t), dimension(3,3) :: d_i1
+ type(i1_t), dimension(9) :: d_vi1
+ type(i1_t), dimension(9) :: d_ri1
+
+ type i4_t
+ integer(kind=4) :: v
+ end type i4_t
+ type(i4_t), dimension(3,3) :: d_i4
+ type(i4_t), dimension(9) :: d_vi4
+ type(i4_t), dimension(9) :: d_ri4
+
+ d_vi1%v = (/(i+10,i=1,9)/)
+ d_i1%v = reshape((/1_1, -1_1, 2_1, -2_1, 3_1, -3_1, 4_1, &
+ & -4_1, 5_1/), shape(i1))
+ d_ri1 = pack(d_i1,d_i1%v>0,d_vi1)
+ if (any(d_ri1%v /= (/1_1, 2_1, 3_1, 4_1, 5_1, 16_1, 17_1, 18_1, 19_1/))) &
+ & call abort
+
+ d_vi4%v = (/(i+10,i=1,9)/)
+ d_i4%v = reshape((/1_4, -1_4, 2_4, -2_4, 3_4, -3_4, 4_4, &
+ & -4_4, 5_4/), shape(d_i4))
+ d_ri4 = pack(d_i4,d_i4%v>0,d_vi4)
+ if (any(d_ri4%v /= (/1_4, 2_4, 3_4, 4_4, 5_4, 16_4, 17_4, 18_4, 19_4/))) &
+ & call abort
+
vr4 = (/(i+10,i=1,9)/)
r4 = reshape((/1.0_4, -3.0_4, 2.1_4, -4.21_4, 1.2_4, 0.98_4, -1.2_4, &
& -7.1_4, -9.9_4, 0.3_4 /), shape(r4))
diff --git a/gcc/testsuite/gfortran.dg/intrinsic_spread_1.f90 b/gcc/testsuite/gfortran.dg/intrinsic_spread_1.f90
index 1fe09d4..04e4c57 100644
--- a/gcc/testsuite/gfortran.dg/intrinsic_spread_1.f90
+++ b/gcc/testsuite/gfortran.dg/intrinsic_spread_1.f90
@@ -25,6 +25,14 @@ program foo
complex(kind=8), dimension (10) :: c_8
complex(kind=8), dimension (2, 3) :: ac_8
complex(kind=8), dimension (2, 2, 3) :: bc_8
+ type i4_t
+ integer(kind=4) :: v
+ end type i4_t
+ type(i4_t), dimension (10) :: it_4
+ type(i4_t), dimension (2, 3) :: at_4
+ type(i4_t), dimension (2, 2, 3) :: bt_4
+ type(i4_t) :: iv_4
+
character (len=200) line1, line2, line3
a_1 = reshape ((/1_1, 2_1, 3_1, 4_1, 5_1, 6_1/), (/2, 3/))
@@ -159,6 +167,17 @@ program foo
c_8 = spread((1._8,-1._8),1,10)
if (any(c_8 /= (1._8,-1._8))) call abort
+
+ at_4%v = reshape ((/1_4, 2_4, 3_4, 4_4, 5_4, 6_4/), (/2, 3/))
+ bt_4 = spread (at_4, 1, 2)
+ if (any (bt_4%v .ne. reshape ((/1_4, 1_4, 2_4, 2_4, 3_4, 3_4, 4_4, &
+ & 4_4, 5_4, 5_4, 6_4, 6_4/), (/2, 2, 3/)))) &
+ call abort
+ iv_4%v = 123_4
+ it_4 = spread(iv_4,1,10)
+ if (any(it_4%v /= 123_4)) call abort
+
+
9000 format(12I3)
9010 format(12F7.3)
9020 format(25F7.3)
diff --git a/gcc/testsuite/gfortran.dg/intrinsic_unpack_1.f90 b/gcc/testsuite/gfortran.dg/intrinsic_unpack_1.f90
index 71cce79..47b9aef 100644
--- a/gcc/testsuite/gfortran.dg/intrinsic_unpack_1.f90
+++ b/gcc/testsuite/gfortran.dg/intrinsic_unpack_1.f90
@@ -10,6 +10,12 @@ program intrinsic_unpack
real(kind=8), dimension(3,3) :: ar8, br8
complex(kind=4), dimension(3,3) :: ac4, bc4
complex(kind=8), dimension(3,3) :: ac8, bc8
+ type i4_t
+ integer(kind=4) :: v
+ end type i4_t
+ type(i4_t), dimension(3,3) :: at4, bt4
+ type(i4_t), dimension(3) :: vt4
+
logical, dimension(3, 3) :: mask
character(len=500) line1, line2
integer i
@@ -116,4 +122,14 @@ program intrinsic_unpack
mask, ac8)
if (line1 .ne. line2) call abort
+ at4%v = reshape ((/1, 0, 0, 0, 1, 0, 0, 0, 1/), (/3, 3/));
+ vt4%v = (/2_4, 3_4, 4_4/)
+ bt4 = unpack (vt4, mask, at4)
+ if (any (bt4%v .ne. reshape ((/1, 2, 0, 3, 1, 0, 0, 0, 4/), (/3, 3/)))) &
+ call abort
+ bt4%v = -1
+ bt4 = unpack (vt4, mask, i4_t(0_4))
+ if (any (bt4%v .ne. reshape ((/0, 2, 0, 3, 0, 0, 0, 0, 4/), (/3, 3/)))) &
+ call abort
+
end program