Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / gcc / fortran / dependency.c
1 /* Dependency analysis
2    Copyright (C) 2000-2013 Free Software Foundation, Inc.
3    Contributed by Paul Brook <paul@nowt.org>
4
5 This file is part of GCC.
6
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 3, or (at your option) any later
10 version.
11
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
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 /* dependency.c -- Expression dependency analysis code.  */
22 /* There's probably quite a bit of duplication in this file.  We currently
23    have different dependency checking functions for different types
24    if dependencies.  Ideally these would probably be merged.  */
25    
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "gfortran.h"
30 #include "dependency.h"
31 #include "constructor.h"
32 #include "arith.h"
33
34 /* static declarations */
35 /* Enums  */
36 enum range {LHS, RHS, MID};
37
38 /* Dependency types.  These must be in reverse order of priority.  */
39 typedef enum
40 {
41   GFC_DEP_ERROR,
42   GFC_DEP_EQUAL,        /* Identical Ranges.  */
43   GFC_DEP_FORWARD,      /* e.g., a(1:3) = a(2:4).  */
44   GFC_DEP_BACKWARD,     /* e.g. a(2:4) = a(1:3).  */
45   GFC_DEP_OVERLAP,      /* May overlap in some other way.  */
46   GFC_DEP_NODEP         /* Distinct ranges.  */
47 }
48 gfc_dependency;
49
50 /* Macros */
51 #define IS_ARRAY_EXPLICIT(as) ((as->type == AS_EXPLICIT ? 1 : 0))
52
53 /* Forward declarations */
54
55 static gfc_dependency check_section_vs_section (gfc_array_ref *,
56                                                 gfc_array_ref *, int);
57
58 /* Returns 1 if the expr is an integer constant value 1, 0 if it is not or
59    def if the value could not be determined.  */
60
61 int
62 gfc_expr_is_one (gfc_expr *expr, int def)
63 {
64   gcc_assert (expr != NULL);
65
66   if (expr->expr_type != EXPR_CONSTANT)
67     return def;
68
69   if (expr->ts.type != BT_INTEGER)
70     return def;
71
72   return mpz_cmp_si (expr->value.integer, 1) == 0;
73 }
74
75 /* Check if two array references are known to be identical.  Calls
76    gfc_dep_compare_expr if necessary for comparing array indices.  */
77
78 static bool
79 identical_array_ref (gfc_array_ref *a1, gfc_array_ref *a2)
80 {
81   int i;
82
83   if (a1->type == AR_FULL && a2->type == AR_FULL)
84     return true;
85
86   if (a1->type == AR_SECTION && a2->type == AR_SECTION)
87     {
88       gcc_assert (a1->dimen == a2->dimen);
89
90       for ( i = 0; i < a1->dimen; i++)
91         {
92           /* TODO: Currently, we punt on an integer array as an index.  */
93           if (a1->dimen_type[i] != DIMEN_RANGE
94               || a2->dimen_type[i] != DIMEN_RANGE)
95             return false;
96
97           if (check_section_vs_section (a1, a2, i) != GFC_DEP_EQUAL)
98             return false;
99         }
100       return true;
101     }
102
103   if (a1->type == AR_ELEMENT && a2->type == AR_ELEMENT)
104     {
105       gcc_assert (a1->dimen == a2->dimen);
106       for (i = 0; i < a1->dimen; i++)
107         {
108           if (gfc_dep_compare_expr (a1->start[i], a2->start[i]) != 0)
109             return false;
110         }
111       return true;
112     }
113   return false;
114 }
115
116
117
118 /* Return true for identical variables, checking for references if
119    necessary.  Calls identical_array_ref for checking array sections.  */
120
121 static bool
122 are_identical_variables (gfc_expr *e1, gfc_expr *e2)
123 {
124   gfc_ref *r1, *r2;
125
126   if (e1->symtree->n.sym->attr.dummy && e2->symtree->n.sym->attr.dummy)
127     {
128       /* Dummy arguments: Only check for equal names.  */
129       if (e1->symtree->n.sym->name != e2->symtree->n.sym->name)
130         return false;
131     }
132   else
133     {
134       /* Check for equal symbols.  */
135       if (e1->symtree->n.sym != e2->symtree->n.sym)
136         return false;
137     }
138
139   /* Volatile variables should never compare equal to themselves.  */
140
141   if (e1->symtree->n.sym->attr.volatile_)
142     return false;
143
144   r1 = e1->ref;
145   r2 = e2->ref;
146
147   while (r1 != NULL || r2 != NULL)
148     {
149
150       /* Assume the variables are not equal if one has a reference and the
151          other doesn't.
152          TODO: Handle full references like comparing a(:) to a.
153       */
154
155       if (r1 == NULL || r2 == NULL)
156         return false;
157
158       if (r1->type != r2->type)
159         return false;
160
161       switch (r1->type)
162         {
163
164         case REF_ARRAY:
165           if (!identical_array_ref (&r1->u.ar,  &r2->u.ar))
166             return false;
167
168           break;
169
170         case REF_COMPONENT:
171           if (r1->u.c.component != r2->u.c.component)
172             return false;
173           break;
174
175         case REF_SUBSTRING:
176           if (gfc_dep_compare_expr (r1->u.ss.start, r2->u.ss.start) != 0)
177             return false;
178
179           /* If both are NULL, the end length compares equal, because we
180              are looking at the same variable. This can only happen for
181              assumed- or deferred-length character arguments.  */ 
182
183           if (r1->u.ss.end == NULL && r2->u.ss.end == NULL)
184             break;
185
186           if (gfc_dep_compare_expr (r1->u.ss.end, r2->u.ss.end) != 0)
187             return false;
188           
189           break;
190
191         default:
192           gfc_internal_error ("are_identical_variables: Bad type");
193         }
194       r1 = r1->next;
195       r2 = r2->next;
196     }
197   return true;
198 }
199
200 /* Compare two functions for equality.  Returns 0 if e1==e2, -2 otherwise.  If
201    impure_ok is false, only return 0 for pure functions.  */
202
203 int
204 gfc_dep_compare_functions (gfc_expr *e1, gfc_expr *e2, bool impure_ok)
205 {
206
207   gfc_actual_arglist *args1;
208   gfc_actual_arglist *args2;
209   
210   if (e1->expr_type != EXPR_FUNCTION || e2->expr_type != EXPR_FUNCTION)
211     return -2;
212
213   if ((e1->value.function.esym && e2->value.function.esym
214        && e1->value.function.esym == e2->value.function.esym
215        && (e1->value.function.esym->result->attr.pure || impure_ok))
216        || (e1->value.function.isym && e2->value.function.isym
217            && e1->value.function.isym == e2->value.function.isym
218            && (e1->value.function.isym->pure || impure_ok)))
219     {
220       args1 = e1->value.function.actual;
221       args2 = e2->value.function.actual;
222
223       /* Compare the argument lists for equality.  */
224       while (args1 && args2)
225         {
226           /*  Bitwise xor, since C has no non-bitwise xor operator.  */
227           if ((args1->expr == NULL) ^ (args2->expr == NULL))
228             return -2;
229           
230           if (args1->expr != NULL && args2->expr != NULL
231               && gfc_dep_compare_expr (args1->expr, args2->expr) != 0)
232             return -2;
233           
234           args1 = args1->next;
235           args2 = args2->next;
236         }
237       return (args1 || args2) ? -2 : 0;
238     }
239       else
240         return -2;      
241 }
242
243 /* Compare two expressions.  Return values:
244    * +1 if e1 > e2
245    * 0 if e1 == e2
246    * -1 if e1 < e2
247    * -2 if the relationship could not be determined
248    * -3 if e1 /= e2, but we cannot tell which one is larger.
249    REAL and COMPLEX constants are only compared for equality
250    or inequality; if they are unequal, -2 is returned in all cases.  */
251
252 int
253 gfc_dep_compare_expr (gfc_expr *e1, gfc_expr *e2)
254 {
255   gfc_actual_arglist *args1;
256   gfc_actual_arglist *args2;
257   int i;
258   gfc_expr *n1, *n2;
259
260   n1 = NULL;
261   n2 = NULL;
262
263   if (e1 == NULL && e2 == NULL)
264     return 0;
265
266   /* Remove any integer conversion functions to larger types.  */
267   if (e1->expr_type == EXPR_FUNCTION && e1->value.function.isym
268       && e1->value.function.isym->id == GFC_ISYM_CONVERSION
269       && e1->ts.type == BT_INTEGER)
270     {
271       args1 = e1->value.function.actual;
272       if (args1->expr->ts.type == BT_INTEGER
273           && e1->ts.kind > args1->expr->ts.kind)
274         n1 = args1->expr;
275     }
276
277   if (e2->expr_type == EXPR_FUNCTION && e2->value.function.isym
278       && e2->value.function.isym->id == GFC_ISYM_CONVERSION
279       && e2->ts.type == BT_INTEGER)
280     {
281       args2 = e2->value.function.actual;
282       if (args2->expr->ts.type == BT_INTEGER
283           && e2->ts.kind > args2->expr->ts.kind)
284         n2 = args2->expr;
285     }
286
287   if (n1 != NULL)
288     {
289       if (n2 != NULL)
290         return gfc_dep_compare_expr (n1, n2);
291       else
292         return gfc_dep_compare_expr (n1, e2);
293     }
294   else
295     {
296       if (n2 != NULL)
297         return gfc_dep_compare_expr (e1, n2);
298     }
299   
300   if (e1->expr_type == EXPR_OP
301       && (e1->value.op.op == INTRINSIC_UPLUS
302           || e1->value.op.op == INTRINSIC_PARENTHESES))
303     return gfc_dep_compare_expr (e1->value.op.op1, e2);
304   if (e2->expr_type == EXPR_OP
305       && (e2->value.op.op == INTRINSIC_UPLUS
306           || e2->value.op.op == INTRINSIC_PARENTHESES))
307     return gfc_dep_compare_expr (e1, e2->value.op.op1);
308
309   if (e1->expr_type == EXPR_OP && e1->value.op.op == INTRINSIC_PLUS)
310     {
311       /* Compare X+C vs. X, for INTEGER only.  */
312       if (e1->value.op.op2->expr_type == EXPR_CONSTANT
313           && e1->value.op.op2->ts.type == BT_INTEGER
314           && gfc_dep_compare_expr (e1->value.op.op1, e2) == 0)
315         return mpz_sgn (e1->value.op.op2->value.integer);
316
317       /* Compare P+Q vs. R+S.  */
318       if (e2->expr_type == EXPR_OP && e2->value.op.op == INTRINSIC_PLUS)
319         {
320           int l, r;
321
322           l = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
323           r = gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2);
324           if (l == 0 && r == 0)
325             return 0;
326           if (l == 0 && r > -2)
327             return r;
328           if (l > -2 && r == 0)
329             return l;
330           if (l == 1 && r == 1)
331             return 1;
332           if (l == -1 && r == -1)
333             return -1;
334
335           l = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op2);
336           r = gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op1);
337           if (l == 0 && r == 0)
338             return 0;
339           if (l == 0 && r > -2)
340             return r;
341           if (l > -2 && r == 0)
342             return l;
343           if (l == 1 && r == 1)
344             return 1;
345           if (l == -1 && r == -1)
346             return -1;
347         }
348     }
349
350   /* Compare X vs. X+C, for INTEGER only.  */
351   if (e2->expr_type == EXPR_OP && e2->value.op.op == INTRINSIC_PLUS)
352     {
353       if (e2->value.op.op2->expr_type == EXPR_CONSTANT
354           && e2->value.op.op2->ts.type == BT_INTEGER
355           && gfc_dep_compare_expr (e1, e2->value.op.op1) == 0)
356         return -mpz_sgn (e2->value.op.op2->value.integer);
357     }
358
359   /* Compare X-C vs. X, for INTEGER only.  */
360   if (e1->expr_type == EXPR_OP && e1->value.op.op == INTRINSIC_MINUS)
361     {
362       if (e1->value.op.op2->expr_type == EXPR_CONSTANT
363           && e1->value.op.op2->ts.type == BT_INTEGER
364           && gfc_dep_compare_expr (e1->value.op.op1, e2) == 0)
365         return -mpz_sgn (e1->value.op.op2->value.integer);
366
367       /* Compare P-Q vs. R-S.  */
368       if (e2->expr_type == EXPR_OP && e2->value.op.op == INTRINSIC_MINUS)
369         {
370           int l, r;
371
372           l = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
373           r = gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2);
374           if (l == 0 && r == 0)
375             return 0;
376           if (l > -2 && r == 0)
377             return l;
378           if (l == 0 && r > -2)
379             return -r;
380           if (l == 1 && r == -1)
381             return 1;
382           if (l == -1 && r == 1)
383             return -1;
384         }
385     }
386
387   /* Compare A // B vs. C // D.  */
388
389   if (e1->expr_type == EXPR_OP && e1->value.op.op == INTRINSIC_CONCAT
390       && e2->expr_type == EXPR_OP && e2->value.op.op == INTRINSIC_CONCAT)
391     {
392       int l, r;
393
394       l = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
395       r = gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2);
396
397       if (l != 0)
398         return l;
399
400       /* Left expressions of // compare equal, but
401          watch out for 'A ' // x vs. 'A' // x.  */
402       gfc_expr *e1_left = e1->value.op.op1;
403       gfc_expr *e2_left = e2->value.op.op1;
404
405       if (e1_left->expr_type == EXPR_CONSTANT
406           && e2_left->expr_type == EXPR_CONSTANT
407           && e1_left->value.character.length
408           != e2_left->value.character.length)
409         return -2;
410       else
411         return r;
412     }
413
414   /* Compare X vs. X-C, for INTEGER only.  */
415   if (e2->expr_type == EXPR_OP && e2->value.op.op == INTRINSIC_MINUS)
416     {
417       if (e2->value.op.op2->expr_type == EXPR_CONSTANT
418           && e2->value.op.op2->ts.type == BT_INTEGER
419           && gfc_dep_compare_expr (e1, e2->value.op.op1) == 0)
420         return mpz_sgn (e2->value.op.op2->value.integer);
421     }
422
423   if (e1->expr_type != e2->expr_type)
424     return -3;
425
426   switch (e1->expr_type)
427     {
428     case EXPR_CONSTANT:
429       /* Compare strings for equality.  */
430       if (e1->ts.type == BT_CHARACTER && e2->ts.type == BT_CHARACTER)
431         return gfc_compare_string (e1, e2);
432
433       /* Compare REAL and COMPLEX constants.  Because of the
434          traps and pitfalls associated with comparing
435          a + 1.0 with a + 0.5, check for equality only.  */
436       if (e2->expr_type == EXPR_CONSTANT)
437         {
438           if (e1->ts.type == BT_REAL && e2->ts.type == BT_REAL)
439             {
440               if (mpfr_cmp (e1->value.real, e2->value.real) == 0)
441                 return 0;
442               else
443                 return -2;
444             }
445           else if (e1->ts.type == BT_COMPLEX && e2->ts.type == BT_COMPLEX)
446             {
447               if (mpc_cmp (e1->value.complex, e2->value.complex) == 0)
448                 return 0;
449               else
450                 return -2;
451             }
452         }
453
454       if (e1->ts.type != BT_INTEGER || e2->ts.type != BT_INTEGER)
455         return -2;
456
457       /* For INTEGER, all cases where e2 is not constant should have
458          been filtered out above.  */
459       gcc_assert (e2->expr_type == EXPR_CONSTANT);
460
461       i = mpz_cmp (e1->value.integer, e2->value.integer);
462       if (i == 0)
463         return 0;
464       else if (i < 0)
465         return -1;
466       return 1;
467
468     case EXPR_VARIABLE:
469       if (are_identical_variables (e1, e2))
470         return 0;
471       else
472         return -3;
473
474     case EXPR_OP:
475       /* Intrinsic operators are the same if their operands are the same.  */
476       if (e1->value.op.op != e2->value.op.op)
477         return -2;
478       if (e1->value.op.op2 == 0)
479         {
480           i = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1);
481           return i == 0 ? 0 : -2;
482         }
483       if (gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1) == 0
484           && gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2) == 0)
485         return 0;
486       else if (e1->value.op.op == INTRINSIC_TIMES
487                && gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op2) == 0
488                && gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op1) == 0)
489         /* Commutativity of multiplication; addition is handled above.  */
490         return 0;
491
492       return -2;
493
494     case EXPR_FUNCTION:
495       return gfc_dep_compare_functions (e1, e2, false);
496       break;
497
498     default:
499       return -2;
500     }
501 }
502
503
504 /* Returns 1 if the two ranges are the same and 0 if they are not (or if the
505    results are indeterminate). 'n' is the dimension to compare.  */
506
507 static int
508 is_same_range (gfc_array_ref *ar1, gfc_array_ref *ar2, int n)
509 {
510   gfc_expr *e1;
511   gfc_expr *e2;
512   int i;
513
514   /* TODO: More sophisticated range comparison.  */
515   gcc_assert (ar1 && ar2);
516
517   gcc_assert (ar1->dimen_type[n] == ar2->dimen_type[n]);
518
519   e1 = ar1->stride[n];
520   e2 = ar2->stride[n];
521   /* Check for mismatching strides.  A NULL stride means a stride of 1.  */
522   if (e1 && !e2)
523     {
524       i = gfc_expr_is_one (e1, -1);
525       if (i == -1 || i == 0)
526         return 0;
527     }
528   else if (e2 && !e1)
529     {
530       i = gfc_expr_is_one (e2, -1);
531       if (i == -1 || i == 0)
532         return 0;
533     }
534   else if (e1 && e2)
535     {
536       i = gfc_dep_compare_expr (e1, e2);
537       if (i != 0)
538         return 0;
539     }
540   /* The strides match.  */
541
542   /* Check the range start.  */
543   e1 = ar1->start[n];
544   e2 = ar2->start[n];
545   if (e1 || e2)
546     {
547       /* Use the bound of the array if no bound is specified.  */
548       if (ar1->as && !e1)
549         e1 = ar1->as->lower[n];
550
551       if (ar2->as && !e2)
552         e2 = ar2->as->lower[n];
553
554       /* Check we have values for both.  */
555       if (!(e1 && e2))
556         return 0;
557
558       i = gfc_dep_compare_expr (e1, e2);
559       if (i != 0)
560         return 0;
561     }
562
563   /* Check the range end.  */
564   e1 = ar1->end[n];
565   e2 = ar2->end[n];
566   if (e1 || e2)
567     {
568       /* Use the bound of the array if no bound is specified.  */
569       if (ar1->as && !e1)
570         e1 = ar1->as->upper[n];
571
572       if (ar2->as && !e2)
573         e2 = ar2->as->upper[n];
574
575       /* Check we have values for both.  */
576       if (!(e1 && e2))
577         return 0;
578
579       i = gfc_dep_compare_expr (e1, e2);
580       if (i != 0)
581         return 0;
582     }
583
584   return 1;
585 }
586
587
588 /* Some array-returning intrinsics can be implemented by reusing the
589    data from one of the array arguments.  For example, TRANSPOSE does
590    not necessarily need to allocate new data: it can be implemented
591    by copying the original array's descriptor and simply swapping the
592    two dimension specifications.
593
594    If EXPR is a call to such an intrinsic, return the argument
595    whose data can be reused, otherwise return NULL.  */
596
597 gfc_expr *
598 gfc_get_noncopying_intrinsic_argument (gfc_expr *expr)
599 {
600   if (expr->expr_type != EXPR_FUNCTION || !expr->value.function.isym)
601     return NULL;
602
603   switch (expr->value.function.isym->id)
604     {
605     case GFC_ISYM_TRANSPOSE:
606       return expr->value.function.actual->expr;
607
608     default:
609       return NULL;
610     }
611 }
612
613
614 /* Return true if the result of reference REF can only be constructed
615    using a temporary array.  */
616
617 bool
618 gfc_ref_needs_temporary_p (gfc_ref *ref)
619 {
620   int n;
621   bool subarray_p;
622
623   subarray_p = false;
624   for (; ref; ref = ref->next)
625     switch (ref->type)
626       {
627       case REF_ARRAY:
628         /* Vector dimensions are generally not monotonic and must be
629            handled using a temporary.  */
630         if (ref->u.ar.type == AR_SECTION)
631           for (n = 0; n < ref->u.ar.dimen; n++)
632             if (ref->u.ar.dimen_type[n] == DIMEN_VECTOR)
633               return true;
634
635         subarray_p = true;
636         break;
637
638       case REF_SUBSTRING:
639         /* Within an array reference, character substrings generally
640            need a temporary.  Character array strides are expressed as
641            multiples of the element size (consistent with other array
642            types), not in characters.  */
643         return subarray_p;
644
645       case REF_COMPONENT:
646         break;
647       }
648
649   return false;
650 }
651
652
653 static int
654 gfc_is_data_pointer (gfc_expr *e)
655 {
656   gfc_ref *ref;
657
658   if (e->expr_type != EXPR_VARIABLE && e->expr_type != EXPR_FUNCTION)
659     return 0;
660
661   /* No subreference if it is a function  */
662   gcc_assert (e->expr_type == EXPR_VARIABLE || !e->ref);
663
664   if (e->symtree->n.sym->attr.pointer)
665     return 1;
666
667   for (ref = e->ref; ref; ref = ref->next)
668     if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
669       return 1;
670
671   return 0;
672 }
673
674
675 /* Return true if array variable VAR could be passed to the same function
676    as argument EXPR without interfering with EXPR.  INTENT is the intent
677    of VAR.
678
679    This is considerably less conservative than other dependencies
680    because many function arguments will already be copied into a
681    temporary.  */
682
683 static int
684 gfc_check_argument_var_dependency (gfc_expr *var, sym_intent intent,
685                                    gfc_expr *expr, gfc_dep_check elemental)
686 {
687   gfc_expr *arg;
688
689   gcc_assert (var->expr_type == EXPR_VARIABLE);
690   gcc_assert (var->rank > 0);
691
692   switch (expr->expr_type)
693     {
694     case EXPR_VARIABLE:
695       /* In case of elemental subroutines, there is no dependency 
696          between two same-range array references.  */
697       if (gfc_ref_needs_temporary_p (expr->ref)
698           || gfc_check_dependency (var, expr, elemental == NOT_ELEMENTAL))
699         {
700           if (elemental == ELEM_DONT_CHECK_VARIABLE)
701             {
702               /* Too many false positive with pointers.  */
703               if (!gfc_is_data_pointer (var) && !gfc_is_data_pointer (expr))
704                 {
705                   /* Elemental procedures forbid unspecified intents, 
706                      and we don't check dependencies for INTENT_IN args.  */
707                   gcc_assert (intent == INTENT_OUT || intent == INTENT_INOUT);
708
709                   /* We are told not to check dependencies. 
710                      We do it, however, and issue a warning in case we find one.
711                      If a dependency is found in the case 
712                      elemental == ELEM_CHECK_VARIABLE, we will generate
713                      a temporary, so we don't need to bother the user.  */
714                   gfc_warning ("INTENT(%s) actual argument at %L might "
715                                "interfere with actual argument at %L.", 
716                                intent == INTENT_OUT ? "OUT" : "INOUT", 
717                                &var->where, &expr->where);
718                 }
719               return 0;
720             }
721           else
722             return 1; 
723         }
724       return 0;
725
726     case EXPR_ARRAY:
727       return gfc_check_dependency (var, expr, 1);
728
729     case EXPR_FUNCTION:
730       if (intent != INTENT_IN)
731         {
732           arg = gfc_get_noncopying_intrinsic_argument (expr);
733           if (arg != NULL)
734             return gfc_check_argument_var_dependency (var, intent, arg,
735                                                       NOT_ELEMENTAL);
736         }
737
738       if (elemental != NOT_ELEMENTAL)
739         {
740           if ((expr->value.function.esym
741                && expr->value.function.esym->attr.elemental)
742               || (expr->value.function.isym
743                   && expr->value.function.isym->elemental))
744             return gfc_check_fncall_dependency (var, intent, NULL,
745                                                 expr->value.function.actual,
746                                                 ELEM_CHECK_VARIABLE);
747
748           if (gfc_inline_intrinsic_function_p (expr))
749             {
750               /* The TRANSPOSE case should have been caught in the
751                  noncopying intrinsic case above.  */
752               gcc_assert (expr->value.function.isym->id != GFC_ISYM_TRANSPOSE);
753
754               return gfc_check_fncall_dependency (var, intent, NULL,
755                                                   expr->value.function.actual,
756                                                   ELEM_CHECK_VARIABLE);
757             }
758         }
759       return 0;
760
761     case EXPR_OP:
762       /* In case of non-elemental procedures, there is no need to catch
763          dependencies, as we will make a temporary anyway.  */
764       if (elemental)
765         {
766           /* If the actual arg EXPR is an expression, we need to catch 
767              a dependency between variables in EXPR and VAR, 
768              an intent((IN)OUT) variable.  */
769           if (expr->value.op.op1
770               && gfc_check_argument_var_dependency (var, intent, 
771                                                     expr->value.op.op1, 
772                                                     ELEM_CHECK_VARIABLE))
773             return 1;
774           else if (expr->value.op.op2
775                    && gfc_check_argument_var_dependency (var, intent, 
776                                                          expr->value.op.op2, 
777                                                          ELEM_CHECK_VARIABLE))
778             return 1;
779         }
780       return 0;
781
782     default:
783       return 0;
784     }
785 }
786   
787   
788 /* Like gfc_check_argument_var_dependency, but extended to any
789    array expression OTHER, not just variables.  */
790
791 static int
792 gfc_check_argument_dependency (gfc_expr *other, sym_intent intent,
793                                gfc_expr *expr, gfc_dep_check elemental)
794 {
795   switch (other->expr_type)
796     {
797     case EXPR_VARIABLE:
798       return gfc_check_argument_var_dependency (other, intent, expr, elemental);
799
800     case EXPR_FUNCTION:
801       other = gfc_get_noncopying_intrinsic_argument (other);
802       if (other != NULL)
803         return gfc_check_argument_dependency (other, INTENT_IN, expr,
804                                               NOT_ELEMENTAL);
805
806       return 0;
807
808     default:
809       return 0;
810     }
811 }
812
813
814 /* Like gfc_check_argument_dependency, but check all the arguments in ACTUAL.
815    FNSYM is the function being called, or NULL if not known.  */
816
817 int
818 gfc_check_fncall_dependency (gfc_expr *other, sym_intent intent,
819                              gfc_symbol *fnsym, gfc_actual_arglist *actual,
820                              gfc_dep_check elemental)
821 {
822   gfc_formal_arglist *formal;
823   gfc_expr *expr;
824
825   formal = fnsym ? gfc_sym_get_dummy_args (fnsym) : NULL;
826   for (; actual; actual = actual->next, formal = formal ? formal->next : NULL)
827     {
828       expr = actual->expr;
829
830       /* Skip args which are not present.  */
831       if (!expr)
832         continue;
833
834       /* Skip other itself.  */
835       if (expr == other)
836         continue;
837
838       /* Skip intent(in) arguments if OTHER itself is intent(in).  */
839       if (formal && intent == INTENT_IN
840           && formal->sym->attr.intent == INTENT_IN)
841         continue;
842
843       if (gfc_check_argument_dependency (other, intent, expr, elemental))
844         return 1;
845     }
846
847   return 0;
848 }
849
850
851 /* Return 1 if e1 and e2 are equivalenced arrays, either
852    directly or indirectly; i.e., equivalence (a,b) for a and b
853    or equivalence (a,c),(b,c).  This function uses the equiv_
854    lists, generated in trans-common(add_equivalences), that are
855    guaranteed to pick up indirect equivalences.  We explicitly
856    check for overlap using the offset and length of the equivalence.
857    This function is symmetric.
858    TODO: This function only checks whether the full top-level
859    symbols overlap.  An improved implementation could inspect
860    e1->ref and e2->ref to determine whether the actually accessed
861    portions of these variables/arrays potentially overlap.  */
862
863 int
864 gfc_are_equivalenced_arrays (gfc_expr *e1, gfc_expr *e2)
865 {
866   gfc_equiv_list *l;
867   gfc_equiv_info *s, *fl1, *fl2;
868
869   gcc_assert (e1->expr_type == EXPR_VARIABLE
870               && e2->expr_type == EXPR_VARIABLE);
871
872   if (!e1->symtree->n.sym->attr.in_equivalence
873       || !e2->symtree->n.sym->attr.in_equivalence|| !e1->rank || !e2->rank)
874     return 0;
875
876   if (e1->symtree->n.sym->ns
877         && e1->symtree->n.sym->ns != gfc_current_ns)
878     l = e1->symtree->n.sym->ns->equiv_lists;
879   else
880     l = gfc_current_ns->equiv_lists;
881
882   /* Go through the equiv_lists and return 1 if the variables
883      e1 and e2 are members of the same group and satisfy the
884      requirement on their relative offsets.  */
885   for (; l; l = l->next)
886     {
887       fl1 = NULL;
888       fl2 = NULL;
889       for (s = l->equiv; s; s = s->next)
890         {
891           if (s->sym == e1->symtree->n.sym)
892             {
893               fl1 = s;
894               if (fl2)
895                 break;
896             }
897           if (s->sym == e2->symtree->n.sym)
898             {
899               fl2 = s;
900               if (fl1)
901                 break;
902             }
903         }
904
905       if (s)
906         {
907           /* Can these lengths be zero?  */
908           if (fl1->length <= 0 || fl2->length <= 0)
909             return 1;
910           /* These can't overlap if [f11,fl1+length] is before 
911              [fl2,fl2+length], or [fl2,fl2+length] is before
912              [fl1,fl1+length], otherwise they do overlap.  */
913           if (fl1->offset + fl1->length > fl2->offset
914               && fl2->offset + fl2->length > fl1->offset)
915             return 1;
916         }
917     }
918   return 0;
919 }
920
921
922 /* Return true if there is no possibility of aliasing because of a type
923    mismatch between all the possible pointer references and the
924    potential target.  Note that this function is asymmetric in the
925    arguments and so must be called twice with the arguments exchanged.  */
926
927 static bool
928 check_data_pointer_types (gfc_expr *expr1, gfc_expr *expr2)
929 {
930   gfc_component *cm1;
931   gfc_symbol *sym1;
932   gfc_symbol *sym2;
933   gfc_ref *ref1;
934   bool seen_component_ref;
935
936   if (expr1->expr_type != EXPR_VARIABLE
937         || expr1->expr_type != EXPR_VARIABLE)
938     return false;
939
940   sym1 = expr1->symtree->n.sym;
941   sym2 = expr2->symtree->n.sym;
942
943   /* Keep it simple for now.  */
944   if (sym1->ts.type == BT_DERIVED && sym2->ts.type == BT_DERIVED)
945     return false;
946
947   if (sym1->attr.pointer)
948     {
949       if (gfc_compare_types (&sym1->ts, &sym2->ts))
950         return false;
951     }
952
953   /* This is a conservative check on the components of the derived type
954      if no component references have been seen.  Since we will not dig
955      into the components of derived type components, we play it safe by
956      returning false.  First we check the reference chain and then, if
957      no component references have been seen, the components.  */
958   seen_component_ref = false;
959   if (sym1->ts.type == BT_DERIVED)
960     {
961       for (ref1 = expr1->ref; ref1; ref1 = ref1->next)
962         {
963           if (ref1->type != REF_COMPONENT)
964             continue;
965
966           if (ref1->u.c.component->ts.type == BT_DERIVED)
967             return false;
968
969           if ((sym2->attr.pointer || ref1->u.c.component->attr.pointer)
970                 && gfc_compare_types (&ref1->u.c.component->ts, &sym2->ts))
971             return false;
972
973           seen_component_ref = true;
974         }
975     }
976
977   if (sym1->ts.type == BT_DERIVED && !seen_component_ref)
978     {
979       for (cm1 = sym1->ts.u.derived->components; cm1; cm1 = cm1->next)
980         {
981           if (cm1->ts.type == BT_DERIVED)
982             return false;
983
984           if ((sym2->attr.pointer || cm1->attr.pointer)
985                 && gfc_compare_types (&cm1->ts, &sym2->ts))
986             return false;
987         }
988     }
989
990   return true;
991 }
992
993
994 /* Return true if the statement body redefines the condition.  Returns
995    true if expr2 depends on expr1.  expr1 should be a single term
996    suitable for the lhs of an assignment.  The IDENTICAL flag indicates
997    whether array references to the same symbol with identical range
998    references count as a dependency or not.  Used for forall and where
999    statements.  Also used with functions returning arrays without a
1000    temporary.  */
1001
1002 int
1003 gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical)
1004 {
1005   gfc_actual_arglist *actual;
1006   gfc_constructor *c;
1007   int n;
1008
1009   gcc_assert (expr1->expr_type == EXPR_VARIABLE);
1010
1011   switch (expr2->expr_type)
1012     {
1013     case EXPR_OP:
1014       n = gfc_check_dependency (expr1, expr2->value.op.op1, identical);
1015       if (n)
1016         return n;
1017       if (expr2->value.op.op2)
1018         return gfc_check_dependency (expr1, expr2->value.op.op2, identical);
1019       return 0;
1020
1021     case EXPR_VARIABLE:
1022       /* The interesting cases are when the symbols don't match.  */
1023       if (expr1->symtree->n.sym != expr2->symtree->n.sym)
1024         {
1025           gfc_typespec *ts1 = &expr1->symtree->n.sym->ts;
1026           gfc_typespec *ts2 = &expr2->symtree->n.sym->ts;
1027
1028           /* Return 1 if expr1 and expr2 are equivalenced arrays.  */
1029           if (gfc_are_equivalenced_arrays (expr1, expr2))
1030             return 1;
1031
1032           /* Symbols can only alias if they have the same type.  */
1033           if (ts1->type != BT_UNKNOWN && ts2->type != BT_UNKNOWN
1034               && ts1->type != BT_DERIVED && ts2->type != BT_DERIVED)
1035             {
1036               if (ts1->type != ts2->type || ts1->kind != ts2->kind)
1037                 return 0;
1038             }
1039
1040           /* If either variable is a pointer, assume the worst.  */
1041           /* TODO: -fassume-no-pointer-aliasing */
1042           if (gfc_is_data_pointer (expr1) || gfc_is_data_pointer (expr2))
1043             {
1044               if (check_data_pointer_types (expr1, expr2)
1045                     && check_data_pointer_types (expr2, expr1))
1046                 return 0;
1047
1048               return 1;
1049             }
1050           else
1051             {
1052               gfc_symbol *sym1 = expr1->symtree->n.sym;
1053               gfc_symbol *sym2 = expr2->symtree->n.sym;
1054               if (sym1->attr.target && sym2->attr.target
1055                   && ((sym1->attr.dummy && !sym1->attr.contiguous
1056                        && (!sym1->attr.dimension
1057                            || sym2->as->type == AS_ASSUMED_SHAPE))
1058                       || (sym2->attr.dummy && !sym2->attr.contiguous
1059                           && (!sym2->attr.dimension
1060                               || sym2->as->type == AS_ASSUMED_SHAPE))))
1061                 return 1;
1062             }
1063
1064           /* Otherwise distinct symbols have no dependencies.  */
1065           return 0;
1066         }
1067
1068       if (identical)
1069         return 1;
1070
1071       /* Identical and disjoint ranges return 0,
1072          overlapping ranges return 1.  */
1073       if (expr1->ref && expr2->ref)
1074         return gfc_dep_resolver (expr1->ref, expr2->ref, NULL);
1075
1076       return 1;
1077
1078     case EXPR_FUNCTION:
1079       if (gfc_get_noncopying_intrinsic_argument (expr2) != NULL)
1080         identical = 1;
1081
1082       /* Remember possible differences between elemental and
1083          transformational functions.  All functions inside a FORALL
1084          will be pure.  */
1085       for (actual = expr2->value.function.actual;
1086            actual; actual = actual->next)
1087         {
1088           if (!actual->expr)
1089             continue;
1090           n = gfc_check_dependency (expr1, actual->expr, identical);
1091           if (n)
1092             return n;
1093         }
1094       return 0;
1095
1096     case EXPR_CONSTANT:
1097     case EXPR_NULL:
1098       return 0;
1099
1100     case EXPR_ARRAY:
1101       /* Loop through the array constructor's elements.  */
1102       for (c = gfc_constructor_first (expr2->value.constructor);
1103            c; c = gfc_constructor_next (c))
1104         {
1105           /* If this is an iterator, assume the worst.  */
1106           if (c->iterator)
1107             return 1;
1108           /* Avoid recursion in the common case.  */
1109           if (c->expr->expr_type == EXPR_CONSTANT)
1110             continue;
1111           if (gfc_check_dependency (expr1, c->expr, 1))
1112             return 1;
1113         }
1114       return 0;
1115
1116     default:
1117       return 1;
1118     }
1119 }
1120
1121
1122 /* Determines overlapping for two array sections.  */
1123
1124 static gfc_dependency
1125 check_section_vs_section (gfc_array_ref *l_ar, gfc_array_ref *r_ar, int n)
1126 {
1127   gfc_expr *l_start;
1128   gfc_expr *l_end;
1129   gfc_expr *l_stride;
1130   gfc_expr *l_lower;
1131   gfc_expr *l_upper;
1132   int l_dir;
1133
1134   gfc_expr *r_start;
1135   gfc_expr *r_end;
1136   gfc_expr *r_stride;
1137   gfc_expr *r_lower;
1138   gfc_expr *r_upper;
1139   gfc_expr *one_expr;
1140   int r_dir;
1141   int stride_comparison;
1142   int start_comparison;
1143
1144   /* If they are the same range, return without more ado.  */
1145   if (is_same_range (l_ar, r_ar, n))
1146     return GFC_DEP_EQUAL;
1147
1148   l_start = l_ar->start[n];
1149   l_end = l_ar->end[n];
1150   l_stride = l_ar->stride[n];
1151
1152   r_start = r_ar->start[n];
1153   r_end = r_ar->end[n];
1154   r_stride = r_ar->stride[n];
1155
1156   /* If l_start is NULL take it from array specifier.  */
1157   if (NULL == l_start && IS_ARRAY_EXPLICIT (l_ar->as))
1158     l_start = l_ar->as->lower[n];
1159   /* If l_end is NULL take it from array specifier.  */
1160   if (NULL == l_end && IS_ARRAY_EXPLICIT (l_ar->as))
1161     l_end = l_ar->as->upper[n];
1162
1163   /* If r_start is NULL take it from array specifier.  */
1164   if (NULL == r_start && IS_ARRAY_EXPLICIT (r_ar->as))
1165     r_start = r_ar->as->lower[n];
1166   /* If r_end is NULL take it from array specifier.  */
1167   if (NULL == r_end && IS_ARRAY_EXPLICIT (r_ar->as))
1168     r_end = r_ar->as->upper[n];
1169
1170   /* Determine whether the l_stride is positive or negative.  */
1171   if (!l_stride)
1172     l_dir = 1;
1173   else if (l_stride->expr_type == EXPR_CONSTANT
1174            && l_stride->ts.type == BT_INTEGER)
1175     l_dir = mpz_sgn (l_stride->value.integer);
1176   else if (l_start && l_end)
1177     l_dir = gfc_dep_compare_expr (l_end, l_start);
1178   else
1179     l_dir = -2;
1180
1181   /* Determine whether the r_stride is positive or negative.  */
1182   if (!r_stride)
1183     r_dir = 1;
1184   else if (r_stride->expr_type == EXPR_CONSTANT
1185            && r_stride->ts.type == BT_INTEGER)
1186     r_dir = mpz_sgn (r_stride->value.integer);
1187   else if (r_start && r_end)
1188     r_dir = gfc_dep_compare_expr (r_end, r_start);
1189   else
1190     r_dir = -2;
1191
1192   /* The strides should never be zero.  */
1193   if (l_dir == 0 || r_dir == 0)
1194     return GFC_DEP_OVERLAP;
1195
1196   /* Determine the relationship between the strides.  Set stride_comparison to
1197      -2 if the dependency cannot be determined
1198      -1 if l_stride < r_stride
1199       0 if l_stride == r_stride
1200       1 if l_stride > r_stride
1201      as determined by gfc_dep_compare_expr.  */
1202
1203   one_expr = gfc_get_int_expr (gfc_index_integer_kind, NULL, 1);
1204
1205   stride_comparison = gfc_dep_compare_expr (l_stride ? l_stride : one_expr,
1206                                             r_stride ? r_stride : one_expr);
1207
1208   if (l_start && r_start)
1209     start_comparison = gfc_dep_compare_expr (l_start, r_start);
1210   else
1211     start_comparison = -2;
1212       
1213   gfc_free_expr (one_expr);
1214
1215   /* Determine LHS upper and lower bounds.  */
1216   if (l_dir == 1)
1217     {
1218       l_lower = l_start;
1219       l_upper = l_end;
1220     }
1221   else if (l_dir == -1)
1222     {
1223       l_lower = l_end;
1224       l_upper = l_start;
1225     }
1226   else
1227     {
1228       l_lower = NULL;
1229       l_upper = NULL;
1230     }
1231
1232   /* Determine RHS upper and lower bounds.  */
1233   if (r_dir == 1)
1234     {
1235       r_lower = r_start;
1236       r_upper = r_end;
1237     }
1238   else if (r_dir == -1)
1239     {
1240       r_lower = r_end;
1241       r_upper = r_start;
1242     }
1243   else
1244     {
1245       r_lower = NULL;
1246       r_upper = NULL;
1247     }
1248
1249   /* Check whether the ranges are disjoint.  */
1250   if (l_upper && r_lower && gfc_dep_compare_expr (l_upper, r_lower) == -1)
1251     return GFC_DEP_NODEP;
1252   if (r_upper && l_lower && gfc_dep_compare_expr (r_upper, l_lower) == -1)
1253     return GFC_DEP_NODEP;
1254
1255   /* Handle cases like x:y:1 vs. x:z:-1 as GFC_DEP_EQUAL.  */
1256   if (l_start && r_start && gfc_dep_compare_expr (l_start, r_start) == 0)
1257     {
1258       if (l_dir == 1 && r_dir == -1)
1259         return GFC_DEP_EQUAL;
1260       if (l_dir == -1 && r_dir == 1)
1261         return GFC_DEP_EQUAL;
1262     }
1263
1264   /* Handle cases like x:y:1 vs. z:y:-1 as GFC_DEP_EQUAL.  */
1265   if (l_end && r_end && gfc_dep_compare_expr (l_end, r_end) == 0)
1266     {
1267       if (l_dir == 1 && r_dir == -1)
1268         return GFC_DEP_EQUAL;
1269       if (l_dir == -1 && r_dir == 1)
1270         return GFC_DEP_EQUAL;
1271     }
1272
1273   /* Handle cases like x:y:2 vs. x+1:z:4 as GFC_DEP_NODEP.
1274      There is no dependency if the remainder of
1275      (l_start - r_start) / gcd(l_stride, r_stride) is
1276      nonzero.
1277      TODO:
1278        - Handle cases where x is an expression.
1279        - Cases like a(1:4:2) = a(2:3) are still not handled.
1280   */
1281
1282 #define IS_CONSTANT_INTEGER(a) ((a) && ((a)->expr_type == EXPR_CONSTANT) \
1283                               && (a)->ts.type == BT_INTEGER)
1284
1285   if (IS_CONSTANT_INTEGER(l_start) && IS_CONSTANT_INTEGER(r_start)
1286       && IS_CONSTANT_INTEGER(l_stride) && IS_CONSTANT_INTEGER(r_stride))
1287     {
1288       mpz_t gcd, tmp;
1289       int result;
1290
1291       mpz_init (gcd);
1292       mpz_init (tmp);
1293
1294       mpz_gcd (gcd, l_stride->value.integer, r_stride->value.integer);
1295       mpz_sub (tmp, l_start->value.integer, r_start->value.integer);
1296
1297       mpz_fdiv_r (tmp, tmp, gcd);
1298       result = mpz_cmp_si (tmp, 0L);
1299
1300       mpz_clear (gcd);
1301       mpz_clear (tmp);
1302
1303       if (result != 0)
1304         return GFC_DEP_NODEP;
1305     }
1306
1307 #undef IS_CONSTANT_INTEGER
1308
1309   /* Check for forward dependencies x:y vs. x+1:z and x:y:z vs. x:y:z+1. */
1310
1311   if (l_dir == 1 && r_dir == 1 &&
1312       (start_comparison == 0 || start_comparison == -1)
1313       && (stride_comparison == 0 || stride_comparison == -1))
1314           return GFC_DEP_FORWARD;
1315
1316   /* Check for forward dependencies x:y:-1 vs. x-1:z:-1 and
1317      x:y:-1 vs. x:y:-2.  */
1318   if (l_dir == -1 && r_dir == -1 && 
1319       (start_comparison == 0 || start_comparison == 1)
1320       && (stride_comparison == 0 || stride_comparison == 1))
1321     return GFC_DEP_FORWARD;
1322
1323   if (stride_comparison == 0 || stride_comparison == -1)
1324     {
1325       if (l_start && IS_ARRAY_EXPLICIT (l_ar->as))
1326         {
1327
1328           /* Check for a(low:y:s) vs. a(z:x:s) or
1329              a(low:y:s) vs. a(z:x:s+1) where a has a lower bound
1330              of low, which is always at least a forward dependence.  */
1331
1332           if (r_dir == 1
1333               && gfc_dep_compare_expr (l_start, l_ar->as->lower[n]) == 0)
1334             return GFC_DEP_FORWARD;
1335         }
1336     }
1337
1338   if (stride_comparison == 0 || stride_comparison == 1)
1339     {
1340       if (l_start && IS_ARRAY_EXPLICIT (l_ar->as))
1341         {
1342       
1343           /* Check for a(high:y:-s) vs. a(z:x:-s) or
1344              a(high:y:-s vs. a(z:x:-s-1) where a has a higher bound
1345              of high, which is always at least a forward dependence.  */
1346
1347           if (r_dir == -1
1348               && gfc_dep_compare_expr (l_start, l_ar->as->upper[n]) == 0)
1349             return GFC_DEP_FORWARD;
1350         }
1351     }
1352
1353
1354   if (stride_comparison == 0)
1355     {
1356       /* From here, check for backwards dependencies.  */
1357       /* x+1:y vs. x:z.  */
1358       if (l_dir == 1 && r_dir == 1  && start_comparison == 1)
1359         return GFC_DEP_BACKWARD;
1360
1361       /* x-1:y:-1 vs. x:z:-1.  */
1362       if (l_dir == -1 && r_dir == -1 && start_comparison == -1)
1363         return GFC_DEP_BACKWARD;
1364     }
1365
1366   return GFC_DEP_OVERLAP;
1367 }
1368
1369
1370 /* Determines overlapping for a single element and a section.  */
1371
1372 static gfc_dependency
1373 gfc_check_element_vs_section( gfc_ref *lref, gfc_ref *rref, int n)
1374 {
1375   gfc_array_ref *ref;
1376   gfc_expr *elem;
1377   gfc_expr *start;
1378   gfc_expr *end;
1379   gfc_expr *stride;
1380   int s;
1381
1382   elem = lref->u.ar.start[n];
1383   if (!elem)
1384     return GFC_DEP_OVERLAP;
1385
1386   ref = &rref->u.ar;
1387   start = ref->start[n] ;
1388   end = ref->end[n] ;
1389   stride = ref->stride[n];
1390
1391   if (!start && IS_ARRAY_EXPLICIT (ref->as))
1392     start = ref->as->lower[n];
1393   if (!end && IS_ARRAY_EXPLICIT (ref->as))
1394     end = ref->as->upper[n];
1395
1396   /* Determine whether the stride is positive or negative.  */
1397   if (!stride)
1398     s = 1;
1399   else if (stride->expr_type == EXPR_CONSTANT
1400            && stride->ts.type == BT_INTEGER)
1401     s = mpz_sgn (stride->value.integer);
1402   else
1403     s = -2;
1404
1405   /* Stride should never be zero.  */
1406   if (s == 0)
1407     return GFC_DEP_OVERLAP;
1408
1409   /* Positive strides.  */
1410   if (s == 1)
1411     {
1412       /* Check for elem < lower.  */
1413       if (start && gfc_dep_compare_expr (elem, start) == -1)
1414         return GFC_DEP_NODEP;
1415       /* Check for elem > upper.  */
1416       if (end && gfc_dep_compare_expr (elem, end) == 1)
1417         return GFC_DEP_NODEP;
1418
1419       if (start && end)
1420         {
1421           s = gfc_dep_compare_expr (start, end);
1422           /* Check for an empty range.  */
1423           if (s == 1)
1424             return GFC_DEP_NODEP;
1425           if (s == 0 && gfc_dep_compare_expr (elem, start) == 0)
1426             return GFC_DEP_EQUAL;
1427         }
1428     }
1429   /* Negative strides.  */
1430   else if (s == -1)
1431     {
1432       /* Check for elem > upper.  */
1433       if (end && gfc_dep_compare_expr (elem, start) == 1)
1434         return GFC_DEP_NODEP;
1435       /* Check for elem < lower.  */
1436       if (start && gfc_dep_compare_expr (elem, end) == -1)
1437         return GFC_DEP_NODEP;
1438
1439       if (start && end)
1440         {
1441           s = gfc_dep_compare_expr (start, end);
1442           /* Check for an empty range.  */
1443           if (s == -1)
1444             return GFC_DEP_NODEP;
1445           if (s == 0 && gfc_dep_compare_expr (elem, start) == 0)
1446             return GFC_DEP_EQUAL;
1447         }
1448     }
1449   /* Unknown strides.  */
1450   else
1451     {
1452       if (!start || !end)
1453         return GFC_DEP_OVERLAP;
1454       s = gfc_dep_compare_expr (start, end);
1455       if (s <= -2)
1456         return GFC_DEP_OVERLAP;
1457       /* Assume positive stride.  */
1458       if (s == -1)
1459         {
1460           /* Check for elem < lower.  */
1461           if (gfc_dep_compare_expr (elem, start) == -1)
1462             return GFC_DEP_NODEP;
1463           /* Check for elem > upper.  */
1464           if (gfc_dep_compare_expr (elem, end) == 1)
1465             return GFC_DEP_NODEP;
1466         }
1467       /* Assume negative stride.  */
1468       else if (s == 1)
1469         {
1470           /* Check for elem > upper.  */
1471           if (gfc_dep_compare_expr (elem, start) == 1)
1472             return GFC_DEP_NODEP;
1473           /* Check for elem < lower.  */
1474           if (gfc_dep_compare_expr (elem, end) == -1)
1475             return GFC_DEP_NODEP;
1476         }
1477       /* Equal bounds.  */
1478       else if (s == 0)
1479         {
1480           s = gfc_dep_compare_expr (elem, start);
1481           if (s == 0)
1482             return GFC_DEP_EQUAL;
1483           if (s == 1 || s == -1)
1484             return GFC_DEP_NODEP;
1485         }
1486     }
1487
1488   return GFC_DEP_OVERLAP;
1489 }
1490
1491
1492 /* Traverse expr, checking all EXPR_VARIABLE symbols for their
1493    forall_index attribute.  Return true if any variable may be
1494    being used as a FORALL index.  Its safe to pessimistically
1495    return true, and assume a dependency.  */
1496
1497 static bool
1498 contains_forall_index_p (gfc_expr *expr)
1499 {
1500   gfc_actual_arglist *arg;
1501   gfc_constructor *c;
1502   gfc_ref *ref;
1503   int i;
1504
1505   if (!expr)
1506     return false;
1507
1508   switch (expr->expr_type)
1509     {
1510     case EXPR_VARIABLE:
1511       if (expr->symtree->n.sym->forall_index)
1512         return true;
1513       break;
1514
1515     case EXPR_OP:
1516       if (contains_forall_index_p (expr->value.op.op1)
1517           || contains_forall_index_p (expr->value.op.op2))
1518         return true;
1519       break;
1520
1521     case EXPR_FUNCTION:
1522       for (arg = expr->value.function.actual; arg; arg = arg->next)
1523         if (contains_forall_index_p (arg->expr))
1524           return true;
1525       break;
1526
1527     case EXPR_CONSTANT:
1528     case EXPR_NULL:
1529     case EXPR_SUBSTRING:
1530       break;
1531
1532     case EXPR_STRUCTURE:
1533     case EXPR_ARRAY:
1534       for (c = gfc_constructor_first (expr->value.constructor);
1535            c; gfc_constructor_next (c))
1536         if (contains_forall_index_p (c->expr))
1537           return true;
1538       break;
1539
1540     default:
1541       gcc_unreachable ();
1542     }
1543
1544   for (ref = expr->ref; ref; ref = ref->next)
1545     switch (ref->type)
1546       {
1547       case REF_ARRAY:
1548         for (i = 0; i < ref->u.ar.dimen; i++)
1549           if (contains_forall_index_p (ref->u.ar.start[i])
1550               || contains_forall_index_p (ref->u.ar.end[i])
1551               || contains_forall_index_p (ref->u.ar.stride[i]))
1552             return true;
1553         break;
1554
1555       case REF_COMPONENT:
1556         break;
1557
1558       case REF_SUBSTRING:
1559         if (contains_forall_index_p (ref->u.ss.start)
1560             || contains_forall_index_p (ref->u.ss.end))
1561           return true;
1562         break;
1563
1564       default:
1565         gcc_unreachable ();
1566       }
1567
1568   return false;
1569 }
1570
1571 /* Determines overlapping for two single element array references.  */
1572
1573 static gfc_dependency
1574 gfc_check_element_vs_element (gfc_ref *lref, gfc_ref *rref, int n)
1575 {
1576   gfc_array_ref l_ar;
1577   gfc_array_ref r_ar;
1578   gfc_expr *l_start;
1579   gfc_expr *r_start;
1580   int i;
1581
1582   l_ar = lref->u.ar;
1583   r_ar = rref->u.ar;
1584   l_start = l_ar.start[n] ;
1585   r_start = r_ar.start[n] ;
1586   i = gfc_dep_compare_expr (r_start, l_start);
1587   if (i == 0)
1588     return GFC_DEP_EQUAL;
1589
1590   /* Treat two scalar variables as potentially equal.  This allows
1591      us to prove that a(i,:) and a(j,:) have no dependency.  See
1592      Gerald Roth, "Evaluation of Array Syntax Dependence Analysis",
1593      Proceedings of the International Conference on Parallel and
1594      Distributed Processing Techniques and Applications (PDPTA2001),
1595      Las Vegas, Nevada, June 2001.  */
1596   /* However, we need to be careful when either scalar expression
1597      contains a FORALL index, as these can potentially change value
1598      during the scalarization/traversal of this array reference.  */
1599   if (contains_forall_index_p (r_start) || contains_forall_index_p (l_start))
1600     return GFC_DEP_OVERLAP;
1601
1602   if (i > -2)
1603     return GFC_DEP_NODEP;
1604   return GFC_DEP_EQUAL;
1605 }
1606
1607
1608 /* Determine if an array ref, usually an array section specifies the
1609    entire array.  In addition, if the second, pointer argument is
1610    provided, the function will return true if the reference is
1611    contiguous; eg. (:, 1) gives true but (1,:) gives false.  */
1612
1613 bool
1614 gfc_full_array_ref_p (gfc_ref *ref, bool *contiguous)
1615 {
1616   int i;
1617   int n;
1618   bool lbound_OK = true;
1619   bool ubound_OK = true;
1620
1621   if (contiguous)
1622     *contiguous = false;
1623
1624   if (ref->type != REF_ARRAY)
1625     return false;
1626
1627   if (ref->u.ar.type == AR_FULL)
1628     {
1629       if (contiguous)
1630         *contiguous = true;
1631       return true;
1632     }
1633
1634   if (ref->u.ar.type != AR_SECTION)
1635     return false;
1636   if (ref->next)
1637     return false;
1638
1639   for (i = 0; i < ref->u.ar.dimen; i++)
1640     {
1641       /* If we have a single element in the reference, for the reference
1642          to be full, we need to ascertain that the array has a single
1643          element in this dimension and that we actually reference the
1644          correct element.  */
1645       if (ref->u.ar.dimen_type[i] == DIMEN_ELEMENT)
1646         {
1647           /* This is unconditionally a contiguous reference if all the
1648              remaining dimensions are elements.  */
1649           if (contiguous)
1650             {
1651               *contiguous = true;
1652               for (n = i + 1; n < ref->u.ar.dimen; n++)
1653                 if (ref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
1654                   *contiguous = false;
1655             }
1656
1657           if (!ref->u.ar.as
1658               || !ref->u.ar.as->lower[i]
1659               || !ref->u.ar.as->upper[i]
1660               || gfc_dep_compare_expr (ref->u.ar.as->lower[i],
1661                                        ref->u.ar.as->upper[i])
1662               || !ref->u.ar.start[i]
1663               || gfc_dep_compare_expr (ref->u.ar.start[i],
1664                                        ref->u.ar.as->lower[i]))
1665             return false;
1666           else
1667             continue;
1668         }
1669
1670       /* Check the lower bound.  */
1671       if (ref->u.ar.start[i]
1672           && (!ref->u.ar.as
1673               || !ref->u.ar.as->lower[i]
1674               || gfc_dep_compare_expr (ref->u.ar.start[i],
1675                                        ref->u.ar.as->lower[i])))
1676         lbound_OK = false;
1677       /* Check the upper bound.  */
1678       if (ref->u.ar.end[i]
1679           && (!ref->u.ar.as
1680               || !ref->u.ar.as->upper[i]
1681               || gfc_dep_compare_expr (ref->u.ar.end[i],
1682                                        ref->u.ar.as->upper[i])))
1683         ubound_OK = false;
1684       /* Check the stride.  */
1685       if (ref->u.ar.stride[i]
1686             && !gfc_expr_is_one (ref->u.ar.stride[i], 0))
1687         return false;
1688
1689       /* This is unconditionally a contiguous reference as long as all
1690          the subsequent dimensions are elements.  */
1691       if (contiguous)
1692         {
1693           *contiguous = true;
1694           for (n = i + 1; n < ref->u.ar.dimen; n++)
1695             if (ref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
1696               *contiguous = false;
1697         }
1698
1699       if (!lbound_OK || !ubound_OK)
1700         return false;
1701     }
1702   return true;
1703 }
1704
1705
1706 /* Determine if a full array is the same as an array section with one
1707    variable limit.  For this to be so, the strides must both be unity
1708    and one of either start == lower or end == upper must be true.  */
1709
1710 static bool
1711 ref_same_as_full_array (gfc_ref *full_ref, gfc_ref *ref)
1712 {
1713   int i;
1714   bool upper_or_lower;
1715
1716   if (full_ref->type != REF_ARRAY)
1717     return false;
1718   if (full_ref->u.ar.type != AR_FULL)
1719     return false;
1720   if (ref->type != REF_ARRAY)
1721     return false;
1722   if (ref->u.ar.type != AR_SECTION)
1723     return false;
1724
1725   for (i = 0; i < ref->u.ar.dimen; i++)
1726     {
1727       /* If we have a single element in the reference, we need to check
1728          that the array has a single element and that we actually reference
1729          the correct element.  */
1730       if (ref->u.ar.dimen_type[i] == DIMEN_ELEMENT)
1731         {
1732           if (!full_ref->u.ar.as
1733               || !full_ref->u.ar.as->lower[i]
1734               || !full_ref->u.ar.as->upper[i]
1735               || gfc_dep_compare_expr (full_ref->u.ar.as->lower[i],
1736                                        full_ref->u.ar.as->upper[i])
1737               || !ref->u.ar.start[i]
1738               || gfc_dep_compare_expr (ref->u.ar.start[i],
1739                                        full_ref->u.ar.as->lower[i]))
1740             return false;
1741         }
1742
1743       /* Check the strides.  */
1744       if (full_ref->u.ar.stride[i] && !gfc_expr_is_one (full_ref->u.ar.stride[i], 0))
1745         return false;
1746       if (ref->u.ar.stride[i] && !gfc_expr_is_one (ref->u.ar.stride[i], 0))
1747         return false;
1748
1749       upper_or_lower = false;
1750       /* Check the lower bound.  */
1751       if (ref->u.ar.start[i]
1752           && (ref->u.ar.as
1753                 && full_ref->u.ar.as->lower[i]
1754                 && gfc_dep_compare_expr (ref->u.ar.start[i],
1755                                          full_ref->u.ar.as->lower[i]) == 0))
1756         upper_or_lower =  true;
1757       /* Check the upper bound.  */
1758       if (ref->u.ar.end[i]
1759           && (ref->u.ar.as
1760                 && full_ref->u.ar.as->upper[i]
1761                 && gfc_dep_compare_expr (ref->u.ar.end[i],
1762                                          full_ref->u.ar.as->upper[i]) == 0))
1763         upper_or_lower =  true;
1764       if (!upper_or_lower)
1765         return false;
1766     }
1767   return true;
1768 }
1769
1770
1771 /* Finds if two array references are overlapping or not.
1772    Return value
1773         2 : array references are overlapping but reversal of one or
1774             more dimensions will clear the dependency.
1775         1 : array references are overlapping.
1776         0 : array references are identical or not overlapping.  */
1777
1778 int
1779 gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse)
1780 {
1781   int n;
1782   gfc_dependency fin_dep;
1783   gfc_dependency this_dep;
1784
1785   this_dep = GFC_DEP_ERROR;
1786   fin_dep = GFC_DEP_ERROR;
1787   /* Dependencies due to pointers should already have been identified.
1788      We only need to check for overlapping array references.  */
1789
1790   while (lref && rref)
1791     {
1792       /* We're resolving from the same base symbol, so both refs should be
1793          the same type.  We traverse the reference chain until we find ranges
1794          that are not equal.  */
1795       gcc_assert (lref->type == rref->type);
1796       switch (lref->type)
1797         {
1798         case REF_COMPONENT:
1799           /* The two ranges can't overlap if they are from different
1800              components.  */
1801           if (lref->u.c.component != rref->u.c.component)
1802             return 0;
1803           break;
1804           
1805         case REF_SUBSTRING:
1806           /* Substring overlaps are handled by the string assignment code
1807              if there is not an underlying dependency.  */
1808           return (fin_dep == GFC_DEP_OVERLAP) ? 1 : 0;
1809         
1810         case REF_ARRAY:
1811
1812           if (ref_same_as_full_array (lref, rref))
1813             return 0;
1814
1815           if (ref_same_as_full_array (rref, lref))
1816             return 0;
1817
1818           if (lref->u.ar.dimen != rref->u.ar.dimen)
1819             {
1820               if (lref->u.ar.type == AR_FULL)
1821                 fin_dep = gfc_full_array_ref_p (rref, NULL) ? GFC_DEP_EQUAL
1822                                                             : GFC_DEP_OVERLAP;
1823               else if (rref->u.ar.type == AR_FULL)
1824                 fin_dep = gfc_full_array_ref_p (lref, NULL) ? GFC_DEP_EQUAL
1825                                                             : GFC_DEP_OVERLAP;
1826               else
1827                 return 1;
1828               break;
1829             }
1830
1831           for (n=0; n < lref->u.ar.dimen; n++)
1832             {
1833               /* Assume dependency when either of array reference is vector
1834                  subscript.  */
1835               if (lref->u.ar.dimen_type[n] == DIMEN_VECTOR
1836                   || rref->u.ar.dimen_type[n] == DIMEN_VECTOR)
1837                 return 1;
1838
1839               if (lref->u.ar.dimen_type[n] == DIMEN_RANGE
1840                   && rref->u.ar.dimen_type[n] == DIMEN_RANGE)
1841                 this_dep = check_section_vs_section (&lref->u.ar, &rref->u.ar, n);
1842               else if (lref->u.ar.dimen_type[n] == DIMEN_ELEMENT
1843                        && rref->u.ar.dimen_type[n] == DIMEN_RANGE)
1844                 this_dep = gfc_check_element_vs_section (lref, rref, n);
1845               else if (rref->u.ar.dimen_type[n] == DIMEN_ELEMENT
1846                        && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
1847                 this_dep = gfc_check_element_vs_section (rref, lref, n);
1848               else 
1849                 {
1850                   gcc_assert (rref->u.ar.dimen_type[n] == DIMEN_ELEMENT
1851                               && lref->u.ar.dimen_type[n] == DIMEN_ELEMENT);
1852                   this_dep = gfc_check_element_vs_element (rref, lref, n);
1853                 }
1854
1855               /* If any dimension doesn't overlap, we have no dependency.  */
1856               if (this_dep == GFC_DEP_NODEP)
1857                 return 0;
1858
1859               /* Now deal with the loop reversal logic:  This only works on
1860                  ranges and is activated by setting
1861                                 reverse[n] == GFC_ENABLE_REVERSE
1862                  The ability to reverse or not is set by previous conditions
1863                  in this dimension.  If reversal is not activated, the
1864                  value GFC_DEP_BACKWARD is reset to GFC_DEP_OVERLAP.  */
1865               if (rref->u.ar.dimen_type[n] == DIMEN_RANGE
1866                     && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
1867                 {
1868                   /* Set reverse if backward dependence and not inhibited.  */
1869                   if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
1870                     reverse[n] = (this_dep == GFC_DEP_BACKWARD) ?
1871                                  GFC_REVERSE_SET : reverse[n];
1872
1873                   /* Set forward if forward dependence and not inhibited.  */
1874                   if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
1875                     reverse[n] = (this_dep == GFC_DEP_FORWARD) ?
1876                                  GFC_FORWARD_SET : reverse[n];
1877
1878                   /* Flag up overlap if dependence not compatible with
1879                      the overall state of the expression.  */
1880                   if (reverse && reverse[n] == GFC_REVERSE_SET
1881                         && this_dep == GFC_DEP_FORWARD)
1882                     {
1883                       reverse[n] = GFC_INHIBIT_REVERSE;
1884                       this_dep = GFC_DEP_OVERLAP;
1885                     }
1886                   else if (reverse && reverse[n] == GFC_FORWARD_SET
1887                         && this_dep == GFC_DEP_BACKWARD)
1888                     {
1889                       reverse[n] = GFC_INHIBIT_REVERSE;
1890                       this_dep = GFC_DEP_OVERLAP;
1891                     }
1892
1893                   /* If no intention of reversing or reversing is explicitly
1894                      inhibited, convert backward dependence to overlap.  */
1895                   if ((reverse == NULL && this_dep == GFC_DEP_BACKWARD)
1896                       || (reverse != NULL && reverse[n] == GFC_INHIBIT_REVERSE))
1897                     this_dep = GFC_DEP_OVERLAP;
1898                 }
1899
1900               /* Overlap codes are in order of priority.  We only need to
1901                  know the worst one.*/
1902               if (this_dep > fin_dep)
1903                 fin_dep = this_dep;
1904             }
1905
1906           /* If this is an equal element, we have to keep going until we find
1907              the "real" array reference.  */
1908           if (lref->u.ar.type == AR_ELEMENT
1909                 && rref->u.ar.type == AR_ELEMENT
1910                 && fin_dep == GFC_DEP_EQUAL)
1911             break;
1912
1913           /* Exactly matching and forward overlapping ranges don't cause a
1914              dependency.  */
1915           if (fin_dep < GFC_DEP_BACKWARD)
1916             return 0;
1917
1918           /* Keep checking.  We only have a dependency if
1919              subsequent references also overlap.  */
1920           break;
1921
1922         default:
1923           gcc_unreachable ();
1924         }
1925       lref = lref->next;
1926       rref = rref->next;
1927     }
1928
1929   /* If we haven't seen any array refs then something went wrong.  */
1930   gcc_assert (fin_dep != GFC_DEP_ERROR);
1931
1932   /* Assume the worst if we nest to different depths.  */
1933   if (lref || rref)
1934     return 1;
1935
1936   return fin_dep == GFC_DEP_OVERLAP;
1937 }