dependency.c (gfc_check_dependency): Call gfc_dep_resolver to check whether two array references have a dependency.

* dependency.c (gfc_check_dependency): Call gfc_dep_resolver to
	check whether two array references have a dependency.
	(gfc_check_element_vs_element): Assume lref and rref must be
	REF_ARRAYs.  If gfc_dep_compare_expr returns -2, assume these
	references could potentially overlap.
	(gfc_dep_resolver): Whitespace and comment tweaks.  Assume a
	dependency if the references have different depths.  Rewrite
	final term to clarrify we only have a dependency for overlaps.

	* gfortran.dg/dependency_4.f90: New test case.
	* gfortran.dg/dependency_5.f90: New test case.
	* gfortran.dg/dependency_6.f90: New test case.
	* gfortran.dg/dependency_7.f90: New test case.
	* gfortran.dg/dependency_8.f90: New test case.

From-SVN: r111686
This commit is contained in:
Roger Sayle 2006-03-03 21:43:08 +00:00 committed by Roger Sayle
parent 67a70df65b
commit 0b8f2ce42d
8 changed files with 97 additions and 31 deletions

View File

@ -1,3 +1,14 @@
2006-03-03 Roger Sayle <roger@eyesopen.com>
* dependency.c (gfc_check_dependency): Call gfc_dep_resolver to
check whether two array references have a dependency.
(gfc_check_element_vs_element): Assume lref and rref must be
REF_ARRAYs. If gfc_dep_compare_expr returns -2, assume these
references could potentially overlap.
(gfc_dep_resolver): Whitespace and comment tweaks. Assume a
dependency if the references have different depths. Rewrite
final term to clarrify we only have a dependency for overlaps.
2006-03-03 Thomas Koenig <Thomas.Koenig@online.de> 2006-03-03 Thomas Koenig <Thomas.Koenig@online.de>
PR fortran/25031 PR fortran/25031
@ -28,7 +39,7 @@
(gfc_trans_where_assign): Likewise. (gfc_trans_where_assign): Likewise.
(gfc_trans_where_2): Likewise. Restructure code that decides (gfc_trans_where_2): Likewise. Restructure code that decides
whether we need to allocate zero, one or two temporary masks. whether we need to allocate zero, one or two temporary masks.
If this is a top-level WHERE (i.e. the incoming MAKS is NULL), If this is a top-level WHERE (i.e. the incoming MASK is NULL),
we only need to allocate at most one temporary mask, and can we only need to allocate at most one temporary mask, and can
invert it's sense to provide the complementary pending execution invert it's sense to provide the complementary pending execution
mask. Only calculate the size of the required temporary arrays mask. Only calculate the size of the required temporary arrays

View File

@ -460,16 +460,11 @@ gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, bool identical)
if (identical) if (identical)
return 1; return 1;
/* Identical ranges return 0, overlapping ranges return 1. */ /* Identical and disjoint ranges return 0,
overlapping ranges return 1. */
/* Return zero if we refer to the same full arrays. */ /* Return zero if we refer to the same full arrays. */
if (expr1->ref->type == REF_ARRAY if (expr1->ref->type == REF_ARRAY && expr2->ref->type == REF_ARRAY)
&& expr2->ref->type == REF_ARRAY return gfc_dep_resolver (expr1->ref, expr2->ref);
&& expr1->ref->u.ar.type == AR_FULL
&& expr2->ref->u.ar.type == AR_FULL
&& !expr1->ref->next
&& !expr2->ref->next)
return 0;
return 1; return 1;
@ -735,30 +730,25 @@ gfc_check_element_vs_element (gfc_ref * lref, gfc_ref * rref, int n)
gfc_array_ref r_ar; gfc_array_ref r_ar;
gfc_expr *l_start; gfc_expr *l_start;
gfc_expr *r_start; gfc_expr *r_start;
gfc_dependency nIsDep; int i;
if (lref->type == REF_ARRAY && rref->type == REF_ARRAY) l_ar = lref->u.ar;
{ r_ar = rref->u.ar;
l_ar = lref->u.ar; l_start = l_ar.start[n] ;
r_ar = rref->u.ar; r_start = r_ar.start[n] ;
l_start = l_ar.start[n] ; i = gfc_dep_compare_expr (r_start, l_start);
r_start = r_ar.start[n] ; if (i == 0)
if (gfc_dep_compare_expr (r_start, l_start) == 0) return GFC_DEP_EQUAL;
nIsDep = GFC_DEP_EQUAL; if (i == -2)
else return GFC_DEP_OVERLAP;
nIsDep = GFC_DEP_NODEP; return GFC_DEP_NODEP;
}
else
nIsDep = GFC_DEP_NODEP;
return nIsDep;
} }
/* Finds if two array references are overlapping or not. /* Finds if two array references are overlapping or not.
Return value Return value
1 : array references are overlapping. 1 : array references are overlapping.
0 : array references are not overlapping. */ 0 : array references are identical or not overlapping. */
int int
gfc_dep_resolver (gfc_ref * lref, gfc_ref * rref) gfc_dep_resolver (gfc_ref * lref, gfc_ref * rref)
@ -792,7 +782,6 @@ gfc_dep_resolver (gfc_ref * lref, gfc_ref * rref)
return 0; return 0;
case REF_ARRAY: case REF_ARRAY:
for (n=0; n < lref->u.ar.dimen; n++) for (n=0; n < lref->u.ar.dimen; n++)
{ {
/* Assume dependency when either of array reference is vector /* Assume dependency when either of array reference is vector
@ -844,9 +833,10 @@ gfc_dep_resolver (gfc_ref * lref, gfc_ref * rref)
/* If we haven't seen any array refs then something went wrong. */ /* If we haven't seen any array refs then something went wrong. */
gcc_assert (fin_dep != GFC_DEP_ERROR); gcc_assert (fin_dep != GFC_DEP_ERROR);
if (fin_dep < GFC_DEP_OVERLAP) /* Assume the worst if we nest to different depths. */
return 0; if (lref || rref)
else
return 1; return 1;
return fin_dep == GFC_DEP_OVERLAP;
} }

View File

@ -1,3 +1,11 @@
2006-03-03 Roger Sayle <roger@eyesopen.com>
* gfortran.dg/dependency_4.f90: New test case.
* gfortran.dg/dependency_5.f90: New test case.
* gfortran.dg/dependency_6.f90: New test case.
* gfortran.dg/dependency_7.f90: New test case.
* gfortran.dg/dependency_8.f90: New test case.
2006-03-03 Paul Brook <paul@codesourcery.com> 2006-03-03 Paul Brook <paul@codesourcery.com>
* gcc/testsuite/lib/target-supports.exp (check_profiling_available): * gcc/testsuite/lib/target-supports.exp (check_profiling_available):

View File

@ -0,0 +1,11 @@
! { dg-do compile }
! { dg-options "-O2 -fdump-tree-original" }
subroutine foo(a)
integer, dimension (4) :: a
where (a .ne. 0)
a = 1
endwhere
end subroutine
! { dg-final { scan-tree-dump-times "malloc" 0 "original" } }
! { dg-final { cleanup-tree-dump "original" } }

View File

@ -0,0 +1,11 @@
! { dg-do compile }
! { dg-options "-O2 -fdump-tree-original" }
subroutine foo(a)
integer, dimension (4) :: a
where (a(:) .ne. 0)
a(:) = 1
endwhere
end subroutine
! { dg-final { scan-tree-dump-times "malloc" 0 "original" } }
! { dg-final { cleanup-tree-dump "original" } }

View File

@ -0,0 +1,11 @@
! { dg-do compile }
! { dg-options "-O2 -fdump-tree-original" }
subroutine foo(a)
integer, dimension (4) :: a
where (a(:4) .ne. 0)
a(:4) = 1
endwhere
end subroutine
! { dg-final { scan-tree-dump-times "malloc" 0 "original" } }
! { dg-final { cleanup-tree-dump "original" } }

View File

@ -0,0 +1,11 @@
! { dg-do compile }
! { dg-options "-O2 -fdump-tree-original" }
subroutine foo(a)
integer, dimension (4) :: a
where (a(1:4) .ne. 0)
a(1:4) = 1
endwhere
end subroutine
! { dg-final { scan-tree-dump-times "malloc" 0 "original" } }
! { dg-final { cleanup-tree-dump "original" } }

View File

@ -0,0 +1,13 @@
! { dg-do compile }
! { dg-options "-O2 -fdump-tree-original" }
subroutine foo(a,i,j)
integer, dimension (4,4) :: a
integer :: i
integer :: j
where (a(i,1:3) .ne. 0)
a(j,2:4) = 1
endwhere
end subroutine
! { dg-final { scan-tree-dump-times "malloc" 1 "original" } }
! { dg-final { cleanup-tree-dump "original" } }