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. From-SVN: r222681
This commit is contained in:
parent
50093a330f
commit
11642de8a8
4 changed files with 45 additions and 9 deletions
|
@ -1,3 +1,11 @@
|
|||
2015-05-01 Mikael Morin <mikael@gcc.gnu.org>
|
||||
|
||||
* 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 <tkoenig@gcc.gnu.org>
|
||||
|
||||
PR fortran/37131
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2015-05-01 Mikael Morin <mikael@gcc.gnu.org>
|
||||
|
||||
* gfortran.dg/bound_simplification_4.f90: New.
|
||||
|
||||
2015-04-30 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.target/powerpc/crypto-builtin-2.c: Replace powerpc_vsx_ok
|
||||
|
|
30
gcc/testsuite/gfortran.dg/bound_simplification_4.f90
Normal file
30
gcc/testsuite/gfortran.dg/bound_simplification_4.f90
Normal file
|
@ -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" } }
|
Loading…
Add table
Reference in a new issue