diff options
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/zero_sized_1.f90 | 2 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 18 | ||||
-rw-r--r-- | libgfortran/generated/reshape_c10.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_c16.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_c4.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_c8.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_i16.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_i4.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_i8.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_r10.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_r16.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_r4.c | 38 | ||||
-rw-r--r-- | libgfortran/generated/reshape_r8.c | 38 | ||||
-rw-r--r-- | libgfortran/intrinsics/reshape_generic.c | 42 | ||||
-rw-r--r-- | libgfortran/m4/reshape.m4 | 42 |
16 files changed, 459 insertions, 69 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 51bceea576c..7a204603530 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-11-03 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR libfortran/27895 + * gcc/testsuite/gfortran.dg/zero_sized_1.f90: Uncomment checks + for RESHAPE. + 2006-11-02 Brooks Moses <brooks.moses@codesourcery.com> * lib/gfortran-dg.exp (gfortran-dg-test): Remove expected "In file" diff --git a/gcc/testsuite/gfortran.dg/zero_sized_1.f90 b/gcc/testsuite/gfortran.dg/zero_sized_1.f90 index c70bdddd6d7..224b2c007d3 100644 --- a/gcc/testsuite/gfortran.dg/zero_sized_1.f90 +++ b/gcc/testsuite/gfortran.dg/zero_sized_1.f90 @@ -193,5 +193,5 @@ program test call test_unpack call test_spread call test_pack -! call test_reshape + call test_reshape end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 54849e08c93..8b5eddff4ec 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,21 @@ +2006-11-03 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR libfortran/27895 + * intrinsics/reshape_generic.c (reshape_internal): Fix so that it + works correctly for zero-sized arrays. + * m4/reshape.m4: Likewise. + * generated/reshape_r16.c: Regenerate. + * generated/reshape_c4.c: Regenerate. + * generated/reshape_i4.c: Regenerate. + * generated/reshape_c16.c: Regenerate. + * generated/reshape_r10.c: Regenerate. + * generated/reshape_r8.c: Regenerate. + * generated/reshape_c10.c: Regenerate. + * generated/reshape_c8.c: Regenerate. + * generated/reshape_i8.c: Regenerate. + * generated/reshape_i16.c: Regenerate. + * generated/reshape_r4.c: Regenerate. + 2006-10-31 Thomas Koenig <Thomas.Koenig@online.de> PR libfortran/29627 diff --git a/libgfortran/generated/reshape_c10.c b/libgfortran/generated/reshape_c10.c index 7aa7f43eef6..1440e75b116 100644 --- a/libgfortran/generated/reshape_c10.c +++ b/libgfortran/generated/reshape_c10.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_c10 (gfc_array_c10 * const restrict, gfc_array_c10 * const restrict, @@ -83,12 +81,13 @@ reshape_c10 (gfc_array_c10 * const restrict ret, const GFC_COMPLEX_10 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_c10 (gfc_array_c10 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_c10 (gfc_array_c10 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_c10 (gfc_array_c10 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_c10 (gfc_array_c10 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_COMPLEX_10); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_c10 (gfc_array_c10 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_c16.c b/libgfortran/generated/reshape_c16.c index cc1fd0dec5b..2ab6111cf3c 100644 --- a/libgfortran/generated/reshape_c16.c +++ b/libgfortran/generated/reshape_c16.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_c16 (gfc_array_c16 * const restrict, gfc_array_c16 * const restrict, @@ -83,12 +81,13 @@ reshape_c16 (gfc_array_c16 * const restrict ret, const GFC_COMPLEX_16 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_c16 (gfc_array_c16 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_c16 (gfc_array_c16 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_c16 (gfc_array_c16 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_c16 (gfc_array_c16 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_COMPLEX_16); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_c16 (gfc_array_c16 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_c4.c b/libgfortran/generated/reshape_c4.c index 5e7d855be84..66b162218f6 100644 --- a/libgfortran/generated/reshape_c4.c +++ b/libgfortran/generated/reshape_c4.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_c4 (gfc_array_c4 * const restrict, gfc_array_c4 * const restrict, @@ -83,12 +81,13 @@ reshape_c4 (gfc_array_c4 * const restrict ret, const GFC_COMPLEX_4 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_c4 (gfc_array_c4 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_c4 (gfc_array_c4 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_c4 (gfc_array_c4 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_c4 (gfc_array_c4 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_COMPLEX_4); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_c4 (gfc_array_c4 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_c8.c b/libgfortran/generated/reshape_c8.c index aecacac9d16..89316539443 100644 --- a/libgfortran/generated/reshape_c8.c +++ b/libgfortran/generated/reshape_c8.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_c8 (gfc_array_c8 * const restrict, gfc_array_c8 * const restrict, @@ -83,12 +81,13 @@ reshape_c8 (gfc_array_c8 * const restrict ret, const GFC_COMPLEX_8 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_c8 (gfc_array_c8 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_c8 (gfc_array_c8 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_c8 (gfc_array_c8 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_c8 (gfc_array_c8 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_COMPLEX_8); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_c8 (gfc_array_c8 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_i16.c b/libgfortran/generated/reshape_i16.c index 0b4da5c957f..c8777cfc09b 100644 --- a/libgfortran/generated/reshape_i16.c +++ b/libgfortran/generated/reshape_i16.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_16 (gfc_array_i16 * const restrict, gfc_array_i16 * const restrict, @@ -83,12 +81,13 @@ reshape_16 (gfc_array_i16 * const restrict ret, const GFC_INTEGER_16 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_16 (gfc_array_i16 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_16 (gfc_array_i16 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_16 (gfc_array_i16 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_16 (gfc_array_i16 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_INTEGER_16); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_16 (gfc_array_i16 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_i4.c b/libgfortran/generated/reshape_i4.c index 413762e6043..f51b73096d8 100644 --- a/libgfortran/generated/reshape_i4.c +++ b/libgfortran/generated/reshape_i4.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_4 (gfc_array_i4 * const restrict, gfc_array_i4 * const restrict, @@ -83,12 +81,13 @@ reshape_4 (gfc_array_i4 * const restrict ret, const GFC_INTEGER_4 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_4 (gfc_array_i4 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_4 (gfc_array_i4 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_4 (gfc_array_i4 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_4 (gfc_array_i4 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_INTEGER_4); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_4 (gfc_array_i4 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_i8.c b/libgfortran/generated/reshape_i8.c index 0cd861a5060..463919db188 100644 --- a/libgfortran/generated/reshape_i8.c +++ b/libgfortran/generated/reshape_i8.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_8 (gfc_array_i8 * const restrict, gfc_array_i8 * const restrict, @@ -83,12 +81,13 @@ reshape_8 (gfc_array_i8 * const restrict ret, const GFC_INTEGER_8 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_8 (gfc_array_i8 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_8 (gfc_array_i8 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_8 (gfc_array_i8 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_8 (gfc_array_i8 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_INTEGER_8); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_8 (gfc_array_i8 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_r10.c b/libgfortran/generated/reshape_r10.c index 5069e45cdb1..c3d414320ad 100644 --- a/libgfortran/generated/reshape_r10.c +++ b/libgfortran/generated/reshape_r10.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_r10 (gfc_array_r10 * const restrict, gfc_array_r10 * const restrict, @@ -83,12 +81,13 @@ reshape_r10 (gfc_array_r10 * const restrict ret, const GFC_REAL_10 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_r10 (gfc_array_r10 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_r10 (gfc_array_r10 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_r10 (gfc_array_r10 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_r10 (gfc_array_r10 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_REAL_10); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_r10 (gfc_array_r10 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_r16.c b/libgfortran/generated/reshape_r16.c index d954c43e1c7..a8ba40b421b 100644 --- a/libgfortran/generated/reshape_r16.c +++ b/libgfortran/generated/reshape_r16.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_r16 (gfc_array_r16 * const restrict, gfc_array_r16 * const restrict, @@ -83,12 +81,13 @@ reshape_r16 (gfc_array_r16 * const restrict ret, const GFC_REAL_16 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_r16 (gfc_array_r16 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_r16 (gfc_array_r16 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_r16 (gfc_array_r16 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_r16 (gfc_array_r16 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_REAL_16); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_r16 (gfc_array_r16 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_r4.c b/libgfortran/generated/reshape_r4.c index 72eb06e9af1..b03900ae29f 100644 --- a/libgfortran/generated/reshape_r4.c +++ b/libgfortran/generated/reshape_r4.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_r4 (gfc_array_r4 * const restrict, gfc_array_r4 * const restrict, @@ -83,12 +81,13 @@ reshape_r4 (gfc_array_r4 * const restrict ret, const GFC_REAL_4 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_r4 (gfc_array_r4 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_r4 (gfc_array_r4 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_r4 (gfc_array_r4 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_r4 (gfc_array_r4 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_REAL_4); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_r4 (gfc_array_r4 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/generated/reshape_r8.c b/libgfortran/generated/reshape_r8.c index 065fb3d351d..2a3e7338018 100644 --- a/libgfortran/generated/reshape_r8.c +++ b/libgfortran/generated/reshape_r8.c @@ -37,8 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ extern void reshape_r8 (gfc_array_r8 * const restrict, gfc_array_r8 * const restrict, @@ -83,12 +81,13 @@ reshape_r8 (gfc_array_r8 * const restrict ret, const GFC_REAL_8 *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -130,13 +129,17 @@ reshape_r8 (gfc_array_r8 * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -148,13 +151,18 @@ reshape_r8 (gfc_array_r8 * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -166,6 +174,7 @@ reshape_r8 (gfc_array_r8 * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -183,6 +192,24 @@ reshape_r8 (gfc_array_r8 * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (GFC_REAL_8); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -192,6 +219,7 @@ reshape_r8 (gfc_array_r8 * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) diff --git a/libgfortran/intrinsics/reshape_generic.c b/libgfortran/intrinsics/reshape_generic.c index 97860b66299..c58fab01795 100644 --- a/libgfortran/intrinsics/reshape_generic.c +++ b/libgfortran/intrinsics/reshape_generic.c @@ -37,9 +37,6 @@ Boston, MA 02110-1301, USA. */ typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; typedef GFC_ARRAY_DESCRIPTOR(GFC_MAX_DIMENSIONS, char) parray; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ - static void reshape_internal (parray *ret, parray *source, shape_type *shape, parray *pad, shape_type *order, index_type size) @@ -73,12 +70,13 @@ reshape_internal (parray *ret, parray *source, shape_type *shape, const char *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -120,13 +118,17 @@ reshape_internal (parray *ret, parray *source, shape_type *shape, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -138,13 +140,18 @@ reshape_internal (parray *ret, parray *source, shape_type *shape, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -156,6 +163,7 @@ reshape_internal (parray *ret, parray *source, shape_type *shape, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -173,6 +181,24 @@ reshape_internal (parray *ret, parray *source, shape_type *shape, rstride0 = rstride[0] * size; sstride0 = sstride[0] * size; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * size; + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -182,6 +208,7 @@ reshape_internal (parray *ret, parray *source, shape_type *shape, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) @@ -204,7 +231,8 @@ reshape_internal (parray *ret, parray *source, shape_type *shape, rcount[n]++; rptr += rstride[n] * size; } - } + } + /* Advance to the next source element. */ n = 0; while (scount[n] == sextent[n]) diff --git a/libgfortran/m4/reshape.m4 b/libgfortran/m4/reshape.m4 index ed594fbfa68..345837a32cc 100644 --- a/libgfortran/m4/reshape.m4 +++ b/libgfortran/m4/reshape.m4 @@ -38,9 +38,9 @@ include(iparm.m4)dnl typedef GFC_ARRAY_DESCRIPTOR(1, index_type) shape_type; -/* The shape parameter is ignored. We can currently deduce the shape from the - return array. */ -dnl Only the kind (ie size) is used to name the function. +dnl For integer routines, only the kind (ie size) is used to name the +dnl function. The same function will be used for integer and logical +dnl arrays of the same kind. extern void reshape_`'rtype_ccode (rtype * const restrict, rtype * const restrict, @@ -85,12 +85,13 @@ reshape_`'rtype_ccode (rtype * const restrict ret, const rtype_name *src; int n; int dim; + int sempty, pempty; if (ret->data == NULL) { rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1; rs = 1; - for (n=0; n < rdim; n++) + for (n = 0; n < rdim; n++) { ret->dim[n].lbound = 0; rex = shape->data[n * shape->dim[0].stride]; @@ -132,13 +133,17 @@ reshape_`'rtype_ccode (rtype * const restrict ret, sdim = GFC_DESCRIPTOR_RANK (source); ssize = 1; + sempty = 0; for (n = 0; n < sdim; n++) { scount[n] = 0; sstride[n] = source->dim[n].stride; sextent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound; if (sextent[n] <= 0) - abort (); + { + sempty = 1; + sextent[n] = 0; + } if (ssize == sstride[n]) ssize *= sextent[n]; @@ -150,13 +155,18 @@ reshape_`'rtype_ccode (rtype * const restrict ret, { pdim = GFC_DESCRIPTOR_RANK (pad); psize = 1; + pempty = 0; for (n = 0; n < pdim; n++) { pcount[n] = 0; pstride[n] = pad->dim[n].stride; pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound; if (pextent[n] <= 0) - abort (); + { + pempty = 1; + pextent[n] = 0; + } + if (psize == pstride[n]) psize *= pextent[n]; else @@ -168,6 +178,7 @@ reshape_`'rtype_ccode (rtype * const restrict ret, { pdim = 0; psize = 1; + pempty = 1; pptr = NULL; } @@ -185,6 +196,24 @@ reshape_`'rtype_ccode (rtype * const restrict ret, rstride0 = rstride[0]; sstride0 = sstride[0]; + if (sempty && pempty) + abort (); + + if (sempty) + { + /* Switch immediately to the pad array. */ + src = pptr; + sptr = NULL; + sdim = pdim; + for (dim = 0; dim < pdim; dim++) + { + scount[dim] = pcount[dim]; + sextent[dim] = pextent[dim]; + sstride[dim] = pstride[dim]; + sstride0 = sstride[0] * sizeof (rtype_name); + } + } + while (rptr) { /* Select between the source and pad arrays. */ @@ -194,6 +223,7 @@ reshape_`'rtype_ccode (rtype * const restrict ret, src += sstride0; rcount[0]++; scount[0]++; + /* Advance to the next destination element. */ n = 0; while (rcount[n] == rextent[n]) |