aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2009-06-22 04:39:40 +0000
committerPaul Thomas <pault@gcc.gnu.org>2009-06-22 04:39:40 +0000
commit0e6640d89daa5b3e1515d84823af83f9ecb40209 (patch)
tree22bf83720eefa43246cf9fd40e0a13617870b995 /gcc
parente9402aab8a080c1a14e7a4c6f942d6794735e6b0 (diff)
downloadgcc-0e6640d89daa5b3e1515d84823af83f9ecb40209.zip
gcc-0e6640d89daa5b3e1515d84823af83f9ecb40209.tar.gz
gcc-0e6640d89daa5b3e1515d84823af83f9ecb40209.tar.bz2
re PR fortran/40472 (Simplification of spread intrinsic takes a long time)
2009-06-22 Paul Thomas <pault@gcc.gnu.org> PR fortran/40472 * simplify.c (gfc_simplify_spread): Restrict the result size to the limit for an array constructor. 2009-06-22 Paul Thomas <pault@gcc.gnu.org> PR fortran/40472 * gfortran.dg/spread_size_limit.f90: New test. From-SVN: r148775
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/simplify.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/spread_size_limit.f9015
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 1c1a6c1..065e8c8 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2009-06-22 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/40472
+ * simplify.c (gfc_simplify_spread): Restrict the result size to
+ the limit for an array constructor.
+
2009-06-21 Janus Weil <janus@gcc.gnu.org>
PR fortran/39850
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 11650f3..79341d3 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -5099,6 +5099,7 @@ gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_exp
{
gfc_expr *result = 0L;
int i, j, dim, ncopies;
+ mpz_t size;
if ((!gfc_is_constant_expr (source)
&& !is_constant_array_expr (source))
@@ -5114,6 +5115,12 @@ gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_exp
gfc_extract_int (ncopies_expr, &ncopies);
ncopies = MAX (ncopies, 0);
+ /* Do not allow the array size to exceed the limit for an array
+ constructor. */
+ gfc_array_size (source, &size);
+ if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
+ return NULL;
+
if (source->expr_type == EXPR_CONSTANT)
{
gcc_assert (dim == 0);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4bc83d2..9661490 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-06-22 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/40472
+ * gfortran.dg/spread_size_limit.f90: New test.
+
2009-06-21 Uros Bizjak <ubizjak@gmail.com>
* gcc.c-torture/unsorted/dump-noaddr.x (dump_compare): Use --dumpbase
diff --git a/gcc/testsuite/gfortran.dg/spread_size_limit.f90 b/gcc/testsuite/gfortran.dg/spread_size_limit.f90
new file mode 100644
index 0000000..62bc7a4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/spread_size_limit.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! Test the fix for PR40472 in which simplify_spread had mo limit on the
+! siz that it would try to expand to.
+!
+! Contributed by Philippe Marguinaud <philippe.marguinaud@meteo.fr>
+!
+REAL, DIMENSION(720,360) :: ZLON_MASK
+ZLON_MASK(:,:)= SPREAD( (/ (JLON , JLON=1,720) /) , DIM=2, NCOPIES=360 )
+print *, zlon_mask(100,100)
+END
+! { dg-final { scan-tree-dump-times "_gfortran_spread" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
+