From c591847523d01e3e735c51759b096e2bacf59269 Mon Sep 17 00:00:00 2001 From: sayle Date: Fri, 2 Feb 2007 03:58:58 +0000 Subject: [PATCH] * dependency.c (gfc_check_dependency) : Implement dependency checking for array constructors. * gfortran.dg/dependency_20.f90: New test case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121490 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/dependency.c | 18 +++++++++++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gfortran.dg/dependency_20.f90 | 10 ++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/dependency_20.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index cf147cce12c..f794e51f803 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,10 @@ 2007-02-01 Roger Sayle + * dependency.c (gfc_check_dependency) : Implement + dependency checking for array constructors. + +2007-02-01 Roger Sayle + * trans-stmt.c (compute_overall_iter_number): Document function arguments. Generalize "unconditional forall nest with constant bounds" optimization to eliminate unconditional inner loops with diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 26314e2035c..b79f2229835 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -599,9 +599,10 @@ gfc_are_equivalenced_arrays (gfc_expr *e1, gfc_expr *e2) int gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical) { + gfc_actual_arglist *actual; + gfc_constructor *c; gfc_ref *ref; int n; - gfc_actual_arglist *actual; gcc_assert (expr1->expr_type == EXPR_VARIABLE); @@ -685,8 +686,19 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical) return 0; case EXPR_ARRAY: - /* Probably ok in the majority of (constant) cases. */ - return 1; + /* Loop through the array constructor's elements. */ + for (c = expr2->value.constructor; c; c = c->next) + { + /* If this is an iterator, assume the worst. */ + if (c->iterator) + return 1; + /* Avoid recursion in the common case. */ + if (c->expr->expr_type == EXPR_CONSTANT) + continue; + if (gfc_check_dependency (expr1, c->expr, 1)) + return 1; + } + return 0; default: return 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 656fc1fe2e3..31d23b734af 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-02-01 Roger Sayle + + * gfortran.dg/dependency_20.f90: New test case. + 2007-01-31 Ian Lance Taylor * gcc.dg/lower-subreg-1.c (test): New test. diff --git a/gcc/testsuite/gfortran.dg/dependency_20.f90 b/gcc/testsuite/gfortran.dg/dependency_20.f90 new file mode 100644 index 00000000000..ed8fa14a112 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_20.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! { dg-options "-O2 -fdump-tree-original" } + integer :: a(4) + + where (a(:) .ne. 0) + a(:) = (/ 1, 2, 3, 4 /) + endwhere +end +! { dg-final { scan-tree-dump-times "temp" 0 "original" } } +! { dg-final { cleanup-tree-dump "original" } } -- 2.11.4.GIT