Allow bound simplification of array subreferences.
authormikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 May 2015 13:32:42 +0000 (13:32 +0000)
committermikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 May 2015 13:32:42 +0000 (13:32 +0000)
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
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/bound_simplification_4.f90 [new file with mode: 0644]

index 021d20d..fbf8f7b 100644 (file)
@@ -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
index f631ac8..4ef9025 100644 (file)
@@ -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;
index 8293e8f..fb9c521 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/bound_simplification_4.f90 b/gcc/testsuite/gfortran.dg/bound_simplification_4.f90
new file mode 100644 (file)
index 0000000..28a8d67
--- /dev/null
@@ -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" } }