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
gfc_expr_is_one(gfc_expr * expr,int def)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
identical_array_ref(gfc_array_ref * a1,gfc_array_ref * a2)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
are_identical_variables(gfc_expr * e1,gfc_expr * e2)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
gfc_dep_compare_functions(gfc_expr * e1,gfc_expr * e2,bool impure_ok)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
gfc_dep_compare_expr(gfc_expr * e1,gfc_expr * e2)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
is_same_range(gfc_array_ref * ar1,gfc_array_ref * ar2,int n)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 *
gfc_get_noncopying_intrinsic_argument(gfc_expr * 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
gfc_ref_needs_temporary_p(gfc_ref * ref)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
gfc_is_data_pointer(gfc_expr * e)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
gfc_check_argument_var_dependency(gfc_expr * var,sym_intent intent,gfc_expr * expr,gfc_dep_check elemental)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
gfc_check_argument_dependency(gfc_expr * other,sym_intent intent,gfc_expr * expr,gfc_dep_check elemental)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
gfc_check_fncall_dependency(gfc_expr * other,sym_intent intent,gfc_symbol * fnsym,gfc_actual_arglist * actual,gfc_dep_check elemental)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
gfc_are_equivalenced_arrays(gfc_expr * e1,gfc_expr * e2)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
check_data_pointer_types(gfc_expr * expr1,gfc_expr * expr2)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
gfc_check_dependency(gfc_expr * expr1,gfc_expr * expr2,bool identical)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
check_section_vs_section(gfc_array_ref * l_ar,gfc_array_ref * r_ar,int n)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
gfc_check_element_vs_section(gfc_ref * lref,gfc_ref * rref,int n)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
contains_forall_index_p(gfc_expr * expr)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
gfc_check_element_vs_element(gfc_ref * lref,gfc_ref * rref,int n)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
gfc_full_array_ref_p(gfc_ref * ref,bool * contiguous)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
ref_same_as_full_array(gfc_ref * full_ref,gfc_ref * ref)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
gfc_dep_resolver(gfc_ref * lref,gfc_ref * rref,gfc_reverse * reverse)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 }
1938