aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2007-02-02 03:58:58 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2007-02-02 03:58:58 +0000
commitd4f8b5672a9b7349426fc54e27f7ea67a1078081 (patch)
tree0376647112160df823b457ae54a0a1c271ff2287 /gcc
parent2ad62c9b343185a73761936204f5a261c8fbad07 (diff)
downloadgcc-d4f8b5672a9b7349426fc54e27f7ea67a1078081.zip
gcc-d4f8b5672a9b7349426fc54e27f7ea67a1078081.tar.gz
gcc-d4f8b5672a9b7349426fc54e27f7ea67a1078081.tar.bz2
dependency.c (gfc_check_dependency): Implement dependency checking for array constructors.
* dependency.c (gfc_check_dependency) <EXPR_ARRAY>: Implement dependency checking for array constructors. * gfortran.dg/dependency_20.f90: New test case. From-SVN: r121490
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/dependency.c18
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.dg/dependency_20.f9010
4 files changed, 34 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index cf147cc..f794e51 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,10 @@
2007-02-01 Roger Sayle <roger@eyesopen.com>
+ * dependency.c (gfc_check_dependency) <EXPR_ARRAY>: Implement
+ dependency checking for array constructors.
+
+2007-02-01 Roger Sayle <roger@eyesopen.com>
+
* 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 26314e2..b79f222 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 656fc1f..31d23b7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-02-01 Roger Sayle <roger@eyesopen.com>
+
+ * gfortran.dg/dependency_20.f90: New test case.
+
2007-01-31 Ian Lance Taylor <iant@google.com>
* 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 0000000..ed8fa14
--- /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" } }