2 Copyright (C) 2000-2013 Free Software Foundation, Inc.
3 Contributed by Paul Brook <paul@nowt.org>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
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. */
28 #include "coretypes.h"
30 #include "dependency.h"
31 #include "constructor.h"
34 /* static declarations */
36 enum range
{LHS
, RHS
, MID
};
38 /* Dependency types. These must be in reverse order of priority. */
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. */
51 #define IS_ARRAY_EXPLICIT(as) ((as->type == AS_EXPLICIT ? 1 : 0))
53 /* Forward declarations */
55 static gfc_dependency
check_section_vs_section (gfc_array_ref
*,
56 gfc_array_ref
*, int);
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. */
62 gfc_expr_is_one (gfc_expr
*expr
, int def
)
64 gcc_assert (expr
!= NULL
);
66 if (expr
->expr_type
!= EXPR_CONSTANT
)
69 if (expr
->ts
.type
!= BT_INTEGER
)
72 return mpz_cmp_si (expr
->value
.integer
, 1) == 0;
75 /* Check if two array references are known to be identical. Calls
76 gfc_dep_compare_expr if necessary for comparing array indices. */
79 identical_array_ref (gfc_array_ref
*a1
, gfc_array_ref
*a2
)
83 if (a1
->type
== AR_FULL
&& a2
->type
== AR_FULL
)
86 if (a1
->type
== AR_SECTION
&& a2
->type
== AR_SECTION
)
88 gcc_assert (a1
->dimen
== a2
->dimen
);
90 for ( i
= 0; i
< a1
->dimen
; i
++)
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
)
97 if (check_section_vs_section (a1
, a2
, i
) != GFC_DEP_EQUAL
)
103 if (a1
->type
== AR_ELEMENT
&& a2
->type
== AR_ELEMENT
)
105 gcc_assert (a1
->dimen
== a2
->dimen
);
106 for (i
= 0; i
< a1
->dimen
; i
++)
108 if (gfc_dep_compare_expr (a1
->start
[i
], a2
->start
[i
]) != 0)
118 /* Return true for identical variables, checking for references if
119 necessary. Calls identical_array_ref for checking array sections. */
122 are_identical_variables (gfc_expr
*e1
, gfc_expr
*e2
)
126 if (e1
->symtree
->n
.sym
->attr
.dummy
&& e2
->symtree
->n
.sym
->attr
.dummy
)
128 /* Dummy arguments: Only check for equal names. */
129 if (e1
->symtree
->n
.sym
->name
!= e2
->symtree
->n
.sym
->name
)
134 /* Check for equal symbols. */
135 if (e1
->symtree
->n
.sym
!= e2
->symtree
->n
.sym
)
139 /* Volatile variables should never compare equal to themselves. */
141 if (e1
->symtree
->n
.sym
->attr
.volatile_
)
147 while (r1
!= NULL
|| r2
!= NULL
)
150 /* Assume the variables are not equal if one has a reference and the
152 TODO: Handle full references like comparing a(:) to a.
155 if (r1
== NULL
|| r2
== NULL
)
158 if (r1
->type
!= r2
->type
)
165 if (!identical_array_ref (&r1
->u
.ar
, &r2
->u
.ar
))
171 if (r1
->u
.c
.component
!= r2
->u
.c
.component
)
176 if (gfc_dep_compare_expr (r1
->u
.ss
.start
, r2
->u
.ss
.start
) != 0)
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. */
183 if (r1
->u
.ss
.end
== NULL
&& r2
->u
.ss
.end
== NULL
)
186 if (gfc_dep_compare_expr (r1
->u
.ss
.end
, r2
->u
.ss
.end
) != 0)
192 gfc_internal_error ("are_identical_variables: Bad type");
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. */
204 gfc_dep_compare_functions (gfc_expr
*e1
, gfc_expr
*e2
, bool impure_ok
)
207 gfc_actual_arglist
*args1
;
208 gfc_actual_arglist
*args2
;
210 if (e1
->expr_type
!= EXPR_FUNCTION
|| e2
->expr_type
!= EXPR_FUNCTION
)
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
)))
220 args1
= e1
->value
.function
.actual
;
221 args2
= e2
->value
.function
.actual
;
223 /* Compare the argument lists for equality. */
224 while (args1
&& args2
)
226 /* Bitwise xor, since C has no non-bitwise xor operator. */
227 if ((args1
->expr
== NULL
) ^ (args2
->expr
== NULL
))
230 if (args1
->expr
!= NULL
&& args2
->expr
!= NULL
231 && gfc_dep_compare_expr (args1
->expr
, args2
->expr
) != 0)
237 return (args1
|| args2
) ? -2 : 0;
243 /* Compare two expressions. Return values:
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. */
253 gfc_dep_compare_expr (gfc_expr
*e1
, gfc_expr
*e2
)
255 gfc_actual_arglist
*args1
;
256 gfc_actual_arglist
*args2
;
263 if (e1
== NULL
&& e2
== NULL
)
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
)
271 args1
= e1
->value
.function
.actual
;
272 if (args1
->expr
->ts
.type
== BT_INTEGER
273 && e1
->ts
.kind
> args1
->expr
->ts
.kind
)
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
)
281 args2
= e2
->value
.function
.actual
;
282 if (args2
->expr
->ts
.type
== BT_INTEGER
283 && e2
->ts
.kind
> args2
->expr
->ts
.kind
)
290 return gfc_dep_compare_expr (n1
, n2
);
292 return gfc_dep_compare_expr (n1
, e2
);
297 return gfc_dep_compare_expr (e1
, n2
);
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
);
309 if (e1
->expr_type
== EXPR_OP
&& e1
->value
.op
.op
== INTRINSIC_PLUS
)
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
);
317 /* Compare P+Q vs. R+S. */
318 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_PLUS
)
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)
326 if (l
== 0 && r
> -2)
328 if (l
> -2 && r
== 0)
330 if (l
== 1 && r
== 1)
332 if (l
== -1 && r
== -1)
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)
339 if (l
== 0 && r
> -2)
341 if (l
> -2 && r
== 0)
343 if (l
== 1 && r
== 1)
345 if (l
== -1 && r
== -1)
350 /* Compare X vs. X+C, for INTEGER only. */
351 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_PLUS
)
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
);
359 /* Compare X-C vs. X, for INTEGER only. */
360 if (e1
->expr_type
== EXPR_OP
&& e1
->value
.op
.op
== INTRINSIC_MINUS
)
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
);
367 /* Compare P-Q vs. R-S. */
368 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_MINUS
)
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)
376 if (l
> -2 && r
== 0)
378 if (l
== 0 && r
> -2)
380 if (l
== 1 && r
== -1)
382 if (l
== -1 && r
== 1)
387 /* Compare A // B vs. C // D. */
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
)
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
);
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
;
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
)
414 /* Compare X vs. X-C, for INTEGER only. */
415 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_MINUS
)
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
);
423 if (e1
->expr_type
!= e2
->expr_type
)
426 switch (e1
->expr_type
)
429 /* Compare strings for equality. */
430 if (e1
->ts
.type
== BT_CHARACTER
&& e2
->ts
.type
== BT_CHARACTER
)
431 return gfc_compare_string (e1
, e2
);
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
)
438 if (e1
->ts
.type
== BT_REAL
&& e2
->ts
.type
== BT_REAL
)
440 if (mpfr_cmp (e1
->value
.real
, e2
->value
.real
) == 0)
445 else if (e1
->ts
.type
== BT_COMPLEX
&& e2
->ts
.type
== BT_COMPLEX
)
447 if (mpc_cmp (e1
->value
.complex, e2
->value
.complex) == 0)
454 if (e1
->ts
.type
!= BT_INTEGER
|| e2
->ts
.type
!= BT_INTEGER
)
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
);
461 i
= mpz_cmp (e1
->value
.integer
, e2
->value
.integer
);
469 if (are_identical_variables (e1
, e2
))
475 /* Intrinsic operators are the same if their operands are the same. */
476 if (e1
->value
.op
.op
!= e2
->value
.op
.op
)
478 if (e1
->value
.op
.op2
== 0)
480 i
= gfc_dep_compare_expr (e1
->value
.op
.op1
, e2
->value
.op
.op1
);
481 return i
== 0 ? 0 : -2;
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)
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. */
495 return gfc_dep_compare_functions (e1
, e2
, false);
504 /* Helper function to look through parens and unary plus. */
507 discard_nops (gfc_expr
*e
)
510 while (e
&& e
->expr_type
== EXPR_OP
511 && (e
->value
.op
.op
== INTRINSIC_UPLUS
512 || e
->value
.op
.op
== INTRINSIC_PARENTHESES
))
519 /* Return the difference between two expressions. Integer expressions of
522 X + constant, X - constant and constant + X
524 are handled. Return true on success, false on failure. result is assumed
525 to be uninitialized on entry, and will be initialized on success.
529 gfc_dep_difference (gfc_expr
*e1
, gfc_expr
*e2
, mpz_t
*result
)
531 gfc_expr
*e1_op1
, *e1_op2
, *e2_op1
, *e2_op2
;
533 if (e1
== NULL
|| e2
== NULL
)
536 if (e1
->ts
.type
!= BT_INTEGER
|| e2
->ts
.type
!= BT_INTEGER
)
539 e1
= discard_nops (e1
);
540 e2
= discard_nops (e2
);
542 /* Inizialize tentatively, clear if we don't return anything. */
545 /* Case 1: c1 - c2 = c1 - c2, trivially. */
547 if (e1
->expr_type
== EXPR_CONSTANT
&& e2
->expr_type
== EXPR_CONSTANT
)
549 mpz_sub (*result
, e1
->value
.integer
, e2
->value
.integer
);
553 if (e1
->expr_type
== EXPR_OP
&& e1
->value
.op
.op
== INTRINSIC_PLUS
)
555 e1_op1
= discard_nops (e1
->value
.op
.op1
);
556 e1_op2
= discard_nops (e1
->value
.op
.op2
);
558 /* Case 2: (X + c1) - X = c1. */
559 if (e1_op2
->expr_type
== EXPR_CONSTANT
560 && gfc_dep_compare_expr (e1_op1
, e2
) == 0)
562 mpz_set (*result
, e1_op2
->value
.integer
);
566 /* Case 3: (c1 + X) - X = c1. */
567 if (e1_op1
->expr_type
== EXPR_CONSTANT
568 && gfc_dep_compare_expr (e1_op2
, e2
) == 0)
570 mpz_set (*result
, e1_op1
->value
.integer
);
574 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_PLUS
)
576 e2_op1
= discard_nops (e2
->value
.op
.op1
);
577 e2_op2
= discard_nops (e2
->value
.op
.op2
);
579 if (e1_op2
->expr_type
== EXPR_CONSTANT
)
581 /* Case 4: X + c1 - (X + c2) = c1 - c2. */
582 if (e2_op2
->expr_type
== EXPR_CONSTANT
583 && gfc_dep_compare_expr (e1_op1
, e2_op1
) == 0)
585 mpz_sub (*result
, e1_op2
->value
.integer
,
586 e2_op2
->value
.integer
);
589 /* Case 5: X + c1 - (c2 + X) = c1 - c2. */
590 if (e2_op1
->expr_type
== EXPR_CONSTANT
591 && gfc_dep_compare_expr (e1_op1
, e2_op2
) == 0)
593 mpz_sub (*result
, e1_op2
->value
.integer
,
594 e2_op1
->value
.integer
);
598 else if (e1_op1
->expr_type
== EXPR_CONSTANT
)
600 /* Case 6: c1 + X - (X + c2) = c1 - c2. */
601 if (e2_op2
->expr_type
== EXPR_CONSTANT
602 && gfc_dep_compare_expr (e1_op2
, e2_op1
) == 0)
604 mpz_sub (*result
, e1_op1
->value
.integer
,
605 e2_op2
->value
.integer
);
608 /* Case 7: c1 + X - (c2 + X) = c1 - c2. */
609 if (e2_op1
->expr_type
== EXPR_CONSTANT
610 && gfc_dep_compare_expr (e1_op2
, e2_op2
) == 0)
612 mpz_sub (*result
, e1_op1
->value
.integer
,
613 e2_op1
->value
.integer
);
619 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_MINUS
)
621 e2_op1
= discard_nops (e2
->value
.op
.op1
);
622 e2_op2
= discard_nops (e2
->value
.op
.op2
);
624 if (e1_op2
->expr_type
== EXPR_CONSTANT
)
626 /* Case 8: X + c1 - (X - c2) = c1 + c2. */
627 if (e2_op2
->expr_type
== EXPR_CONSTANT
628 && gfc_dep_compare_expr (e1_op1
, e2_op1
) == 0)
630 mpz_add (*result
, e1_op2
->value
.integer
,
631 e2_op2
->value
.integer
);
635 if (e1_op1
->expr_type
== EXPR_CONSTANT
)
637 /* Case 9: c1 + X - (X - c2) = c1 + c2. */
638 if (e2_op2
->expr_type
== EXPR_CONSTANT
639 && gfc_dep_compare_expr (e1_op2
, e2_op1
) == 0)
641 mpz_add (*result
, e1_op1
->value
.integer
,
642 e2_op2
->value
.integer
);
649 if (e1
->expr_type
== EXPR_OP
&& e1
->value
.op
.op
== INTRINSIC_MINUS
)
651 e1_op1
= discard_nops (e1
->value
.op
.op1
);
652 e1_op2
= discard_nops (e1
->value
.op
.op2
);
654 if (e1_op2
->expr_type
== EXPR_CONSTANT
)
656 /* Case 10: (X - c1) - X = -c1 */
658 if (gfc_dep_compare_expr (e1_op1
, e2
) == 0)
660 mpz_neg (*result
, e1_op2
->value
.integer
);
664 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_PLUS
)
666 e2_op1
= discard_nops (e2
->value
.op
.op1
);
667 e2_op2
= discard_nops (e2
->value
.op
.op2
);
669 /* Case 11: (X - c1) - (X + c2) = -( c1 + c2). */
670 if (e2_op2
->expr_type
== EXPR_CONSTANT
671 && gfc_dep_compare_expr (e1_op1
, e2_op1
) == 0)
673 mpz_add (*result
, e1_op2
->value
.integer
,
674 e2_op2
->value
.integer
);
675 mpz_neg (*result
, *result
);
679 /* Case 12: X - c1 - (c2 + X) = - (c1 + c2). */
680 if (e2_op1
->expr_type
== EXPR_CONSTANT
681 && gfc_dep_compare_expr (e1_op1
, e2_op2
) == 0)
683 mpz_add (*result
, e1_op2
->value
.integer
,
684 e2_op1
->value
.integer
);
685 mpz_neg (*result
, *result
);
690 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_MINUS
)
692 e2_op1
= discard_nops (e2
->value
.op
.op1
);
693 e2_op2
= discard_nops (e2
->value
.op
.op2
);
695 /* Case 13: (X - c1) - (X - c2) = c2 - c1. */
696 if (e2_op2
->expr_type
== EXPR_CONSTANT
697 && gfc_dep_compare_expr (e1_op1
, e2_op1
) == 0)
699 mpz_sub (*result
, e2_op2
->value
.integer
,
700 e1_op2
->value
.integer
);
705 if (e1_op1
->expr_type
== EXPR_CONSTANT
)
707 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_MINUS
)
709 e2_op1
= discard_nops (e2
->value
.op
.op1
);
710 e2_op2
= discard_nops (e2
->value
.op
.op2
);
712 /* Case 14: (c1 - X) - (c2 - X) == c1 - c2. */
713 if (gfc_dep_compare_expr (e1_op2
, e2_op2
) == 0)
715 mpz_sub (*result
, e1_op1
->value
.integer
,
716 e2_op1
->value
.integer
);
724 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_PLUS
)
726 e2_op1
= discard_nops (e2
->value
.op
.op1
);
727 e2_op2
= discard_nops (e2
->value
.op
.op2
);
729 /* Case 15: X - (X + c2) = -c2. */
730 if (e2_op2
->expr_type
== EXPR_CONSTANT
731 && gfc_dep_compare_expr (e1
, e2_op1
) == 0)
733 mpz_neg (*result
, e2_op2
->value
.integer
);
736 /* Case 16: X - (c2 + X) = -c2. */
737 if (e2_op1
->expr_type
== EXPR_CONSTANT
738 && gfc_dep_compare_expr (e1
, e2_op2
) == 0)
740 mpz_neg (*result
, e2_op1
->value
.integer
);
745 if (e2
->expr_type
== EXPR_OP
&& e2
->value
.op
.op
== INTRINSIC_MINUS
)
747 e2_op1
= discard_nops (e2
->value
.op
.op1
);
748 e2_op2
= discard_nops (e2
->value
.op
.op2
);
750 /* Case 17: X - (X - c2) = c2. */
751 if (e2_op2
->expr_type
== EXPR_CONSTANT
752 && gfc_dep_compare_expr (e1
, e2_op1
) == 0)
754 mpz_set (*result
, e2_op2
->value
.integer
);
759 if (gfc_dep_compare_expr (e1
, e2
) == 0)
761 /* Case 18: X - X = 0. */
762 mpz_set_si (*result
, 0);
770 /* Returns 1 if the two ranges are the same and 0 if they are not (or if the
771 results are indeterminate). 'n' is the dimension to compare. */
774 is_same_range (gfc_array_ref
*ar1
, gfc_array_ref
*ar2
, int n
)
780 /* TODO: More sophisticated range comparison. */
781 gcc_assert (ar1
&& ar2
);
783 gcc_assert (ar1
->dimen_type
[n
] == ar2
->dimen_type
[n
]);
787 /* Check for mismatching strides. A NULL stride means a stride of 1. */
790 i
= gfc_expr_is_one (e1
, -1);
791 if (i
== -1 || i
== 0)
796 i
= gfc_expr_is_one (e2
, -1);
797 if (i
== -1 || i
== 0)
802 i
= gfc_dep_compare_expr (e1
, e2
);
806 /* The strides match. */
808 /* Check the range start. */
813 /* Use the bound of the array if no bound is specified. */
815 e1
= ar1
->as
->lower
[n
];
818 e2
= ar2
->as
->lower
[n
];
820 /* Check we have values for both. */
824 i
= gfc_dep_compare_expr (e1
, e2
);
829 /* Check the range end. */
834 /* Use the bound of the array if no bound is specified. */
836 e1
= ar1
->as
->upper
[n
];
839 e2
= ar2
->as
->upper
[n
];
841 /* Check we have values for both. */
845 i
= gfc_dep_compare_expr (e1
, e2
);
854 /* Some array-returning intrinsics can be implemented by reusing the
855 data from one of the array arguments. For example, TRANSPOSE does
856 not necessarily need to allocate new data: it can be implemented
857 by copying the original array's descriptor and simply swapping the
858 two dimension specifications.
860 If EXPR is a call to such an intrinsic, return the argument
861 whose data can be reused, otherwise return NULL. */
864 gfc_get_noncopying_intrinsic_argument (gfc_expr
*expr
)
866 if (expr
->expr_type
!= EXPR_FUNCTION
|| !expr
->value
.function
.isym
)
869 switch (expr
->value
.function
.isym
->id
)
871 case GFC_ISYM_TRANSPOSE
:
872 return expr
->value
.function
.actual
->expr
;
880 /* Return true if the result of reference REF can only be constructed
881 using a temporary array. */
884 gfc_ref_needs_temporary_p (gfc_ref
*ref
)
890 for (; ref
; ref
= ref
->next
)
894 /* Vector dimensions are generally not monotonic and must be
895 handled using a temporary. */
896 if (ref
->u
.ar
.type
== AR_SECTION
)
897 for (n
= 0; n
< ref
->u
.ar
.dimen
; n
++)
898 if (ref
->u
.ar
.dimen_type
[n
] == DIMEN_VECTOR
)
905 /* Within an array reference, character substrings generally
906 need a temporary. Character array strides are expressed as
907 multiples of the element size (consistent with other array
908 types), not in characters. */
920 gfc_is_data_pointer (gfc_expr
*e
)
924 if (e
->expr_type
!= EXPR_VARIABLE
&& e
->expr_type
!= EXPR_FUNCTION
)
927 /* No subreference if it is a function */
928 gcc_assert (e
->expr_type
== EXPR_VARIABLE
|| !e
->ref
);
930 if (e
->symtree
->n
.sym
->attr
.pointer
)
933 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
934 if (ref
->type
== REF_COMPONENT
&& ref
->u
.c
.component
->attr
.pointer
)
941 /* Return true if array variable VAR could be passed to the same function
942 as argument EXPR without interfering with EXPR. INTENT is the intent
945 This is considerably less conservative than other dependencies
946 because many function arguments will already be copied into a
950 gfc_check_argument_var_dependency (gfc_expr
*var
, sym_intent intent
,
951 gfc_expr
*expr
, gfc_dep_check elemental
)
955 gcc_assert (var
->expr_type
== EXPR_VARIABLE
);
956 gcc_assert (var
->rank
> 0);
958 switch (expr
->expr_type
)
961 /* In case of elemental subroutines, there is no dependency
962 between two same-range array references. */
963 if (gfc_ref_needs_temporary_p (expr
->ref
)
964 || gfc_check_dependency (var
, expr
, elemental
== NOT_ELEMENTAL
))
966 if (elemental
== ELEM_DONT_CHECK_VARIABLE
)
968 /* Too many false positive with pointers. */
969 if (!gfc_is_data_pointer (var
) && !gfc_is_data_pointer (expr
))
971 /* Elemental procedures forbid unspecified intents,
972 and we don't check dependencies for INTENT_IN args. */
973 gcc_assert (intent
== INTENT_OUT
|| intent
== INTENT_INOUT
);
975 /* We are told not to check dependencies.
976 We do it, however, and issue a warning in case we find one.
977 If a dependency is found in the case
978 elemental == ELEM_CHECK_VARIABLE, we will generate
979 a temporary, so we don't need to bother the user. */
980 gfc_warning ("INTENT(%s) actual argument at %L might "
981 "interfere with actual argument at %L.",
982 intent
== INTENT_OUT
? "OUT" : "INOUT",
983 &var
->where
, &expr
->where
);
993 /* the scalarizer always generates a temporary for array constructors,
994 so there is no dependency. */
998 if (intent
!= INTENT_IN
)
1000 arg
= gfc_get_noncopying_intrinsic_argument (expr
);
1002 return gfc_check_argument_var_dependency (var
, intent
, arg
,
1006 if (elemental
!= NOT_ELEMENTAL
)
1008 if ((expr
->value
.function
.esym
1009 && expr
->value
.function
.esym
->attr
.elemental
)
1010 || (expr
->value
.function
.isym
1011 && expr
->value
.function
.isym
->elemental
))
1012 return gfc_check_fncall_dependency (var
, intent
, NULL
,
1013 expr
->value
.function
.actual
,
1014 ELEM_CHECK_VARIABLE
);
1016 if (gfc_inline_intrinsic_function_p (expr
))
1018 /* The TRANSPOSE case should have been caught in the
1019 noncopying intrinsic case above. */
1020 gcc_assert (expr
->value
.function
.isym
->id
!= GFC_ISYM_TRANSPOSE
);
1022 return gfc_check_fncall_dependency (var
, intent
, NULL
,
1023 expr
->value
.function
.actual
,
1024 ELEM_CHECK_VARIABLE
);
1030 /* In case of non-elemental procedures, there is no need to catch
1031 dependencies, as we will make a temporary anyway. */
1034 /* If the actual arg EXPR is an expression, we need to catch
1035 a dependency between variables in EXPR and VAR,
1036 an intent((IN)OUT) variable. */
1037 if (expr
->value
.op
.op1
1038 && gfc_check_argument_var_dependency (var
, intent
,
1040 ELEM_CHECK_VARIABLE
))
1042 else if (expr
->value
.op
.op2
1043 && gfc_check_argument_var_dependency (var
, intent
,
1045 ELEM_CHECK_VARIABLE
))
1056 /* Like gfc_check_argument_var_dependency, but extended to any
1057 array expression OTHER, not just variables. */
1060 gfc_check_argument_dependency (gfc_expr
*other
, sym_intent intent
,
1061 gfc_expr
*expr
, gfc_dep_check elemental
)
1063 switch (other
->expr_type
)
1066 return gfc_check_argument_var_dependency (other
, intent
, expr
, elemental
);
1069 other
= gfc_get_noncopying_intrinsic_argument (other
);
1071 return gfc_check_argument_dependency (other
, INTENT_IN
, expr
,
1082 /* Like gfc_check_argument_dependency, but check all the arguments in ACTUAL.
1083 FNSYM is the function being called, or NULL if not known. */
1086 gfc_check_fncall_dependency (gfc_expr
*other
, sym_intent intent
,
1087 gfc_symbol
*fnsym
, gfc_actual_arglist
*actual
,
1088 gfc_dep_check elemental
)
1090 gfc_formal_arglist
*formal
;
1093 formal
= fnsym
? gfc_sym_get_dummy_args (fnsym
) : NULL
;
1094 for (; actual
; actual
= actual
->next
, formal
= formal
? formal
->next
: NULL
)
1096 expr
= actual
->expr
;
1098 /* Skip args which are not present. */
1102 /* Skip other itself. */
1106 /* Skip intent(in) arguments if OTHER itself is intent(in). */
1107 if (formal
&& intent
== INTENT_IN
1108 && formal
->sym
->attr
.intent
== INTENT_IN
)
1111 if (gfc_check_argument_dependency (other
, intent
, expr
, elemental
))
1119 /* Return 1 if e1 and e2 are equivalenced arrays, either
1120 directly or indirectly; i.e., equivalence (a,b) for a and b
1121 or equivalence (a,c),(b,c). This function uses the equiv_
1122 lists, generated in trans-common(add_equivalences), that are
1123 guaranteed to pick up indirect equivalences. We explicitly
1124 check for overlap using the offset and length of the equivalence.
1125 This function is symmetric.
1126 TODO: This function only checks whether the full top-level
1127 symbols overlap. An improved implementation could inspect
1128 e1->ref and e2->ref to determine whether the actually accessed
1129 portions of these variables/arrays potentially overlap. */
1132 gfc_are_equivalenced_arrays (gfc_expr
*e1
, gfc_expr
*e2
)
1135 gfc_equiv_info
*s
, *fl1
, *fl2
;
1137 gcc_assert (e1
->expr_type
== EXPR_VARIABLE
1138 && e2
->expr_type
== EXPR_VARIABLE
);
1140 if (!e1
->symtree
->n
.sym
->attr
.in_equivalence
1141 || !e2
->symtree
->n
.sym
->attr
.in_equivalence
|| !e1
->rank
|| !e2
->rank
)
1144 if (e1
->symtree
->n
.sym
->ns
1145 && e1
->symtree
->n
.sym
->ns
!= gfc_current_ns
)
1146 l
= e1
->symtree
->n
.sym
->ns
->equiv_lists
;
1148 l
= gfc_current_ns
->equiv_lists
;
1150 /* Go through the equiv_lists and return 1 if the variables
1151 e1 and e2 are members of the same group and satisfy the
1152 requirement on their relative offsets. */
1153 for (; l
; l
= l
->next
)
1157 for (s
= l
->equiv
; s
; s
= s
->next
)
1159 if (s
->sym
== e1
->symtree
->n
.sym
)
1165 if (s
->sym
== e2
->symtree
->n
.sym
)
1175 /* Can these lengths be zero? */
1176 if (fl1
->length
<= 0 || fl2
->length
<= 0)
1178 /* These can't overlap if [f11,fl1+length] is before
1179 [fl2,fl2+length], or [fl2,fl2+length] is before
1180 [fl1,fl1+length], otherwise they do overlap. */
1181 if (fl1
->offset
+ fl1
->length
> fl2
->offset
1182 && fl2
->offset
+ fl2
->length
> fl1
->offset
)
1190 /* Return true if there is no possibility of aliasing because of a type
1191 mismatch between all the possible pointer references and the
1192 potential target. Note that this function is asymmetric in the
1193 arguments and so must be called twice with the arguments exchanged. */
1196 check_data_pointer_types (gfc_expr
*expr1
, gfc_expr
*expr2
)
1202 bool seen_component_ref
;
1204 if (expr1
->expr_type
!= EXPR_VARIABLE
1205 || expr2
->expr_type
!= EXPR_VARIABLE
)
1208 sym1
= expr1
->symtree
->n
.sym
;
1209 sym2
= expr2
->symtree
->n
.sym
;
1211 /* Keep it simple for now. */
1212 if (sym1
->ts
.type
== BT_DERIVED
&& sym2
->ts
.type
== BT_DERIVED
)
1215 if (sym1
->attr
.pointer
)
1217 if (gfc_compare_types (&sym1
->ts
, &sym2
->ts
))
1221 /* This is a conservative check on the components of the derived type
1222 if no component references have been seen. Since we will not dig
1223 into the components of derived type components, we play it safe by
1224 returning false. First we check the reference chain and then, if
1225 no component references have been seen, the components. */
1226 seen_component_ref
= false;
1227 if (sym1
->ts
.type
== BT_DERIVED
)
1229 for (ref1
= expr1
->ref
; ref1
; ref1
= ref1
->next
)
1231 if (ref1
->type
!= REF_COMPONENT
)
1234 if (ref1
->u
.c
.component
->ts
.type
== BT_DERIVED
)
1237 if ((sym2
->attr
.pointer
|| ref1
->u
.c
.component
->attr
.pointer
)
1238 && gfc_compare_types (&ref1
->u
.c
.component
->ts
, &sym2
->ts
))
1241 seen_component_ref
= true;
1245 if (sym1
->ts
.type
== BT_DERIVED
&& !seen_component_ref
)
1247 for (cm1
= sym1
->ts
.u
.derived
->components
; cm1
; cm1
= cm1
->next
)
1249 if (cm1
->ts
.type
== BT_DERIVED
)
1252 if ((sym2
->attr
.pointer
|| cm1
->attr
.pointer
)
1253 && gfc_compare_types (&cm1
->ts
, &sym2
->ts
))
1262 /* Return true if the statement body redefines the condition. Returns
1263 true if expr2 depends on expr1. expr1 should be a single term
1264 suitable for the lhs of an assignment. The IDENTICAL flag indicates
1265 whether array references to the same symbol with identical range
1266 references count as a dependency or not. Used for forall and where
1267 statements. Also used with functions returning arrays without a
1271 gfc_check_dependency (gfc_expr
*expr1
, gfc_expr
*expr2
, bool identical
)
1273 gfc_actual_arglist
*actual
;
1277 gcc_assert (expr1
->expr_type
== EXPR_VARIABLE
);
1279 switch (expr2
->expr_type
)
1282 n
= gfc_check_dependency (expr1
, expr2
->value
.op
.op1
, identical
);
1285 if (expr2
->value
.op
.op2
)
1286 return gfc_check_dependency (expr1
, expr2
->value
.op
.op2
, identical
);
1290 /* The interesting cases are when the symbols don't match. */
1291 if (expr1
->symtree
->n
.sym
!= expr2
->symtree
->n
.sym
)
1293 gfc_typespec
*ts1
= &expr1
->symtree
->n
.sym
->ts
;
1294 gfc_typespec
*ts2
= &expr2
->symtree
->n
.sym
->ts
;
1296 /* Return 1 if expr1 and expr2 are equivalenced arrays. */
1297 if (gfc_are_equivalenced_arrays (expr1
, expr2
))
1300 /* Symbols can only alias if they have the same type. */
1301 if (ts1
->type
!= BT_UNKNOWN
&& ts2
->type
!= BT_UNKNOWN
1302 && ts1
->type
!= BT_DERIVED
&& ts2
->type
!= BT_DERIVED
)
1304 if (ts1
->type
!= ts2
->type
|| ts1
->kind
!= ts2
->kind
)
1308 /* If either variable is a pointer, assume the worst. */
1309 /* TODO: -fassume-no-pointer-aliasing */
1310 if (gfc_is_data_pointer (expr1
) || gfc_is_data_pointer (expr2
))
1312 if (check_data_pointer_types (expr1
, expr2
)
1313 && check_data_pointer_types (expr2
, expr1
))
1320 gfc_symbol
*sym1
= expr1
->symtree
->n
.sym
;
1321 gfc_symbol
*sym2
= expr2
->symtree
->n
.sym
;
1322 if (sym1
->attr
.target
&& sym2
->attr
.target
1323 && ((sym1
->attr
.dummy
&& !sym1
->attr
.contiguous
1324 && (!sym1
->attr
.dimension
1325 || sym2
->as
->type
== AS_ASSUMED_SHAPE
))
1326 || (sym2
->attr
.dummy
&& !sym2
->attr
.contiguous
1327 && (!sym2
->attr
.dimension
1328 || sym2
->as
->type
== AS_ASSUMED_SHAPE
))))
1332 /* Otherwise distinct symbols have no dependencies. */
1339 /* Identical and disjoint ranges return 0,
1340 overlapping ranges return 1. */
1341 if (expr1
->ref
&& expr2
->ref
)
1342 return gfc_dep_resolver (expr1
->ref
, expr2
->ref
, NULL
);
1347 if (gfc_get_noncopying_intrinsic_argument (expr2
) != NULL
)
1350 /* Remember possible differences between elemental and
1351 transformational functions. All functions inside a FORALL
1353 for (actual
= expr2
->value
.function
.actual
;
1354 actual
; actual
= actual
->next
)
1358 n
= gfc_check_dependency (expr1
, actual
->expr
, identical
);
1369 /* Loop through the array constructor's elements. */
1370 for (c
= gfc_constructor_first (expr2
->value
.constructor
);
1371 c
; c
= gfc_constructor_next (c
))
1373 /* If this is an iterator, assume the worst. */
1376 /* Avoid recursion in the common case. */
1377 if (c
->expr
->expr_type
== EXPR_CONSTANT
)
1379 if (gfc_check_dependency (expr1
, c
->expr
, 1))
1390 /* Determines overlapping for two array sections. */
1392 static gfc_dependency
1393 check_section_vs_section (gfc_array_ref
*l_ar
, gfc_array_ref
*r_ar
, int n
)
1409 int stride_comparison
;
1410 int start_comparison
;
1413 /* If they are the same range, return without more ado. */
1414 if (is_same_range (l_ar
, r_ar
, n
))
1415 return GFC_DEP_EQUAL
;
1417 l_start
= l_ar
->start
[n
];
1418 l_end
= l_ar
->end
[n
];
1419 l_stride
= l_ar
->stride
[n
];
1421 r_start
= r_ar
->start
[n
];
1422 r_end
= r_ar
->end
[n
];
1423 r_stride
= r_ar
->stride
[n
];
1425 /* If l_start is NULL take it from array specifier. */
1426 if (NULL
== l_start
&& IS_ARRAY_EXPLICIT (l_ar
->as
))
1427 l_start
= l_ar
->as
->lower
[n
];
1428 /* If l_end is NULL take it from array specifier. */
1429 if (NULL
== l_end
&& IS_ARRAY_EXPLICIT (l_ar
->as
))
1430 l_end
= l_ar
->as
->upper
[n
];
1432 /* If r_start is NULL take it from array specifier. */
1433 if (NULL
== r_start
&& IS_ARRAY_EXPLICIT (r_ar
->as
))
1434 r_start
= r_ar
->as
->lower
[n
];
1435 /* If r_end is NULL take it from array specifier. */
1436 if (NULL
== r_end
&& IS_ARRAY_EXPLICIT (r_ar
->as
))
1437 r_end
= r_ar
->as
->upper
[n
];
1439 /* Determine whether the l_stride is positive or negative. */
1442 else if (l_stride
->expr_type
== EXPR_CONSTANT
1443 && l_stride
->ts
.type
== BT_INTEGER
)
1444 l_dir
= mpz_sgn (l_stride
->value
.integer
);
1445 else if (l_start
&& l_end
)
1446 l_dir
= gfc_dep_compare_expr (l_end
, l_start
);
1450 /* Determine whether the r_stride is positive or negative. */
1453 else if (r_stride
->expr_type
== EXPR_CONSTANT
1454 && r_stride
->ts
.type
== BT_INTEGER
)
1455 r_dir
= mpz_sgn (r_stride
->value
.integer
);
1456 else if (r_start
&& r_end
)
1457 r_dir
= gfc_dep_compare_expr (r_end
, r_start
);
1461 /* The strides should never be zero. */
1462 if (l_dir
== 0 || r_dir
== 0)
1463 return GFC_DEP_OVERLAP
;
1465 /* Determine the relationship between the strides. Set stride_comparison to
1466 -2 if the dependency cannot be determined
1467 -1 if l_stride < r_stride
1468 0 if l_stride == r_stride
1469 1 if l_stride > r_stride
1470 as determined by gfc_dep_compare_expr. */
1472 one_expr
= gfc_get_int_expr (gfc_index_integer_kind
, NULL
, 1);
1474 stride_comparison
= gfc_dep_compare_expr (l_stride
? l_stride
: one_expr
,
1475 r_stride
? r_stride
: one_expr
);
1477 if (l_start
&& r_start
)
1478 start_comparison
= gfc_dep_compare_expr (l_start
, r_start
);
1480 start_comparison
= -2;
1482 gfc_free_expr (one_expr
);
1484 /* Determine LHS upper and lower bounds. */
1490 else if (l_dir
== -1)
1501 /* Determine RHS upper and lower bounds. */
1507 else if (r_dir
== -1)
1518 /* Check whether the ranges are disjoint. */
1519 if (l_upper
&& r_lower
&& gfc_dep_compare_expr (l_upper
, r_lower
) == -1)
1520 return GFC_DEP_NODEP
;
1521 if (r_upper
&& l_lower
&& gfc_dep_compare_expr (r_upper
, l_lower
) == -1)
1522 return GFC_DEP_NODEP
;
1524 /* Handle cases like x:y:1 vs. x:z:-1 as GFC_DEP_EQUAL. */
1525 if (l_start
&& r_start
&& gfc_dep_compare_expr (l_start
, r_start
) == 0)
1527 if (l_dir
== 1 && r_dir
== -1)
1528 return GFC_DEP_EQUAL
;
1529 if (l_dir
== -1 && r_dir
== 1)
1530 return GFC_DEP_EQUAL
;
1533 /* Handle cases like x:y:1 vs. z:y:-1 as GFC_DEP_EQUAL. */
1534 if (l_end
&& r_end
&& gfc_dep_compare_expr (l_end
, r_end
) == 0)
1536 if (l_dir
== 1 && r_dir
== -1)
1537 return GFC_DEP_EQUAL
;
1538 if (l_dir
== -1 && r_dir
== 1)
1539 return GFC_DEP_EQUAL
;
1542 /* Handle cases like x:y:2 vs. x+1:z:4 as GFC_DEP_NODEP.
1543 There is no dependency if the remainder of
1544 (l_start - r_start) / gcd(l_stride, r_stride) is
1547 - Cases like a(1:4:2) = a(2:3) are still not handled.
1550 #define IS_CONSTANT_INTEGER(a) ((a) && ((a)->expr_type == EXPR_CONSTANT) \
1551 && (a)->ts.type == BT_INTEGER)
1553 if (IS_CONSTANT_INTEGER (l_stride
) && IS_CONSTANT_INTEGER (r_stride
)
1554 && gfc_dep_difference (l_start
, r_start
, &tmp
))
1560 mpz_gcd (gcd
, l_stride
->value
.integer
, r_stride
->value
.integer
);
1562 mpz_fdiv_r (tmp
, tmp
, gcd
);
1563 result
= mpz_cmp_si (tmp
, 0L);
1569 return GFC_DEP_NODEP
;
1572 #undef IS_CONSTANT_INTEGER
1574 /* Check for forward dependencies x:y vs. x+1:z and x:y:z vs. x:y:z+1. */
1576 if (l_dir
== 1 && r_dir
== 1 &&
1577 (start_comparison
== 0 || start_comparison
== -1)
1578 && (stride_comparison
== 0 || stride_comparison
== -1))
1579 return GFC_DEP_FORWARD
;
1581 /* Check for forward dependencies x:y:-1 vs. x-1:z:-1 and
1582 x:y:-1 vs. x:y:-2. */
1583 if (l_dir
== -1 && r_dir
== -1 &&
1584 (start_comparison
== 0 || start_comparison
== 1)
1585 && (stride_comparison
== 0 || stride_comparison
== 1))
1586 return GFC_DEP_FORWARD
;
1588 if (stride_comparison
== 0 || stride_comparison
== -1)
1590 if (l_start
&& IS_ARRAY_EXPLICIT (l_ar
->as
))
1593 /* Check for a(low:y:s) vs. a(z:x:s) or
1594 a(low:y:s) vs. a(z:x:s+1) where a has a lower bound
1595 of low, which is always at least a forward dependence. */
1598 && gfc_dep_compare_expr (l_start
, l_ar
->as
->lower
[n
]) == 0)
1599 return GFC_DEP_FORWARD
;
1603 if (stride_comparison
== 0 || stride_comparison
== 1)
1605 if (l_start
&& IS_ARRAY_EXPLICIT (l_ar
->as
))
1608 /* Check for a(high:y:-s) vs. a(z:x:-s) or
1609 a(high:y:-s vs. a(z:x:-s-1) where a has a higher bound
1610 of high, which is always at least a forward dependence. */
1613 && gfc_dep_compare_expr (l_start
, l_ar
->as
->upper
[n
]) == 0)
1614 return GFC_DEP_FORWARD
;
1619 if (stride_comparison
== 0)
1621 /* From here, check for backwards dependencies. */
1622 /* x+1:y vs. x:z. */
1623 if (l_dir
== 1 && r_dir
== 1 && start_comparison
== 1)
1624 return GFC_DEP_BACKWARD
;
1626 /* x-1:y:-1 vs. x:z:-1. */
1627 if (l_dir
== -1 && r_dir
== -1 && start_comparison
== -1)
1628 return GFC_DEP_BACKWARD
;
1631 return GFC_DEP_OVERLAP
;
1635 /* Determines overlapping for a single element and a section. */
1637 static gfc_dependency
1638 gfc_check_element_vs_section( gfc_ref
*lref
, gfc_ref
*rref
, int n
)
1647 elem
= lref
->u
.ar
.start
[n
];
1649 return GFC_DEP_OVERLAP
;
1652 start
= ref
->start
[n
] ;
1654 stride
= ref
->stride
[n
];
1656 if (!start
&& IS_ARRAY_EXPLICIT (ref
->as
))
1657 start
= ref
->as
->lower
[n
];
1658 if (!end
&& IS_ARRAY_EXPLICIT (ref
->as
))
1659 end
= ref
->as
->upper
[n
];
1661 /* Determine whether the stride is positive or negative. */
1664 else if (stride
->expr_type
== EXPR_CONSTANT
1665 && stride
->ts
.type
== BT_INTEGER
)
1666 s
= mpz_sgn (stride
->value
.integer
);
1670 /* Stride should never be zero. */
1672 return GFC_DEP_OVERLAP
;
1674 /* Positive strides. */
1677 /* Check for elem < lower. */
1678 if (start
&& gfc_dep_compare_expr (elem
, start
) == -1)
1679 return GFC_DEP_NODEP
;
1680 /* Check for elem > upper. */
1681 if (end
&& gfc_dep_compare_expr (elem
, end
) == 1)
1682 return GFC_DEP_NODEP
;
1686 s
= gfc_dep_compare_expr (start
, end
);
1687 /* Check for an empty range. */
1689 return GFC_DEP_NODEP
;
1690 if (s
== 0 && gfc_dep_compare_expr (elem
, start
) == 0)
1691 return GFC_DEP_EQUAL
;
1694 /* Negative strides. */
1697 /* Check for elem > upper. */
1698 if (end
&& gfc_dep_compare_expr (elem
, start
) == 1)
1699 return GFC_DEP_NODEP
;
1700 /* Check for elem < lower. */
1701 if (start
&& gfc_dep_compare_expr (elem
, end
) == -1)
1702 return GFC_DEP_NODEP
;
1706 s
= gfc_dep_compare_expr (start
, end
);
1707 /* Check for an empty range. */
1709 return GFC_DEP_NODEP
;
1710 if (s
== 0 && gfc_dep_compare_expr (elem
, start
) == 0)
1711 return GFC_DEP_EQUAL
;
1714 /* Unknown strides. */
1718 return GFC_DEP_OVERLAP
;
1719 s
= gfc_dep_compare_expr (start
, end
);
1721 return GFC_DEP_OVERLAP
;
1722 /* Assume positive stride. */
1725 /* Check for elem < lower. */
1726 if (gfc_dep_compare_expr (elem
, start
) == -1)
1727 return GFC_DEP_NODEP
;
1728 /* Check for elem > upper. */
1729 if (gfc_dep_compare_expr (elem
, end
) == 1)
1730 return GFC_DEP_NODEP
;
1732 /* Assume negative stride. */
1735 /* Check for elem > upper. */
1736 if (gfc_dep_compare_expr (elem
, start
) == 1)
1737 return GFC_DEP_NODEP
;
1738 /* Check for elem < lower. */
1739 if (gfc_dep_compare_expr (elem
, end
) == -1)
1740 return GFC_DEP_NODEP
;
1745 s
= gfc_dep_compare_expr (elem
, start
);
1747 return GFC_DEP_EQUAL
;
1748 if (s
== 1 || s
== -1)
1749 return GFC_DEP_NODEP
;
1753 return GFC_DEP_OVERLAP
;
1757 /* Traverse expr, checking all EXPR_VARIABLE symbols for their
1758 forall_index attribute. Return true if any variable may be
1759 being used as a FORALL index. Its safe to pessimistically
1760 return true, and assume a dependency. */
1763 contains_forall_index_p (gfc_expr
*expr
)
1765 gfc_actual_arglist
*arg
;
1773 switch (expr
->expr_type
)
1776 if (expr
->symtree
->n
.sym
->forall_index
)
1781 if (contains_forall_index_p (expr
->value
.op
.op1
)
1782 || contains_forall_index_p (expr
->value
.op
.op2
))
1787 for (arg
= expr
->value
.function
.actual
; arg
; arg
= arg
->next
)
1788 if (contains_forall_index_p (arg
->expr
))
1794 case EXPR_SUBSTRING
:
1797 case EXPR_STRUCTURE
:
1799 for (c
= gfc_constructor_first (expr
->value
.constructor
);
1800 c
; gfc_constructor_next (c
))
1801 if (contains_forall_index_p (c
->expr
))
1809 for (ref
= expr
->ref
; ref
; ref
= ref
->next
)
1813 for (i
= 0; i
< ref
->u
.ar
.dimen
; i
++)
1814 if (contains_forall_index_p (ref
->u
.ar
.start
[i
])
1815 || contains_forall_index_p (ref
->u
.ar
.end
[i
])
1816 || contains_forall_index_p (ref
->u
.ar
.stride
[i
]))
1824 if (contains_forall_index_p (ref
->u
.ss
.start
)
1825 || contains_forall_index_p (ref
->u
.ss
.end
))
1836 /* Determines overlapping for two single element array references. */
1838 static gfc_dependency
1839 gfc_check_element_vs_element (gfc_ref
*lref
, gfc_ref
*rref
, int n
)
1849 l_start
= l_ar
.start
[n
] ;
1850 r_start
= r_ar
.start
[n
] ;
1851 i
= gfc_dep_compare_expr (r_start
, l_start
);
1853 return GFC_DEP_EQUAL
;
1855 /* Treat two scalar variables as potentially equal. This allows
1856 us to prove that a(i,:) and a(j,:) have no dependency. See
1857 Gerald Roth, "Evaluation of Array Syntax Dependence Analysis",
1858 Proceedings of the International Conference on Parallel and
1859 Distributed Processing Techniques and Applications (PDPTA2001),
1860 Las Vegas, Nevada, June 2001. */
1861 /* However, we need to be careful when either scalar expression
1862 contains a FORALL index, as these can potentially change value
1863 during the scalarization/traversal of this array reference. */
1864 if (contains_forall_index_p (r_start
) || contains_forall_index_p (l_start
))
1865 return GFC_DEP_OVERLAP
;
1868 return GFC_DEP_NODEP
;
1869 return GFC_DEP_EQUAL
;
1873 /* Determine if an array ref, usually an array section specifies the
1874 entire array. In addition, if the second, pointer argument is
1875 provided, the function will return true if the reference is
1876 contiguous; eg. (:, 1) gives true but (1,:) gives false. */
1879 gfc_full_array_ref_p (gfc_ref
*ref
, bool *contiguous
)
1883 bool lbound_OK
= true;
1884 bool ubound_OK
= true;
1887 *contiguous
= false;
1889 if (ref
->type
!= REF_ARRAY
)
1892 if (ref
->u
.ar
.type
== AR_FULL
)
1899 if (ref
->u
.ar
.type
!= AR_SECTION
)
1904 for (i
= 0; i
< ref
->u
.ar
.dimen
; i
++)
1906 /* If we have a single element in the reference, for the reference
1907 to be full, we need to ascertain that the array has a single
1908 element in this dimension and that we actually reference the
1910 if (ref
->u
.ar
.dimen_type
[i
] == DIMEN_ELEMENT
)
1912 /* This is unconditionally a contiguous reference if all the
1913 remaining dimensions are elements. */
1917 for (n
= i
+ 1; n
< ref
->u
.ar
.dimen
; n
++)
1918 if (ref
->u
.ar
.dimen_type
[n
] != DIMEN_ELEMENT
)
1919 *contiguous
= false;
1923 || !ref
->u
.ar
.as
->lower
[i
]
1924 || !ref
->u
.ar
.as
->upper
[i
]
1925 || gfc_dep_compare_expr (ref
->u
.ar
.as
->lower
[i
],
1926 ref
->u
.ar
.as
->upper
[i
])
1927 || !ref
->u
.ar
.start
[i
]
1928 || gfc_dep_compare_expr (ref
->u
.ar
.start
[i
],
1929 ref
->u
.ar
.as
->lower
[i
]))
1935 /* Check the lower bound. */
1936 if (ref
->u
.ar
.start
[i
]
1938 || !ref
->u
.ar
.as
->lower
[i
]
1939 || gfc_dep_compare_expr (ref
->u
.ar
.start
[i
],
1940 ref
->u
.ar
.as
->lower
[i
])))
1942 /* Check the upper bound. */
1943 if (ref
->u
.ar
.end
[i
]
1945 || !ref
->u
.ar
.as
->upper
[i
]
1946 || gfc_dep_compare_expr (ref
->u
.ar
.end
[i
],
1947 ref
->u
.ar
.as
->upper
[i
])))
1949 /* Check the stride. */
1950 if (ref
->u
.ar
.stride
[i
]
1951 && !gfc_expr_is_one (ref
->u
.ar
.stride
[i
], 0))
1954 /* This is unconditionally a contiguous reference as long as all
1955 the subsequent dimensions are elements. */
1959 for (n
= i
+ 1; n
< ref
->u
.ar
.dimen
; n
++)
1960 if (ref
->u
.ar
.dimen_type
[n
] != DIMEN_ELEMENT
)
1961 *contiguous
= false;
1964 if (!lbound_OK
|| !ubound_OK
)
1971 /* Determine if a full array is the same as an array section with one
1972 variable limit. For this to be so, the strides must both be unity
1973 and one of either start == lower or end == upper must be true. */
1976 ref_same_as_full_array (gfc_ref
*full_ref
, gfc_ref
*ref
)
1979 bool upper_or_lower
;
1981 if (full_ref
->type
!= REF_ARRAY
)
1983 if (full_ref
->u
.ar
.type
!= AR_FULL
)
1985 if (ref
->type
!= REF_ARRAY
)
1987 if (ref
->u
.ar
.type
!= AR_SECTION
)
1990 for (i
= 0; i
< ref
->u
.ar
.dimen
; i
++)
1992 /* If we have a single element in the reference, we need to check
1993 that the array has a single element and that we actually reference
1994 the correct element. */
1995 if (ref
->u
.ar
.dimen_type
[i
] == DIMEN_ELEMENT
)
1997 if (!full_ref
->u
.ar
.as
1998 || !full_ref
->u
.ar
.as
->lower
[i
]
1999 || !full_ref
->u
.ar
.as
->upper
[i
]
2000 || gfc_dep_compare_expr (full_ref
->u
.ar
.as
->lower
[i
],
2001 full_ref
->u
.ar
.as
->upper
[i
])
2002 || !ref
->u
.ar
.start
[i
]
2003 || gfc_dep_compare_expr (ref
->u
.ar
.start
[i
],
2004 full_ref
->u
.ar
.as
->lower
[i
]))
2008 /* Check the strides. */
2009 if (full_ref
->u
.ar
.stride
[i
] && !gfc_expr_is_one (full_ref
->u
.ar
.stride
[i
], 0))
2011 if (ref
->u
.ar
.stride
[i
] && !gfc_expr_is_one (ref
->u
.ar
.stride
[i
], 0))
2014 upper_or_lower
= false;
2015 /* Check the lower bound. */
2016 if (ref
->u
.ar
.start
[i
]
2018 && full_ref
->u
.ar
.as
->lower
[i
]
2019 && gfc_dep_compare_expr (ref
->u
.ar
.start
[i
],
2020 full_ref
->u
.ar
.as
->lower
[i
]) == 0))
2021 upper_or_lower
= true;
2022 /* Check the upper bound. */
2023 if (ref
->u
.ar
.end
[i
]
2025 && full_ref
->u
.ar
.as
->upper
[i
]
2026 && gfc_dep_compare_expr (ref
->u
.ar
.end
[i
],
2027 full_ref
->u
.ar
.as
->upper
[i
]) == 0))
2028 upper_or_lower
= true;
2029 if (!upper_or_lower
)
2036 /* Finds if two array references are overlapping or not.
2038 2 : array references are overlapping but reversal of one or
2039 more dimensions will clear the dependency.
2040 1 : array references are overlapping.
2041 0 : array references are identical or not overlapping. */
2044 gfc_dep_resolver (gfc_ref
*lref
, gfc_ref
*rref
, gfc_reverse
*reverse
)
2047 gfc_dependency fin_dep
;
2048 gfc_dependency this_dep
;
2050 this_dep
= GFC_DEP_ERROR
;
2051 fin_dep
= GFC_DEP_ERROR
;
2052 /* Dependencies due to pointers should already have been identified.
2053 We only need to check for overlapping array references. */
2055 while (lref
&& rref
)
2057 /* We're resolving from the same base symbol, so both refs should be
2058 the same type. We traverse the reference chain until we find ranges
2059 that are not equal. */
2060 gcc_assert (lref
->type
== rref
->type
);
2064 /* The two ranges can't overlap if they are from different
2066 if (lref
->u
.c
.component
!= rref
->u
.c
.component
)
2071 /* Substring overlaps are handled by the string assignment code
2072 if there is not an underlying dependency. */
2073 return (fin_dep
== GFC_DEP_OVERLAP
) ? 1 : 0;
2077 if (ref_same_as_full_array (lref
, rref
))
2080 if (ref_same_as_full_array (rref
, lref
))
2083 if (lref
->u
.ar
.dimen
!= rref
->u
.ar
.dimen
)
2085 if (lref
->u
.ar
.type
== AR_FULL
)
2086 fin_dep
= gfc_full_array_ref_p (rref
, NULL
) ? GFC_DEP_EQUAL
2088 else if (rref
->u
.ar
.type
== AR_FULL
)
2089 fin_dep
= gfc_full_array_ref_p (lref
, NULL
) ? GFC_DEP_EQUAL
2096 for (n
=0; n
< lref
->u
.ar
.dimen
; n
++)
2098 /* Handle dependency when either of array reference is vector
2099 subscript. There is no dependency if the vector indices
2100 are equal or if indices are known to be different in a
2101 different dimension. */
2102 if (lref
->u
.ar
.dimen_type
[n
] == DIMEN_VECTOR
2103 || rref
->u
.ar
.dimen_type
[n
] == DIMEN_VECTOR
)
2105 if (lref
->u
.ar
.dimen_type
[n
] == DIMEN_VECTOR
2106 && rref
->u
.ar
.dimen_type
[n
] == DIMEN_VECTOR
2107 && gfc_dep_compare_expr (lref
->u
.ar
.start
[n
],
2108 rref
->u
.ar
.start
[n
]) == 0)
2109 this_dep
= GFC_DEP_EQUAL
;
2111 this_dep
= GFC_DEP_OVERLAP
;
2113 goto update_fin_dep
;
2116 if (lref
->u
.ar
.dimen_type
[n
] == DIMEN_RANGE
2117 && rref
->u
.ar
.dimen_type
[n
] == DIMEN_RANGE
)
2118 this_dep
= check_section_vs_section (&lref
->u
.ar
, &rref
->u
.ar
, n
);
2119 else if (lref
->u
.ar
.dimen_type
[n
] == DIMEN_ELEMENT
2120 && rref
->u
.ar
.dimen_type
[n
] == DIMEN_RANGE
)
2121 this_dep
= gfc_check_element_vs_section (lref
, rref
, n
);
2122 else if (rref
->u
.ar
.dimen_type
[n
] == DIMEN_ELEMENT
2123 && lref
->u
.ar
.dimen_type
[n
] == DIMEN_RANGE
)
2124 this_dep
= gfc_check_element_vs_section (rref
, lref
, n
);
2127 gcc_assert (rref
->u
.ar
.dimen_type
[n
] == DIMEN_ELEMENT
2128 && lref
->u
.ar
.dimen_type
[n
] == DIMEN_ELEMENT
);
2129 this_dep
= gfc_check_element_vs_element (rref
, lref
, n
);
2132 /* If any dimension doesn't overlap, we have no dependency. */
2133 if (this_dep
== GFC_DEP_NODEP
)
2136 /* Now deal with the loop reversal logic: This only works on
2137 ranges and is activated by setting
2138 reverse[n] == GFC_ENABLE_REVERSE
2139 The ability to reverse or not is set by previous conditions
2140 in this dimension. If reversal is not activated, the
2141 value GFC_DEP_BACKWARD is reset to GFC_DEP_OVERLAP. */
2142 if (rref
->u
.ar
.dimen_type
[n
] == DIMEN_RANGE
2143 && lref
->u
.ar
.dimen_type
[n
] == DIMEN_RANGE
)
2145 /* Set reverse if backward dependence and not inhibited. */
2146 if (reverse
&& reverse
[n
] == GFC_ENABLE_REVERSE
)
2147 reverse
[n
] = (this_dep
== GFC_DEP_BACKWARD
) ?
2148 GFC_REVERSE_SET
: reverse
[n
];
2150 /* Set forward if forward dependence and not inhibited. */
2151 if (reverse
&& reverse
[n
] == GFC_ENABLE_REVERSE
)
2152 reverse
[n
] = (this_dep
== GFC_DEP_FORWARD
) ?
2153 GFC_FORWARD_SET
: reverse
[n
];
2155 /* Flag up overlap if dependence not compatible with
2156 the overall state of the expression. */
2157 if (reverse
&& reverse
[n
] == GFC_REVERSE_SET
2158 && this_dep
== GFC_DEP_FORWARD
)
2160 reverse
[n
] = GFC_INHIBIT_REVERSE
;
2161 this_dep
= GFC_DEP_OVERLAP
;
2163 else if (reverse
&& reverse
[n
] == GFC_FORWARD_SET
2164 && this_dep
== GFC_DEP_BACKWARD
)
2166 reverse
[n
] = GFC_INHIBIT_REVERSE
;
2167 this_dep
= GFC_DEP_OVERLAP
;
2170 /* If no intention of reversing or reversing is explicitly
2171 inhibited, convert backward dependence to overlap. */
2172 if ((reverse
== NULL
&& this_dep
== GFC_DEP_BACKWARD
)
2173 || (reverse
!= NULL
&& reverse
[n
] == GFC_INHIBIT_REVERSE
))
2174 this_dep
= GFC_DEP_OVERLAP
;
2177 /* Overlap codes are in order of priority. We only need to
2178 know the worst one.*/
2181 if (this_dep
> fin_dep
)
2185 /* If this is an equal element, we have to keep going until we find
2186 the "real" array reference. */
2187 if (lref
->u
.ar
.type
== AR_ELEMENT
2188 && rref
->u
.ar
.type
== AR_ELEMENT
2189 && fin_dep
== GFC_DEP_EQUAL
)
2192 /* Exactly matching and forward overlapping ranges don't cause a
2194 if (fin_dep
< GFC_DEP_BACKWARD
)
2197 /* Keep checking. We only have a dependency if
2198 subsequent references also overlap. */
2208 /* If we haven't seen any array refs then something went wrong. */
2209 gcc_assert (fin_dep
!= GFC_DEP_ERROR
);
2211 /* Assume the worst if we nest to different depths. */
2215 return fin_dep
== GFC_DEP_OVERLAP
;