2 Copyright (C) 2000, 2001, 2002, 2005 Free Software Foundation, Inc.
3 Contributed by Paul Brook <paul@nowt.org>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
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. */
30 #include "dependency.h"
32 /* static declarations */
34 enum range {LHS, RHS, MID};
36 /* Dependency types. These must be in reverse order of priority. */
40 GFC_DEP_EQUAL, /* Identical Ranges. */
41 GFC_DEP_FORWARD, /* eg. a(1:3), a(2:4). */
42 GFC_DEP_OVERLAP, /* May overlap in some other way. */
43 GFC_DEP_NODEP /* Distinct ranges. */
48 #define IS_ARRAY_EXPLICIT(as) ((as->type == AS_EXPLICIT ? 1 : 0))
51 /* Returns 1 if the expr is an integer constant value 1, 0 if it is not or
52 def if the value could not be determined. */
55 gfc_expr_is_one (gfc_expr * expr, int def)
57 gcc_assert (expr != NULL);
59 if (expr->expr_type != EXPR_CONSTANT)
62 if (expr->ts.type != BT_INTEGER)
65 return mpz_cmp_si (expr->value.integer, 1) == 0;
69 /* Compare two values. Returns 0 if e1 == e2, -1 if e1 < e2, +1 if e1 > e2,
70 and -2 if the relationship could not be determined. */
73 gfc_dep_compare_expr (gfc_expr * e1, gfc_expr * e2)
77 if (e1->expr_type != e2->expr_type)
80 switch (e1->expr_type)
83 if (e1->ts.type != BT_INTEGER || e2->ts.type != BT_INTEGER)
86 i = mpz_cmp (e1->value.integer, e2->value.integer);
94 if (e1->ref || e2->ref)
96 if (e1->symtree->n.sym == e2->symtree->n.sym)
101 /* Intrinsic operators are the same if their operands are the same. */
102 if (e1->value.op.operator != e2->value.op.operator)
104 if (e1->value.op.op2 == 0)
106 i = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
107 return i == 0 ? 0 : -2;
109 if (gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1) == 0
110 && gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2) == 0)
112 /* TODO Handle commutative binary operators here? */
116 /* We can only compare calls to the same intrinsic function. */
117 if (e1->value.function.isym == 0
118 || e2->value.function.isym == 0
119 || e1->value.function.isym != e2->value.function.isym)
122 /* We should list the "constant" intrinsic functions. Those
123 without side-effects that provide equal results given equal
125 switch (e1->value.function.isym->generic_id)
127 case GFC_ISYM_CONVERSION:
129 case GFC_ISYM_LOGICAL:
137 /* Compare the argument lists for equality. */
139 gfc_actual_arglist *args1 = e1->value.function.actual;
140 gfc_actual_arglist *args2 = e2->value.function.actual;
141 while (args1 && args2)
143 if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0)
148 return (args1 || args2) ? -2 : 0;
157 /* Returns 1 if the two ranges are the same, 0 if they are not, and def
158 if the results are indeterminate. N is the dimension to compare. */
161 gfc_is_same_range (gfc_array_ref * ar1, gfc_array_ref * ar2, int n, int def)
167 /* TODO: More sophisticated range comparison. */
168 gcc_assert (ar1 && ar2);
170 gcc_assert (ar1->dimen_type[n] == ar2->dimen_type[n]);
174 /* Check for mismatching strides. A NULL stride means a stride of 1. */
177 i = gfc_expr_is_one (e1, -1);
185 i = gfc_expr_is_one (e2, -1);
193 i = gfc_dep_compare_expr (e1, e2);
199 /* The strides match. */
201 /* Check the range start. */
206 /* Use the bound of the array if no bound is specified. */
208 e1 = ar1->as->lower[n];
211 e2 = ar2->as->lower[n];
213 /* Check we have values for both. */
217 i = gfc_dep_compare_expr (e1, e2);
224 /* Check the range end. */
229 /* Use the bound of the array if no bound is specified. */
231 e1 = ar1->as->upper[n];
234 e2 = ar2->as->upper[n];
236 /* Check we have values for both. */
240 i = gfc_dep_compare_expr (e1, e2);
251 /* Some array-returning intrinsics can be implemented by reusing the
252 data from one of the array arguments. For example, TRANSPOSE does
253 not necessarily need to allocate new data: it can be implemented
254 by copying the original array's descriptor and simply swapping the
255 two dimension specifications.
257 If EXPR is a call to such an intrinsic, return the argument
258 whose data can be reused, otherwise return NULL. */
261 gfc_get_noncopying_intrinsic_argument (gfc_expr * expr)
263 if (expr->expr_type != EXPR_FUNCTION || !expr->value.function.isym)
266 switch (expr->value.function.isym->generic_id)
268 case GFC_ISYM_TRANSPOSE:
269 return expr->value.function.actual->expr;
277 /* Return true if the result of reference REF can only be constructed
278 using a temporary array. */
281 gfc_ref_needs_temporary_p (gfc_ref *ref)
287 for (; ref; ref = ref->next)
291 /* Vector dimensions are generally not monotonic and must be
292 handled using a temporary. */
293 if (ref->u.ar.type == AR_SECTION)
294 for (n = 0; n < ref->u.ar.dimen; n++)
295 if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR)
302 /* Within an array reference, character substrings generally
303 need a temporary. Character array strides are expressed as
304 multiples of the element size (consistent with other array
305 types), not in characters. */
316 /* Return true if array variable VAR could be passed to the same function
317 as argument EXPR without interfering with EXPR. INTENT is the intent
320 This is considerably less conservative than other dependencies
321 because many function arguments will already be copied into a
325 gfc_check_argument_var_dependency (gfc_expr * var, sym_intent intent,
328 gcc_assert (var->expr_type == EXPR_VARIABLE);
329 gcc_assert (var->rank > 0);
331 switch (expr->expr_type)
334 return (gfc_ref_needs_temporary_p (expr->ref)
335 || gfc_check_dependency (var, expr, 1));
338 return gfc_check_dependency (var, expr, 1);
341 if (intent != INTENT_IN && expr->inline_noncopying_intrinsic)
343 expr = gfc_get_noncopying_intrinsic_argument (expr);
344 return gfc_check_argument_var_dependency (var, intent, expr);
354 /* Like gfc_check_argument_var_dependency, but extended to any
355 array expression OTHER, not just variables. */
358 gfc_check_argument_dependency (gfc_expr * other, sym_intent intent,
361 switch (other->expr_type)
364 return gfc_check_argument_var_dependency (other, intent, expr);
367 if (other->inline_noncopying_intrinsic)
369 other = gfc_get_noncopying_intrinsic_argument (other);
370 return gfc_check_argument_dependency (other, INTENT_IN, expr);
380 /* Like gfc_check_argument_dependency, but check all the arguments in ACTUAL.
381 FNSYM is the function being called, or NULL if not known. */
384 gfc_check_fncall_dependency (gfc_expr * other, sym_intent intent,
385 gfc_symbol * fnsym, gfc_actual_arglist * actual)
387 gfc_formal_arglist *formal;
390 formal = fnsym ? fnsym->formal : NULL;
391 for (; actual; actual = actual->next, formal = formal ? formal->next : NULL)
395 /* Skip args which are not present. */
399 /* Skip intent(in) arguments if OTHER itself is intent(in). */
401 && intent == INTENT_IN
402 && formal->sym->attr.intent == INTENT_IN)
405 if (gfc_check_argument_dependency (other, intent, expr))
413 /* Return 1 if e1 and e2 are equivalenced arrays, either
414 directly or indirectly; ie. equivalence (a,b) for a and b
415 or equivalence (a,c),(b,c). This function uses the equiv_
416 lists, generated in trans-common(add_equivalences), that are
417 guaranteed to pick up indirect equivalences. A rudimentary
418 use is made of the offset to ensure that cases where the
419 source elements are moved down to the destination are not
420 identified as dependencies. */
423 gfc_are_equivalenced_arrays (gfc_expr *e1, gfc_expr *e2)
426 gfc_equiv_info *s, *fl1, *fl2;
428 gcc_assert (e1->expr_type == EXPR_VARIABLE
429 && e2->expr_type == EXPR_VARIABLE);
431 if (!e1->symtree->n.sym->attr.in_equivalence
432 || !e2->symtree->n.sym->attr.in_equivalence
437 /* Go through the equiv_lists and return 1 if the variables
438 e1 and e2 are members of the same group and satisfy the
439 requirement on their relative offsets. */
440 for (l = gfc_current_ns->equiv_lists; l; l = l->next)
444 for (s = l->equiv; s; s = s->next)
446 if (s->sym == e1->symtree->n.sym)
448 if (s->sym == e2->symtree->n.sym)
450 if (fl1 && fl2 && (fl1->offset > fl2->offset))
458 /* Return true if the statement body redefines the condition. Returns
459 true if expr2 depends on expr1. expr1 should be a single term
460 suitable for the lhs of an assignment. The IDENTICAL flag indicates
461 whether array references to the same symbol with identical range
462 references count as a dependency or not. Used for forall and where
463 statements. Also used with functions returning arrays without a
467 gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, bool identical)
471 gfc_actual_arglist *actual;
473 gcc_assert (expr1->expr_type == EXPR_VARIABLE);
475 /* TODO: -fassume-no-pointer-aliasing */
476 if (expr1->symtree->n.sym->attr.pointer)
478 for (ref = expr1->ref; ref; ref = ref->next)
480 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
484 switch (expr2->expr_type)
487 n = gfc_check_dependency (expr1, expr2->value.op.op1, identical);
490 if (expr2->value.op.op2)
491 return gfc_check_dependency (expr1, expr2->value.op.op2, identical);
495 if (expr2->symtree->n.sym->attr.pointer)
498 for (ref = expr2->ref; ref; ref = ref->next)
500 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
504 /* Return 1 if expr1 and expr2 are equivalenced arrays. */
505 if (gfc_are_equivalenced_arrays (expr1, expr2))
508 if (expr1->symtree->n.sym != expr2->symtree->n.sym)
514 /* Identical and disjoint ranges return 0,
515 overlapping ranges return 1. */
516 /* Return zero if we refer to the same full arrays. */
517 if (expr1->ref->type == REF_ARRAY && expr2->ref->type == REF_ARRAY)
518 return gfc_dep_resolver (expr1->ref, expr2->ref);
523 if (expr2->inline_noncopying_intrinsic)
525 /* Remember possible differences between elemental and
526 transformational functions. All functions inside a FORALL
528 for (actual = expr2->value.function.actual;
529 actual; actual = actual->next)
533 n = gfc_check_dependency (expr1, actual->expr, identical);
543 /* Probably ok in the majority of (constant) cases. */
552 /* Calculates size of the array reference using lower bound, upper bound
556 get_no_of_elements(mpz_t ele, gfc_expr * u1, gfc_expr * l1, gfc_expr * s1)
558 /* nNoOfEle = (u1-l1)/s1 */
560 mpz_sub (ele, u1->value.integer, l1->value.integer);
563 mpz_tdiv_q (ele, ele, s1->value.integer);
567 /* Returns if the ranges ((0..Y), (X1..X2)) overlap. */
569 static gfc_dependency
570 get_deps (mpz_t x1, mpz_t x2, mpz_t y)
575 start = mpz_cmp_ui (x1, 0);
576 end = mpz_cmp (x2, y);
578 /* Both ranges the same. */
579 if (start == 0 && end == 0)
580 return GFC_DEP_EQUAL;
582 /* Distinct ranges. */
583 if ((start < 0 && mpz_cmp_ui (x2, 0) < 0)
584 || (mpz_cmp (x1, y) > 0 && end > 0))
585 return GFC_DEP_NODEP;
587 /* Overlapping, but with corresponding elements of the second range
588 greater than the first. */
589 if (start > 0 && end > 0)
590 return GFC_DEP_FORWARD;
592 /* Overlapping in some other way. */
593 return GFC_DEP_OVERLAP;
597 /* Perform the same linear transformation on sections l and r such that
598 (l_start:l_end:l_stride) -> (0:no_of_elements)
599 (r_start:r_end:r_stride) -> (X1:X2)
600 Where r_end is implicit as both sections must have the same number of
602 Returns 0 on success, 1 of the transformation failed. */
603 /* TODO: Should this be (0:no_of_elements-1) */
606 transform_sections (mpz_t X1, mpz_t X2, mpz_t no_of_elements,
607 gfc_expr * l_start, gfc_expr * l_end, gfc_expr * l_stride,
608 gfc_expr * r_start, gfc_expr * r_stride)
610 if (NULL == l_start || NULL == l_end || NULL == r_start)
613 /* TODO : Currently we check the dependency only when start, end and stride
614 are constant. We could also check for equal (variable) values, and
615 common subexpressions, eg. x vs. x+1. */
617 if (l_end->expr_type != EXPR_CONSTANT
618 || l_start->expr_type != EXPR_CONSTANT
619 || r_start->expr_type != EXPR_CONSTANT
620 || ((NULL != l_stride) && (l_stride->expr_type != EXPR_CONSTANT))
621 || ((NULL != r_stride) && (r_stride->expr_type != EXPR_CONSTANT)))
627 get_no_of_elements (no_of_elements, l_end, l_start, l_stride);
629 mpz_sub (X1, r_start->value.integer, l_start->value.integer);
630 if (l_stride != NULL)
631 mpz_cdiv_q (X1, X1, l_stride->value.integer);
633 if (r_stride == NULL)
634 mpz_set (X2, no_of_elements);
636 mpz_mul (X2, no_of_elements, r_stride->value.integer);
638 if (l_stride != NULL)
639 mpz_cdiv_q (X2, X2, l_stride->value.integer);
640 mpz_add (X2, X2, X1);
646 /* Determines overlapping for two array sections. */
648 static gfc_dependency
649 gfc_check_section_vs_section (gfc_ref * lref, gfc_ref * rref, int n)
661 mpz_t no_of_elements;
668 /* If they are the same range, return without more ado. */
669 if (gfc_is_same_range (&l_ar, &r_ar, n, 0))
670 return GFC_DEP_EQUAL;
672 l_start = l_ar.start[n];
674 l_stride = l_ar.stride[n];
675 r_start = r_ar.start[n];
676 r_stride = r_ar.stride[n];
678 /* if l_start is NULL take it from array specifier */
679 if (NULL == l_start && IS_ARRAY_EXPLICIT(l_ar.as))
680 l_start = l_ar.as->lower[n];
682 /* if l_end is NULL take it from array specifier */
683 if (NULL == l_end && IS_ARRAY_EXPLICIT(l_ar.as))
684 l_end = l_ar.as->upper[n];
686 /* if r_start is NULL take it from array specifier */
687 if (NULL == r_start && IS_ARRAY_EXPLICIT(r_ar.as))
688 r_start = r_ar.as->lower[n];
692 mpz_init (no_of_elements);
694 if (transform_sections (X1, X2, no_of_elements,
695 l_start, l_end, l_stride,
697 dep = GFC_DEP_OVERLAP;
699 dep = get_deps (X1, X2, no_of_elements);
701 mpz_clear (no_of_elements);
708 /* Checks if the expr chk is inside the range left-right.
709 Returns GFC_DEP_NODEP if chk is outside the range,
710 GFC_DEP_OVERLAP otherwise.
711 Assumes left<=right. */
713 static gfc_dependency
714 gfc_is_inside_range (gfc_expr * chk, gfc_expr * left, gfc_expr * right)
720 s = gfc_dep_compare_expr (left, right);
722 return GFC_DEP_OVERLAP;
724 l = gfc_dep_compare_expr (chk, left);
725 r = gfc_dep_compare_expr (chk, right);
727 /* Check for indeterminate relationships. */
728 if (l == -2 || r == -2 || s == -2)
729 return GFC_DEP_OVERLAP;
733 /* When left>right we want to check for right <= chk <= left. */
734 if (l <= 0 || r >= 0)
735 return GFC_DEP_OVERLAP;
739 /* Otherwise check for left <= chk <= right. */
740 if (l >= 0 || r <= 0)
741 return GFC_DEP_OVERLAP;
744 return GFC_DEP_NODEP;
748 /* Determines overlapping for a single element and a section. */
750 static gfc_dependency
751 gfc_check_element_vs_section( gfc_ref * lref, gfc_ref * rref, int n)
761 l_start = l_ar.start[n] ;
762 r_start = r_ar.start[n] ;
763 r_end = r_ar.end[n] ;
764 if (NULL == r_start && IS_ARRAY_EXPLICIT (r_ar.as))
765 r_start = r_ar.as->lower[n];
766 if (NULL == r_end && IS_ARRAY_EXPLICIT (r_ar.as))
767 r_end = r_ar.as->upper[n];
768 if (NULL == r_start || NULL == r_end || l_start == NULL)
769 return GFC_DEP_OVERLAP;
771 return gfc_is_inside_range (l_start, r_end, r_start);
775 /* Determines overlapping for two single element array references. */
777 static gfc_dependency
778 gfc_check_element_vs_element (gfc_ref * lref, gfc_ref * rref, int n)
788 l_start = l_ar.start[n] ;
789 r_start = r_ar.start[n] ;
790 i = gfc_dep_compare_expr (r_start, l_start);
792 return GFC_DEP_EQUAL;
794 return GFC_DEP_OVERLAP;
795 return GFC_DEP_NODEP;
799 /* Finds if two array references are overlapping or not.
801 1 : array references are overlapping.
802 0 : array references are identical or not overlapping. */
805 gfc_dep_resolver (gfc_ref * lref, gfc_ref * rref)
808 gfc_dependency fin_dep;
809 gfc_dependency this_dep;
812 fin_dep = GFC_DEP_ERROR;
813 /* Dependencies due to pointers should already have been identified.
814 We only need to check for overlapping array references. */
818 /* We're resolving from the same base symbol, so both refs should be
819 the same type. We traverse the reference chain intil we find ranges
820 that are not equal. */
821 gcc_assert (lref->type == rref->type);
825 /* The two ranges can't overlap if they are from different
827 if (lref->u.c.component != rref->u.c.component)
832 /* Substring overlaps are handled by the string assignment code. */
836 for (n=0; n < lref->u.ar.dimen; n++)
838 /* Assume dependency when either of array reference is vector
840 if (lref->u.ar.dimen_type[n] == DIMEN_VECTOR
841 || rref->u.ar.dimen_type[n] == DIMEN_VECTOR)
843 if (lref->u.ar.dimen_type[n] == DIMEN_RANGE
844 && rref->u.ar.dimen_type[n] == DIMEN_RANGE)
845 this_dep = gfc_check_section_vs_section (lref, rref, n);
846 else if (lref->u.ar.dimen_type[n] == DIMEN_ELEMENT
847 && rref->u.ar.dimen_type[n] == DIMEN_RANGE)
848 this_dep = gfc_check_element_vs_section (lref, rref, n);
849 else if (rref->u.ar.dimen_type[n] == DIMEN_ELEMENT
850 && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
851 this_dep = gfc_check_element_vs_section (rref, lref, n);
854 gcc_assert (rref->u.ar.dimen_type[n] == DIMEN_ELEMENT
855 && lref->u.ar.dimen_type[n] == DIMEN_ELEMENT);
856 this_dep = gfc_check_element_vs_element (rref, lref, n);
859 /* If any dimension doesn't overlap, we have no dependency. */
860 if (this_dep == GFC_DEP_NODEP)
863 /* Overlap codes are in order of priority. We only need to
864 know the worst one.*/
865 if (this_dep > fin_dep)
868 /* Exactly matching and forward overlapping ranges don't cause a
870 if (fin_dep < GFC_DEP_OVERLAP)
873 /* Keep checking. We only have a dependency if
874 subsequent references also overlap. */
884 /* If we haven't seen any array refs then something went wrong. */
885 gcc_assert (fin_dep != GFC_DEP_ERROR);
887 /* Assume the worst if we nest to different depths. */
891 return fin_dep == GFC_DEP_OVERLAP;