2 Copyright (C) 2000, 2001, 2002, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Paul Brook <paul@nowt.org>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* dependency.c -- Expression dependency analysis code. */
23 /* There's probably quite a bit of duplication in this file. We currently
24 have different dependency checking functions for different types
25 if dependencies. Ideally these would probably be merged. */
29 #include "dependency.h"
31 /* static declarations */
33 enum range {LHS, RHS, MID};
35 /* Dependency types. These must be in reverse order of priority. */
39 GFC_DEP_EQUAL, /* Identical Ranges. */
40 GFC_DEP_FORWARD, /* eg. a(1:3), a(2:4). */
41 GFC_DEP_OVERLAP, /* May overlap in some other way. */
42 GFC_DEP_NODEP /* Distinct ranges. */
47 #define IS_ARRAY_EXPLICIT(as) ((as->type == AS_EXPLICIT ? 1 : 0))
50 /* Returns 1 if the expr is an integer constant value 1, 0 if it is not or
51 def if the value could not be determined. */
54 gfc_expr_is_one (gfc_expr *expr, int def)
56 gcc_assert (expr != NULL);
58 if (expr->expr_type != EXPR_CONSTANT)
61 if (expr->ts.type != BT_INTEGER)
64 return mpz_cmp_si (expr->value.integer, 1) == 0;
68 /* Compare two values. Returns 0 if e1 == e2, -1 if e1 < e2, +1 if e1 > e2,
69 and -2 if the relationship could not be determined. */
72 gfc_dep_compare_expr (gfc_expr *e1, gfc_expr *e2)
74 gfc_actual_arglist *args1;
75 gfc_actual_arglist *args2;
78 if (e1->expr_type == EXPR_OP
79 && (e1->value.op.operator == INTRINSIC_UPLUS
80 || e1->value.op.operator == INTRINSIC_PARENTHESES))
81 return gfc_dep_compare_expr (e1->value.op.op1, e2);
82 if (e2->expr_type == EXPR_OP
83 && (e2->value.op.operator == INTRINSIC_UPLUS
84 || e2->value.op.operator == INTRINSIC_PARENTHESES))
85 return gfc_dep_compare_expr (e1, e2->value.op.op1);
87 if (e1->expr_type == EXPR_OP && e1->value.op.operator == INTRINSIC_PLUS)
89 /* Compare X+C vs. X. */
90 if (e1->value.op.op2->expr_type == EXPR_CONSTANT
91 && e1->value.op.op2->ts.type == BT_INTEGER
92 && gfc_dep_compare_expr (e1->value.op.op1, e2) == 0)
93 return mpz_sgn (e1->value.op.op2->value.integer);
95 /* Compare P+Q vs. R+S. */
96 if (e2->expr_type == EXPR_OP && e2->value.op.operator == INTRINSIC_PLUS)
100 l = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
101 r = gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2);
102 if (l == 0 && r == 0)
104 if (l == 0 && r != -2)
106 if (l != -2 && r == 0)
108 if (l == 1 && r == 1)
110 if (l == -1 && r == -1)
113 l = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op2);
114 r = gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op1);
115 if (l == 0 && r == 0)
117 if (l == 0 && r != -2)
119 if (l != -2 && r == 0)
121 if (l == 1 && r == 1)
123 if (l == -1 && r == -1)
128 /* Compare X vs. X+C. */
129 if (e2->expr_type == EXPR_OP && e2->value.op.operator == INTRINSIC_PLUS)
131 if (e2->value.op.op2->expr_type == EXPR_CONSTANT
132 && e2->value.op.op2->ts.type == BT_INTEGER
133 && gfc_dep_compare_expr (e1, e2->value.op.op1) == 0)
134 return -mpz_sgn (e2->value.op.op2->value.integer);
137 /* Compare X-C vs. X. */
138 if (e1->expr_type == EXPR_OP && e1->value.op.operator == INTRINSIC_MINUS)
140 if (e1->value.op.op2->expr_type == EXPR_CONSTANT
141 && e1->value.op.op2->ts.type == BT_INTEGER
142 && gfc_dep_compare_expr (e1->value.op.op1, e2) == 0)
143 return -mpz_sgn (e1->value.op.op2->value.integer);
145 /* Compare P-Q vs. R-S. */
146 if (e2->expr_type == EXPR_OP && e2->value.op.operator == INTRINSIC_MINUS)
150 l = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
151 r = gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2);
152 if (l == 0 && r == 0)
154 if (l != -2 && r == 0)
156 if (l == 0 && r != -2)
158 if (l == 1 && r == -1)
160 if (l == -1 && r == 1)
165 /* Compare X vs. X-C. */
166 if (e2->expr_type == EXPR_OP && e2->value.op.operator == INTRINSIC_MINUS)
168 if (e2->value.op.op2->expr_type == EXPR_CONSTANT
169 && e2->value.op.op2->ts.type == BT_INTEGER
170 && gfc_dep_compare_expr (e1, e2->value.op.op1) == 0)
171 return mpz_sgn (e2->value.op.op2->value.integer);
174 if (e1->expr_type != e2->expr_type)
177 switch (e1->expr_type)
180 if (e1->ts.type != BT_INTEGER || e2->ts.type != BT_INTEGER)
183 i = mpz_cmp (e1->value.integer, e2->value.integer);
191 if (e1->ref || e2->ref)
193 if (e1->symtree->n.sym == e2->symtree->n.sym)
198 /* Intrinsic operators are the same if their operands are the same. */
199 if (e1->value.op.operator != e2->value.op.operator)
201 if (e1->value.op.op2 == 0)
203 i = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
204 return i == 0 ? 0 : -2;
206 if (gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1) == 0
207 && gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2) == 0)
209 /* TODO Handle commutative binary operators here? */
213 /* We can only compare calls to the same intrinsic function. */
214 if (e1->value.function.isym == 0 || e2->value.function.isym == 0
215 || e1->value.function.isym != e2->value.function.isym)
218 args1 = e1->value.function.actual;
219 args2 = e2->value.function.actual;
221 /* We should list the "constant" intrinsic functions. Those
222 without side-effects that provide equal results given equal
224 switch (e1->value.function.isym->id)
226 case GFC_ISYM_CONVERSION:
227 /* Handle integer extensions specially, as __convert_i4_i8
228 is not only "constant" but also "unary" and "increasing". */
229 if (args1 && !args1->next
230 && args2 && !args2->next
231 && e1->ts.type == BT_INTEGER
232 && args1->expr->ts.type == BT_INTEGER
233 && e1->ts.kind > args1->expr->ts.kind
234 && e2->ts.type == e1->ts.type
235 && e2->ts.kind == e1->ts.kind
236 && args2->expr->ts.type == args1->expr->ts.type
237 && args2->expr->ts.kind == args2->expr->ts.kind)
238 return gfc_dep_compare_expr (args1->expr, args2->expr);
242 case GFC_ISYM_LOGICAL:
250 /* Compare the argument lists for equality. */
251 while (args1 && args2)
253 if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0)
258 return (args1 || args2) ? -2 : 0;
266 /* Returns 1 if the two ranges are the same, 0 if they are not, and def
267 if the results are indeterminate. N is the dimension to compare. */
270 gfc_is_same_range (gfc_array_ref *ar1, gfc_array_ref *ar2, int n, int def)
276 /* TODO: More sophisticated range comparison. */
277 gcc_assert (ar1 && ar2);
279 gcc_assert (ar1->dimen_type[n] == ar2->dimen_type[n]);
283 /* Check for mismatching strides. A NULL stride means a stride of 1. */
286 i = gfc_expr_is_one (e1, -1);
294 i = gfc_expr_is_one (e2, -1);
302 i = gfc_dep_compare_expr (e1, e2);
308 /* The strides match. */
310 /* Check the range start. */
315 /* Use the bound of the array if no bound is specified. */
317 e1 = ar1->as->lower[n];
320 e2 = ar2->as->lower[n];
322 /* Check we have values for both. */
326 i = gfc_dep_compare_expr (e1, e2);
333 /* Check the range end. */
338 /* Use the bound of the array if no bound is specified. */
340 e1 = ar1->as->upper[n];
343 e2 = ar2->as->upper[n];
345 /* Check we have values for both. */
349 i = gfc_dep_compare_expr (e1, e2);
360 /* Some array-returning intrinsics can be implemented by reusing the
361 data from one of the array arguments. For example, TRANSPOSE does
362 not necessarily need to allocate new data: it can be implemented
363 by copying the original array's descriptor and simply swapping the
364 two dimension specifications.
366 If EXPR is a call to such an intrinsic, return the argument
367 whose data can be reused, otherwise return NULL. */
370 gfc_get_noncopying_intrinsic_argument (gfc_expr *expr)
372 if (expr->expr_type != EXPR_FUNCTION || !expr->value.function.isym)
375 switch (expr->value.function.isym->id)
377 case GFC_ISYM_TRANSPOSE:
378 return expr->value.function.actual->expr;
386 /* Return true if the result of reference REF can only be constructed
387 using a temporary array. */
390 gfc_ref_needs_temporary_p (gfc_ref *ref)
396 for (; ref; ref = ref->next)
400 /* Vector dimensions are generally not monotonic and must be
401 handled using a temporary. */
402 if (ref->u.ar.type == AR_SECTION)
403 for (n = 0; n < ref->u.ar.dimen; n++)
404 if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR)
411 /* Within an array reference, character substrings generally
412 need a temporary. Character array strides are expressed as
413 multiples of the element size (consistent with other array
414 types), not in characters. */
425 /* Return true if array variable VAR could be passed to the same function
426 as argument EXPR without interfering with EXPR. INTENT is the intent
429 This is considerably less conservative than other dependencies
430 because many function arguments will already be copied into a
434 gfc_check_argument_var_dependency (gfc_expr *var, sym_intent intent,
437 gcc_assert (var->expr_type == EXPR_VARIABLE);
438 gcc_assert (var->rank > 0);
440 switch (expr->expr_type)
443 return (gfc_ref_needs_temporary_p (expr->ref)
444 || gfc_check_dependency (var, expr, 1));
447 return gfc_check_dependency (var, expr, 1);
450 if (intent != INTENT_IN && expr->inline_noncopying_intrinsic)
452 expr = gfc_get_noncopying_intrinsic_argument (expr);
453 return gfc_check_argument_var_dependency (var, intent, expr);
463 /* Like gfc_check_argument_var_dependency, but extended to any
464 array expression OTHER, not just variables. */
467 gfc_check_argument_dependency (gfc_expr *other, sym_intent intent,
470 switch (other->expr_type)
473 return gfc_check_argument_var_dependency (other, intent, expr);
476 if (other->inline_noncopying_intrinsic)
478 other = gfc_get_noncopying_intrinsic_argument (other);
479 return gfc_check_argument_dependency (other, INTENT_IN, expr);
489 /* Like gfc_check_argument_dependency, but check all the arguments in ACTUAL.
490 FNSYM is the function being called, or NULL if not known. */
493 gfc_check_fncall_dependency (gfc_expr *other, sym_intent intent,
494 gfc_symbol *fnsym, gfc_actual_arglist *actual)
496 gfc_formal_arglist *formal;
499 formal = fnsym ? fnsym->formal : NULL;
500 for (; actual; actual = actual->next, formal = formal ? formal->next : NULL)
504 /* Skip args which are not present. */
508 /* Skip other itself. */
512 /* Skip intent(in) arguments if OTHER itself is intent(in). */
513 if (formal && intent == INTENT_IN
514 && formal->sym->attr.intent == INTENT_IN)
517 if (gfc_check_argument_dependency (other, intent, expr))
525 /* Return 1 if e1 and e2 are equivalenced arrays, either
526 directly or indirectly; ie. equivalence (a,b) for a and b
527 or equivalence (a,c),(b,c). This function uses the equiv_
528 lists, generated in trans-common(add_equivalences), that are
529 guaranteed to pick up indirect equivalences. We explicitly
530 check for overlap using the offset and length of the equivalence.
531 This function is symmetric.
532 TODO: This function only checks whether the full top-level
533 symbols overlap. An improved implementation could inspect
534 e1->ref and e2->ref to determine whether the actually accessed
535 portions of these variables/arrays potentially overlap. */
538 gfc_are_equivalenced_arrays (gfc_expr *e1, gfc_expr *e2)
541 gfc_equiv_info *s, *fl1, *fl2;
543 gcc_assert (e1->expr_type == EXPR_VARIABLE
544 && e2->expr_type == EXPR_VARIABLE);
546 if (!e1->symtree->n.sym->attr.in_equivalence
547 || !e2->symtree->n.sym->attr.in_equivalence|| !e1->rank || !e2->rank)
550 /* Go through the equiv_lists and return 1 if the variables
551 e1 and e2 are members of the same group and satisfy the
552 requirement on their relative offsets. */
553 for (l = gfc_current_ns->equiv_lists; l; l = l->next)
557 for (s = l->equiv; s; s = s->next)
559 if (s->sym == e1->symtree->n.sym)
565 if (s->sym == e2->symtree->n.sym)
575 /* Can these lengths be zero? */
576 if (fl1->length <= 0 || fl2->length <= 0)
578 /* These can't overlap if [f11,fl1+length] is before
579 [fl2,fl2+length], or [fl2,fl2+length] is before
580 [fl1,fl1+length], otherwise they do overlap. */
581 if (fl1->offset + fl1->length > fl2->offset
582 && fl2->offset + fl2->length > fl1->offset)
590 /* Return true if the statement body redefines the condition. Returns
591 true if expr2 depends on expr1. expr1 should be a single term
592 suitable for the lhs of an assignment. The IDENTICAL flag indicates
593 whether array references to the same symbol with identical range
594 references count as a dependency or not. Used for forall and where
595 statements. Also used with functions returning arrays without a
599 gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical)
601 gfc_actual_arglist *actual;
606 gcc_assert (expr1->expr_type == EXPR_VARIABLE);
608 switch (expr2->expr_type)
611 n = gfc_check_dependency (expr1, expr2->value.op.op1, identical);
614 if (expr2->value.op.op2)
615 return gfc_check_dependency (expr1, expr2->value.op.op2, identical);
619 /* The interesting cases are when the symbols don't match. */
620 if (expr1->symtree->n.sym != expr2->symtree->n.sym)
622 gfc_typespec *ts1 = &expr1->symtree->n.sym->ts;
623 gfc_typespec *ts2 = &expr2->symtree->n.sym->ts;
625 /* Return 1 if expr1 and expr2 are equivalenced arrays. */
626 if (gfc_are_equivalenced_arrays (expr1, expr2))
629 /* Symbols can only alias if they have the same type. */
630 if (ts1->type != BT_UNKNOWN && ts2->type != BT_UNKNOWN
631 && ts1->type != BT_DERIVED && ts2->type != BT_DERIVED)
633 if (ts1->type != ts2->type || ts1->kind != ts2->kind)
637 /* If either variable is a pointer, assume the worst. */
638 /* TODO: -fassume-no-pointer-aliasing */
639 if (expr1->symtree->n.sym->attr.pointer)
641 for (ref = expr1->ref; ref; ref = ref->next)
642 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
645 if (expr2->symtree->n.sym->attr.pointer)
647 for (ref = expr2->ref; ref; ref = ref->next)
648 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
651 /* Otherwise distinct symbols have no dependencies. */
658 /* Identical and disjoint ranges return 0,
659 overlapping ranges return 1. */
660 /* Return zero if we refer to the same full arrays. */
661 if (expr1->ref->type == REF_ARRAY && expr2->ref->type == REF_ARRAY)
662 return gfc_dep_resolver (expr1->ref, expr2->ref);
667 if (expr2->inline_noncopying_intrinsic)
669 /* Remember possible differences between elemental and
670 transformational functions. All functions inside a FORALL
672 for (actual = expr2->value.function.actual;
673 actual; actual = actual->next)
677 n = gfc_check_dependency (expr1, actual->expr, identical);
688 /* Loop through the array constructor's elements. */
689 for (c = expr2->value.constructor; c; c = c->next)
691 /* If this is an iterator, assume the worst. */
694 /* Avoid recursion in the common case. */
695 if (c->expr->expr_type == EXPR_CONSTANT)
697 if (gfc_check_dependency (expr1, c->expr, 1))
708 /* Determines overlapping for two array sections. */
710 static gfc_dependency
711 gfc_check_section_vs_section (gfc_ref *lref, gfc_ref *rref, int n)
732 /* If they are the same range, return without more ado. */
733 if (gfc_is_same_range (&l_ar, &r_ar, n, 0))
734 return GFC_DEP_EQUAL;
736 l_start = l_ar.start[n];
738 l_stride = l_ar.stride[n];
740 r_start = r_ar.start[n];
742 r_stride = r_ar.stride[n];
744 /* If l_start is NULL take it from array specifier. */
745 if (NULL == l_start && IS_ARRAY_EXPLICIT (l_ar.as))
746 l_start = l_ar.as->lower[n];
747 /* If l_end is NULL take it from array specifier. */
748 if (NULL == l_end && IS_ARRAY_EXPLICIT (l_ar.as))
749 l_end = l_ar.as->upper[n];
751 /* If r_start is NULL take it from array specifier. */
752 if (NULL == r_start && IS_ARRAY_EXPLICIT (r_ar.as))
753 r_start = r_ar.as->lower[n];
754 /* If r_end is NULL take it from array specifier. */
755 if (NULL == r_end && IS_ARRAY_EXPLICIT (r_ar.as))
756 r_end = r_ar.as->upper[n];
758 /* Determine whether the l_stride is positive or negative. */
761 else if (l_stride->expr_type == EXPR_CONSTANT
762 && l_stride->ts.type == BT_INTEGER)
763 l_dir = mpz_sgn (l_stride->value.integer);
764 else if (l_start && l_end)
765 l_dir = gfc_dep_compare_expr (l_end, l_start);
769 /* Determine whether the r_stride is positive or negative. */
772 else if (r_stride->expr_type == EXPR_CONSTANT
773 && r_stride->ts.type == BT_INTEGER)
774 r_dir = mpz_sgn (r_stride->value.integer);
775 else if (r_start && r_end)
776 r_dir = gfc_dep_compare_expr (r_end, r_start);
780 /* The strides should never be zero. */
781 if (l_dir == 0 || r_dir == 0)
782 return GFC_DEP_OVERLAP;
784 /* Determine LHS upper and lower bounds. */
790 else if (l_dir == -1)
801 /* Determine RHS upper and lower bounds. */
807 else if (r_dir == -1)
818 /* Check whether the ranges are disjoint. */
819 if (l_upper && r_lower && gfc_dep_compare_expr (l_upper, r_lower) == -1)
820 return GFC_DEP_NODEP;
821 if (r_upper && l_lower && gfc_dep_compare_expr (r_upper, l_lower) == -1)
822 return GFC_DEP_NODEP;
824 /* Handle cases like x:y:1 vs. x:z:-1 as GFC_DEP_EQUAL. */
825 if (l_start && r_start && gfc_dep_compare_expr (l_start, r_start) == 0)
827 if (l_dir == 1 && r_dir == -1)
828 return GFC_DEP_EQUAL;
829 if (l_dir == -1 && r_dir == 1)
830 return GFC_DEP_EQUAL;
833 /* Handle cases like x:y:1 vs. z:y:-1 as GFC_DEP_EQUAL. */
834 if (l_end && r_end && gfc_dep_compare_expr (l_end, r_end) == 0)
836 if (l_dir == 1 && r_dir == -1)
837 return GFC_DEP_EQUAL;
838 if (l_dir == -1 && r_dir == 1)
839 return GFC_DEP_EQUAL;
842 /* Check for forward dependencies x:y vs. x+1:z. */
843 if (l_dir == 1 && r_dir == 1
844 && l_start && r_start && gfc_dep_compare_expr (l_start, r_start) == -1
845 && l_end && r_end && gfc_dep_compare_expr (l_end, r_end) == -1)
847 /* Check that the strides are the same. */
848 if (!l_stride && !r_stride)
849 return GFC_DEP_FORWARD;
850 if (l_stride && r_stride
851 && gfc_dep_compare_expr (l_stride, r_stride) == 0)
852 return GFC_DEP_FORWARD;
855 /* Check for forward dependencies x:y:-1 vs. x-1:z:-1. */
856 if (l_dir == -1 && r_dir == -1
857 && l_start && r_start && gfc_dep_compare_expr (l_start, r_start) == 1
858 && l_end && r_end && gfc_dep_compare_expr (l_end, r_end) == 1)
860 /* Check that the strides are the same. */
861 if (!l_stride && !r_stride)
862 return GFC_DEP_FORWARD;
863 if (l_stride && r_stride
864 && gfc_dep_compare_expr (l_stride, r_stride) == 0)
865 return GFC_DEP_FORWARD;
868 return GFC_DEP_OVERLAP;
872 /* Determines overlapping for a single element and a section. */
874 static gfc_dependency
875 gfc_check_element_vs_section( gfc_ref *lref, gfc_ref *rref, int n)
884 elem = lref->u.ar.start[n];
886 return GFC_DEP_OVERLAP;
889 start = ref->start[n] ;
891 stride = ref->stride[n];
893 if (!start && IS_ARRAY_EXPLICIT (ref->as))
894 start = ref->as->lower[n];
895 if (!end && IS_ARRAY_EXPLICIT (ref->as))
896 end = ref->as->upper[n];
898 /* Determine whether the stride is positive or negative. */
901 else if (stride->expr_type == EXPR_CONSTANT
902 && stride->ts.type == BT_INTEGER)
903 s = mpz_sgn (stride->value.integer);
907 /* Stride should never be zero. */
909 return GFC_DEP_OVERLAP;
911 /* Positive strides. */
914 /* Check for elem < lower. */
915 if (start && gfc_dep_compare_expr (elem, start) == -1)
916 return GFC_DEP_NODEP;
917 /* Check for elem > upper. */
918 if (end && gfc_dep_compare_expr (elem, end) == 1)
919 return GFC_DEP_NODEP;
923 s = gfc_dep_compare_expr (start, end);
924 /* Check for an empty range. */
926 return GFC_DEP_NODEP;
927 if (s == 0 && gfc_dep_compare_expr (elem, start) == 0)
928 return GFC_DEP_EQUAL;
931 /* Negative strides. */
934 /* Check for elem > upper. */
935 if (end && gfc_dep_compare_expr (elem, start) == 1)
936 return GFC_DEP_NODEP;
937 /* Check for elem < lower. */
938 if (start && gfc_dep_compare_expr (elem, end) == -1)
939 return GFC_DEP_NODEP;
943 s = gfc_dep_compare_expr (start, end);
944 /* Check for an empty range. */
946 return GFC_DEP_NODEP;
947 if (s == 0 && gfc_dep_compare_expr (elem, start) == 0)
948 return GFC_DEP_EQUAL;
951 /* Unknown strides. */
955 return GFC_DEP_OVERLAP;
956 s = gfc_dep_compare_expr (start, end);
958 return GFC_DEP_OVERLAP;
959 /* Assume positive stride. */
962 /* Check for elem < lower. */
963 if (gfc_dep_compare_expr (elem, start) == -1)
964 return GFC_DEP_NODEP;
965 /* Check for elem > upper. */
966 if (gfc_dep_compare_expr (elem, end) == 1)
967 return GFC_DEP_NODEP;
969 /* Assume negative stride. */
972 /* Check for elem > upper. */
973 if (gfc_dep_compare_expr (elem, start) == 1)
974 return GFC_DEP_NODEP;
975 /* Check for elem < lower. */
976 if (gfc_dep_compare_expr (elem, end) == -1)
977 return GFC_DEP_NODEP;
982 s = gfc_dep_compare_expr (elem, start);
984 return GFC_DEP_EQUAL;
985 if (s == 1 || s == -1)
986 return GFC_DEP_NODEP;
990 return GFC_DEP_OVERLAP;
994 /* Traverse expr, checking all EXPR_VARIABLE symbols for their
995 forall_index attribute. Return true if any variable may be
996 being used as a FORALL index. Its safe to pessimistically
997 return true, and assume a dependency. */
1000 contains_forall_index_p (gfc_expr *expr)
1002 gfc_actual_arglist *arg;
1010 switch (expr->expr_type)
1013 if (expr->symtree->n.sym->forall_index)
1018 if (contains_forall_index_p (expr->value.op.op1)
1019 || contains_forall_index_p (expr->value.op.op2))
1024 for (arg = expr->value.function.actual; arg; arg = arg->next)
1025 if (contains_forall_index_p (arg->expr))
1031 case EXPR_SUBSTRING:
1034 case EXPR_STRUCTURE:
1036 for (c = expr->value.constructor; c; c = c->next)
1037 if (contains_forall_index_p (c->expr))
1045 for (ref = expr->ref; ref; ref = ref->next)
1049 for (i = 0; i < ref->u.ar.dimen; i++)
1050 if (contains_forall_index_p (ref->u.ar.start[i])
1051 || contains_forall_index_p (ref->u.ar.end[i])
1052 || contains_forall_index_p (ref->u.ar.stride[i]))
1060 if (contains_forall_index_p (ref->u.ss.start)
1061 || contains_forall_index_p (ref->u.ss.end))
1072 /* Determines overlapping for two single element array references. */
1074 static gfc_dependency
1075 gfc_check_element_vs_element (gfc_ref *lref, gfc_ref *rref, int n)
1085 l_start = l_ar.start[n] ;
1086 r_start = r_ar.start[n] ;
1087 i = gfc_dep_compare_expr (r_start, l_start);
1089 return GFC_DEP_EQUAL;
1091 /* Treat two scalar variables as potentially equal. This allows
1092 us to prove that a(i,:) and a(j,:) have no dependency. See
1093 Gerald Roth, "Evaluation of Array Syntax Dependence Analysis",
1094 Proceedings of the International Conference on Parallel and
1095 Distributed Processing Techniques and Applications (PDPTA2001),
1096 Las Vegas, Nevada, June 2001. */
1097 /* However, we need to be careful when either scalar expression
1098 contains a FORALL index, as these can potentially change value
1099 during the scalarization/traversal of this array reference. */
1100 if (contains_forall_index_p (r_start) || contains_forall_index_p (l_start))
1101 return GFC_DEP_OVERLAP;
1104 return GFC_DEP_NODEP;
1105 return GFC_DEP_EQUAL;
1109 /* Determine if an array ref, usually an array section specifies the
1113 gfc_full_array_ref_p (gfc_ref *ref)
1117 if (ref->type != REF_ARRAY)
1119 if (ref->u.ar.type == AR_FULL)
1121 if (ref->u.ar.type != AR_SECTION)
1126 for (i = 0; i < ref->u.ar.dimen; i++)
1128 /* If we have a single element in the reference, we need to check
1129 that the array has a single element and that we actually reference
1130 the correct element. */
1131 if (ref->u.ar.dimen_type[i] == DIMEN_ELEMENT)
1134 || !ref->u.ar.as->lower[i]
1135 || !ref->u.ar.as->upper[i]
1136 || gfc_dep_compare_expr (ref->u.ar.as->lower[i],
1137 ref->u.ar.as->upper[i])
1138 || !ref->u.ar.start[i]
1139 || gfc_dep_compare_expr (ref->u.ar.start[i],
1140 ref->u.ar.as->lower[i]))
1146 /* Check the lower bound. */
1147 if (ref->u.ar.start[i]
1149 || !ref->u.ar.as->lower[i]
1150 || gfc_dep_compare_expr (ref->u.ar.start[i],
1151 ref->u.ar.as->lower[i])))
1153 /* Check the upper bound. */
1154 if (ref->u.ar.end[i]
1156 || !ref->u.ar.as->upper[i]
1157 || gfc_dep_compare_expr (ref->u.ar.end[i],
1158 ref->u.ar.as->upper[i])))
1160 /* Check the stride. */
1161 if (ref->u.ar.stride[i] && !gfc_expr_is_one (ref->u.ar.stride[i], 0))
1168 /* Finds if two array references are overlapping or not.
1170 1 : array references are overlapping.
1171 0 : array references are identical or not overlapping. */
1174 gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref)
1177 gfc_dependency fin_dep;
1178 gfc_dependency this_dep;
1180 fin_dep = GFC_DEP_ERROR;
1181 /* Dependencies due to pointers should already have been identified.
1182 We only need to check for overlapping array references. */
1184 while (lref && rref)
1186 /* We're resolving from the same base symbol, so both refs should be
1187 the same type. We traverse the reference chain intil we find ranges
1188 that are not equal. */
1189 gcc_assert (lref->type == rref->type);
1193 /* The two ranges can't overlap if they are from different
1195 if (lref->u.c.component != rref->u.c.component)
1200 /* Substring overlaps are handled by the string assignment code. */
1204 if (lref->u.ar.dimen != rref->u.ar.dimen)
1206 if (lref->u.ar.type == AR_FULL)
1207 fin_dep = gfc_full_array_ref_p (rref) ? GFC_DEP_EQUAL
1209 else if (rref->u.ar.type == AR_FULL)
1210 fin_dep = gfc_full_array_ref_p (lref) ? GFC_DEP_EQUAL
1217 for (n=0; n < lref->u.ar.dimen; n++)
1219 /* Assume dependency when either of array reference is vector
1221 if (lref->u.ar.dimen_type[n] == DIMEN_VECTOR
1222 || rref->u.ar.dimen_type[n] == DIMEN_VECTOR)
1224 if (lref->u.ar.dimen_type[n] == DIMEN_RANGE
1225 && rref->u.ar.dimen_type[n] == DIMEN_RANGE)
1226 this_dep = gfc_check_section_vs_section (lref, rref, n);
1227 else if (lref->u.ar.dimen_type[n] == DIMEN_ELEMENT
1228 && rref->u.ar.dimen_type[n] == DIMEN_RANGE)
1229 this_dep = gfc_check_element_vs_section (lref, rref, n);
1230 else if (rref->u.ar.dimen_type[n] == DIMEN_ELEMENT
1231 && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
1232 this_dep = gfc_check_element_vs_section (rref, lref, n);
1235 gcc_assert (rref->u.ar.dimen_type[n] == DIMEN_ELEMENT
1236 && lref->u.ar.dimen_type[n] == DIMEN_ELEMENT);
1237 this_dep = gfc_check_element_vs_element (rref, lref, n);
1240 /* If any dimension doesn't overlap, we have no dependency. */
1241 if (this_dep == GFC_DEP_NODEP)
1244 /* Overlap codes are in order of priority. We only need to
1245 know the worst one.*/
1246 if (this_dep > fin_dep)
1249 /* Exactly matching and forward overlapping ranges don't cause a
1251 if (fin_dep < GFC_DEP_OVERLAP)
1254 /* Keep checking. We only have a dependency if
1255 subsequent references also overlap. */
1265 /* If we haven't seen any array refs then something went wrong. */
1266 gcc_assert (fin_dep != GFC_DEP_ERROR);
1268 /* Assume the worst if we nest to different depths. */
1272 return fin_dep == GFC_DEP_OVERLAP;