From d42fede8d16f65bb2cf9f21676fee7eef2b728ab Mon Sep 17 00:00:00 2001 From: mikael Date: Fri, 1 May 2015 13:32:42 +0000 Subject: [PATCH] Allow bound simplification of array subreferences. gcc/fortran/ * simplify.c (simplify_bound_dim): Tighten the check for array fullness by also checking for absence of subreference. (simplify_bound): Don't skip simplification if the array has subreferences. (simplify_cobound): Same. gcc/testsuite/ * gfortran.dg/bound_simplification_4.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222681 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 8 ++++++ gcc/fortran/simplify.c | 12 +++------ gcc/testsuite/ChangeLog | 4 +++ .../gfortran.dg/bound_simplification_4.f90 | 30 ++++++++++++++++++++++ 4 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/bound_simplification_4.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 021d20d..fbf8f7b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2015-05-01 Mikael Morin + + * simplify.c (simplify_bound_dim): Tighten the check for array fullness + by also checking for absence of subreference. + (simplify_bound): Don't skip simplification if the array + has subreferences. + (simplify_cobound): Same. + 2015-04-30 Thomas Koenig PR fortran/37131 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index f631ac8..4ef9025 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -3338,7 +3338,7 @@ simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper, result = gfc_get_constant_expr (BT_INTEGER, k, &array->where); /* Then, we need to know the extent of the given dimension. */ - if (coarray || ref->u.ar.type == AR_FULL) + if (coarray || (ref->u.ar.type == AR_FULL && !ref->next)) { l = as->lower[d-1]; u = as->upper[d-1]; @@ -3417,10 +3417,7 @@ simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper) case AR_FULL: /* We're done because 'as' has already been set in the previous iteration. */ - if (!ref->next) - goto done; - - /* Fall through. */ + goto done; case AR_UNKNOWN: return NULL; @@ -3589,10 +3586,7 @@ simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper) case AR_FULL: /* We're done because 'as' has already been set in the previous iteration. */ - if (!ref->next) - goto done; - - /* Fall through. */ + goto done; case AR_UNKNOWN: return NULL; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8293e8f..fb9c521 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-05-01 Mikael Morin + + * gfortran.dg/bound_simplification_4.f90: New. + 2015-04-30 Bill Schmidt * gcc.target/powerpc/crypto-builtin-2.c: Replace powerpc_vsx_ok diff --git a/gcc/testsuite/gfortran.dg/bound_simplification_4.f90 b/gcc/testsuite/gfortran.dg/bound_simplification_4.f90 new file mode 100644 index 0000000..28a8d67 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bound_simplification_4.f90 @@ -0,0 +1,30 @@ +! { dg-do run } +! { dg-additional-options "-fcoarray=single -fdump-tree-original" } +! +! Check that {L,U}{,CO}BOUND intrinsics are properly simplified. +! + type :: t + integer :: c + end type t + + type(t) :: d(3:8) = t(7) + type(t) :: e[5:9,-1:*] + + if (lbound(d, 1) /= 3) call abort + if (lbound(d(3:5), 1) /= 1) call abort + if (lbound(d%c, 1) /= 1) call abort + if (ubound(d, 1) /= 8) call abort + if (ubound(d(3:5), 1) /= 3) call abort + if (ubound(d%c, 1) /= 6) call abort + + if (lcobound(e, 1) /= 5) call abort + if (lcobound(e%c, 1) /= 5) call abort + if (lcobound(e, 2) /= -1) call abort + if (lcobound(e%c, 2) /= -1) call abort + if (ucobound(e, 1) /= 9) call abort + if (ucobound(e%c, 1) /= 9) call abort + ! no simplification for ucobound(e{,%c}, dim=2) +end +! { dg-final { scan-tree-dump-not "bound" "original" } } +! { dg-final { scan-tree-dump-not "abort" "original" } } +! { dg-final { cleanup-tree-dump "original" } } -- 2.7.4