2 /* Data references and dependences detectors.
3 Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4 Contributed by Sebastian Pop <pop@cri.ensmp.fr>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* This pass walks a given loop structure searching for array
23 references. The information about the array accesses is recorded
24 in DATA_REFERENCE structures.
26 The basic test for determining the dependences is:
27 given two access functions chrec1 and chrec2 to a same array, and
28 x and y two vectors from the iteration domain, the same element of
29 the array is accessed twice at iterations x and y if and only if:
30 | chrec1 (x) == chrec2 (y).
32 The goals of this analysis are:
34 - to determine the independence: the relation between two
35 independent accesses is qualified with the chrec_known (this
36 information allows a loop parallelization),
38 - when two data references access the same data, to qualify the
39 dependence relation with classic dependence representations:
43 - loop carried level dependence
44 - polyhedron dependence
45 or with the chains of recurrences based representation,
47 - to define a knowledge base for storing the data dependence
50 - to define an interface to access this data.
55 - subscript: given two array accesses a subscript is the tuple
56 composed of the access functions for a given dimension. Example:
57 Given A[f1][f2][f3] and B[g1][g2][g3], there are three subscripts:
58 (f1, g1), (f2, g2), (f3, g3).
60 - Diophantine equation: an equation whose coefficients and
61 solutions are integer constants, for example the equation
63 has an integer solution x = 1 and y = -1.
67 - "Advanced Compilation for High Performance Computing" by Randy
68 Allen and Ken Kennedy.
69 http://citeseer.ist.psu.edu/goff91practical.html
71 - "Loop Transformations for Restructuring Compilers - The Foundations"
79 #include "coretypes.h"
84 /* These RTL headers are needed for basic-block.h. */
86 #include "basic-block.h"
87 #include "diagnostic.h"
88 #include "tree-flow.h"
89 #include "tree-dump.h"
92 #include "tree-chrec.h"
93 #include "tree-data-ref.h"
94 #include "tree-scalar-evolution.h"
95 #include "tree-pass.h"
97 static struct datadep_stats
99 int num_dependence_tests
;
100 int num_dependence_dependent
;
101 int num_dependence_independent
;
102 int num_dependence_undetermined
;
104 int num_subscript_tests
;
105 int num_subscript_undetermined
;
106 int num_same_subscript_function
;
109 int num_ziv_independent
;
110 int num_ziv_dependent
;
111 int num_ziv_unimplemented
;
114 int num_siv_independent
;
115 int num_siv_dependent
;
116 int num_siv_unimplemented
;
119 int num_miv_independent
;
120 int num_miv_dependent
;
121 int num_miv_unimplemented
;
124 static tree
object_analysis (tree
, tree
, bool, struct data_reference
**,
125 tree
*, tree
*, tree
*, tree
*, tree
*,
126 struct ptr_info_def
**, subvar_t
*);
127 static struct data_reference
* init_data_ref (tree
, tree
, tree
, tree
, bool,
128 tree
, tree
, tree
, tree
, tree
,
129 struct ptr_info_def
*,
131 static bool subscript_dependence_tester_1 (struct data_dependence_relation
*,
132 struct data_reference
*,
133 struct data_reference
*);
135 /* Determine if PTR and DECL may alias, the result is put in ALIASED.
136 Return FALSE if there is no symbol memory tag for PTR. */
139 ptr_decl_may_alias_p (tree ptr
, tree decl
,
140 struct data_reference
*ptr_dr
,
143 tree tag
= NULL_TREE
;
144 struct ptr_info_def
*pi
= DR_PTR_INFO (ptr_dr
);
146 gcc_assert (TREE_CODE (ptr
) == SSA_NAME
&& DECL_P (decl
));
149 tag
= pi
->name_mem_tag
;
151 tag
= get_var_ann (SSA_NAME_VAR (ptr
))->symbol_mem_tag
;
153 tag
= DR_MEMTAG (ptr_dr
);
157 *aliased
= is_aliased_with (tag
, decl
);
162 /* Determine if two pointers may alias, the result is put in ALIASED.
163 Return FALSE if there is no symbol memory tag for one of the pointers. */
166 ptr_ptr_may_alias_p (tree ptr_a
, tree ptr_b
,
167 struct data_reference
*dra
,
168 struct data_reference
*drb
,
171 tree tag_a
= NULL_TREE
, tag_b
= NULL_TREE
;
172 struct ptr_info_def
*pi_a
= DR_PTR_INFO (dra
);
173 struct ptr_info_def
*pi_b
= DR_PTR_INFO (drb
);
175 if (pi_a
&& pi_a
->name_mem_tag
&& pi_b
&& pi_b
->name_mem_tag
)
177 tag_a
= pi_a
->name_mem_tag
;
178 tag_b
= pi_b
->name_mem_tag
;
182 tag_a
= get_var_ann (SSA_NAME_VAR (ptr_a
))->symbol_mem_tag
;
184 tag_a
= DR_MEMTAG (dra
);
188 tag_b
= get_var_ann (SSA_NAME_VAR (ptr_b
))->symbol_mem_tag
;
190 tag_b
= DR_MEMTAG (drb
);
198 *aliased
= may_aliases_intersect (tag_a
, tag_b
);
204 /* Determine if BASE_A and BASE_B may alias, the result is put in ALIASED.
205 Return FALSE if there is no symbol memory tag for one of the symbols. */
208 may_alias_p (tree base_a
, tree base_b
,
209 struct data_reference
*dra
,
210 struct data_reference
*drb
,
213 if (TREE_CODE (base_a
) == ADDR_EXPR
|| TREE_CODE (base_b
) == ADDR_EXPR
)
215 if (TREE_CODE (base_a
) == ADDR_EXPR
&& TREE_CODE (base_b
) == ADDR_EXPR
)
217 *aliased
= (TREE_OPERAND (base_a
, 0) == TREE_OPERAND (base_b
, 0));
220 if (TREE_CODE (base_a
) == ADDR_EXPR
)
221 return ptr_decl_may_alias_p (base_b
, TREE_OPERAND (base_a
, 0), drb
,
224 return ptr_decl_may_alias_p (base_a
, TREE_OPERAND (base_b
, 0), dra
,
228 return ptr_ptr_may_alias_p (base_a
, base_b
, dra
, drb
, aliased
);
232 /* Determine if a pointer (BASE_A) and a record/union access (BASE_B)
233 are not aliased. Return TRUE if they differ. */
235 record_ptr_differ_p (struct data_reference
*dra
,
236 struct data_reference
*drb
)
239 tree base_a
= DR_BASE_OBJECT (dra
);
240 tree base_b
= DR_BASE_OBJECT (drb
);
242 if (TREE_CODE (base_b
) != COMPONENT_REF
)
245 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
246 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
247 Probably will be unnecessary with struct alias analysis. */
248 while (TREE_CODE (base_b
) == COMPONENT_REF
)
249 base_b
= TREE_OPERAND (base_b
, 0);
250 /* Compare a record/union access (b.c[i] or p->c[i]) and a pointer
252 if (TREE_CODE (base_a
) == INDIRECT_REF
253 && ((TREE_CODE (base_b
) == VAR_DECL
254 && (ptr_decl_may_alias_p (TREE_OPERAND (base_a
, 0), base_b
, dra
,
257 || (TREE_CODE (base_b
) == INDIRECT_REF
258 && (ptr_ptr_may_alias_p (TREE_OPERAND (base_a
, 0),
259 TREE_OPERAND (base_b
, 0), dra
, drb
,
267 /* Determine if two record/union accesses are aliased. Return TRUE if they
270 record_record_differ_p (struct data_reference
*dra
,
271 struct data_reference
*drb
)
274 tree base_a
= DR_BASE_OBJECT (dra
);
275 tree base_b
= DR_BASE_OBJECT (drb
);
277 if (TREE_CODE (base_b
) != COMPONENT_REF
278 || TREE_CODE (base_a
) != COMPONENT_REF
)
281 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
282 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
283 Probably will be unnecessary with struct alias analysis. */
284 while (TREE_CODE (base_b
) == COMPONENT_REF
)
285 base_b
= TREE_OPERAND (base_b
, 0);
286 while (TREE_CODE (base_a
) == COMPONENT_REF
)
287 base_a
= TREE_OPERAND (base_a
, 0);
289 if (TREE_CODE (base_a
) == INDIRECT_REF
290 && TREE_CODE (base_b
) == INDIRECT_REF
291 && ptr_ptr_may_alias_p (TREE_OPERAND (base_a
, 0),
292 TREE_OPERAND (base_b
, 0),
300 /* Determine if an array access (BASE_A) and a record/union access (BASE_B)
301 are not aliased. Return TRUE if they differ. */
303 record_array_differ_p (struct data_reference
*dra
,
304 struct data_reference
*drb
)
307 tree base_a
= DR_BASE_OBJECT (dra
);
308 tree base_b
= DR_BASE_OBJECT (drb
);
310 if (TREE_CODE (base_b
) != COMPONENT_REF
)
313 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
314 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
315 Probably will be unnecessary with struct alias analysis. */
316 while (TREE_CODE (base_b
) == COMPONENT_REF
)
317 base_b
= TREE_OPERAND (base_b
, 0);
319 /* Compare a record/union access (b.c[i] or p->c[i]) and an array access
320 (a[i]). In case of p->c[i] use alias analysis to verify that p is not
322 if (TREE_CODE (base_a
) == VAR_DECL
323 && (TREE_CODE (base_b
) == VAR_DECL
324 || (TREE_CODE (base_b
) == INDIRECT_REF
325 && (ptr_decl_may_alias_p (TREE_OPERAND (base_b
, 0), base_a
, drb
,
334 /* Determine if an array access (BASE_A) and a pointer (BASE_B)
335 are not aliased. Return TRUE if they differ. */
337 array_ptr_differ_p (tree base_a
, tree base_b
,
338 struct data_reference
*drb
)
342 /* In case one of the bases is a pointer (a[i] and (*p)[i]), we check with the
343 help of alias analysis that p is not pointing to a. */
344 if (TREE_CODE (base_a
) == VAR_DECL
&& TREE_CODE (base_b
) == INDIRECT_REF
345 && (ptr_decl_may_alias_p (TREE_OPERAND (base_b
, 0), base_a
, drb
, &aliased
)
353 /* This is the simplest data dependence test: determines whether the
354 data references A and B access the same array/region. Returns
355 false when the property is not computable at compile time.
356 Otherwise return true, and DIFFER_P will record the result. This
357 utility will not be necessary when alias_sets_conflict_p will be
358 less conservative. */
361 base_object_differ_p (struct data_reference
*a
,
362 struct data_reference
*b
,
365 tree base_a
= DR_BASE_OBJECT (a
);
366 tree base_b
= DR_BASE_OBJECT (b
);
369 if (!base_a
|| !base_b
)
372 /* Determine if same base. Example: for the array accesses
373 a[i], b[i] or pointer accesses *a, *b, bases are a, b. */
374 if (base_a
== base_b
)
380 /* For pointer based accesses, (*p)[i], (*q)[j], the bases are (*p)
382 if (TREE_CODE (base_a
) == INDIRECT_REF
&& TREE_CODE (base_b
) == INDIRECT_REF
383 && TREE_OPERAND (base_a
, 0) == TREE_OPERAND (base_b
, 0))
389 /* Record/union based accesses - s.a[i], t.b[j]. bases are s.a,t.b. */
390 if (TREE_CODE (base_a
) == COMPONENT_REF
&& TREE_CODE (base_b
) == COMPONENT_REF
391 && TREE_OPERAND (base_a
, 0) == TREE_OPERAND (base_b
, 0)
392 && TREE_OPERAND (base_a
, 1) == TREE_OPERAND (base_b
, 1))
399 /* Determine if different bases. */
401 /* At this point we know that base_a != base_b. However, pointer
402 accesses of the form x=(*p) and y=(*q), whose bases are p and q,
403 may still be pointing to the same base. In SSAed GIMPLE p and q will
404 be SSA_NAMES in this case. Therefore, here we check if they are
405 really two different declarations. */
406 if (TREE_CODE (base_a
) == VAR_DECL
&& TREE_CODE (base_b
) == VAR_DECL
)
412 /* In case one of the bases is a pointer (a[i] and (*p)[i]), we check with the
413 help of alias analysis that p is not pointing to a. */
414 if (array_ptr_differ_p (base_a
, base_b
, b
)
415 || array_ptr_differ_p (base_b
, base_a
, a
))
421 /* If the bases are pointers ((*q)[i] and (*p)[i]), we check with the
422 help of alias analysis they don't point to the same bases. */
423 if (TREE_CODE (base_a
) == INDIRECT_REF
&& TREE_CODE (base_b
) == INDIRECT_REF
424 && (may_alias_p (TREE_OPERAND (base_a
, 0), TREE_OPERAND (base_b
, 0), a
, b
,
432 /* Compare two record/union bases s.a and t.b: s != t or (a != b and
433 s and t are not unions). */
434 if (TREE_CODE (base_a
) == COMPONENT_REF
&& TREE_CODE (base_b
) == COMPONENT_REF
435 && ((TREE_CODE (TREE_OPERAND (base_a
, 0)) == VAR_DECL
436 && TREE_CODE (TREE_OPERAND (base_b
, 0)) == VAR_DECL
437 && TREE_OPERAND (base_a
, 0) != TREE_OPERAND (base_b
, 0))
438 || (TREE_CODE (TREE_TYPE (TREE_OPERAND (base_a
, 0))) == RECORD_TYPE
439 && TREE_CODE (TREE_TYPE (TREE_OPERAND (base_b
, 0))) == RECORD_TYPE
440 && TREE_OPERAND (base_a
, 1) != TREE_OPERAND (base_b
, 1))))
446 /* Compare a record/union access (b.c[i] or p->c[i]) and a pointer
448 if (record_ptr_differ_p (a
, b
) || record_ptr_differ_p (b
, a
))
454 /* Compare a record/union access (b.c[i] or p->c[i]) and an array access
455 (a[i]). In case of p->c[i] use alias analysis to verify that p is not
457 if (record_array_differ_p (a
, b
) || record_array_differ_p (b
, a
))
463 /* Compare two record/union accesses (b.c[i] or p->c[i]). */
464 if (record_record_differ_p (a
, b
))
473 /* Function base_addr_differ_p.
475 This is the simplest data dependence test: determines whether the
476 data references DRA and DRB access the same array/region. Returns
477 false when the property is not computable at compile time.
478 Otherwise return true, and DIFFER_P will record the result.
481 1. if (both DRA and DRB are represented as arrays)
482 compare DRA.BASE_OBJECT and DRB.BASE_OBJECT
483 2. else if (both DRA and DRB are represented as pointers)
484 try to prove that DRA.FIRST_LOCATION == DRB.FIRST_LOCATION
485 3. else if (DRA and DRB are represented differently or 2. fails)
486 only try to prove that the bases are surely different
490 base_addr_differ_p (struct data_reference
*dra
,
491 struct data_reference
*drb
,
494 tree addr_a
= DR_BASE_ADDRESS (dra
);
495 tree addr_b
= DR_BASE_ADDRESS (drb
);
499 if (!addr_a
|| !addr_b
)
502 type_a
= TREE_TYPE (addr_a
);
503 type_b
= TREE_TYPE (addr_b
);
505 gcc_assert (POINTER_TYPE_P (type_a
) && POINTER_TYPE_P (type_b
));
507 /* 1. if (both DRA and DRB are represented as arrays)
508 compare DRA.BASE_OBJECT and DRB.BASE_OBJECT. */
509 if (DR_TYPE (dra
) == ARRAY_REF_TYPE
&& DR_TYPE (drb
) == ARRAY_REF_TYPE
)
510 return base_object_differ_p (dra
, drb
, differ_p
);
512 /* 2. else if (both DRA and DRB are represented as pointers)
513 try to prove that DRA.FIRST_LOCATION == DRB.FIRST_LOCATION. */
514 /* If base addresses are the same, we check the offsets, since the access of
515 the data-ref is described by {base addr + offset} and its access function,
516 i.e., in order to decide whether the bases of data-refs are the same we
517 compare both base addresses and offsets. */
518 if (DR_TYPE (dra
) == POINTER_REF_TYPE
&& DR_TYPE (drb
) == POINTER_REF_TYPE
520 || (TREE_CODE (addr_a
) == ADDR_EXPR
&& TREE_CODE (addr_b
) == ADDR_EXPR
521 && TREE_OPERAND (addr_a
, 0) == TREE_OPERAND (addr_b
, 0))))
523 /* Compare offsets. */
524 tree offset_a
= DR_OFFSET (dra
);
525 tree offset_b
= DR_OFFSET (drb
);
527 STRIP_NOPS (offset_a
);
528 STRIP_NOPS (offset_b
);
530 /* FORNOW: we only compare offsets that are MULT_EXPR, i.e., we don't handle
532 if (offset_a
== offset_b
533 || (TREE_CODE (offset_a
) == MULT_EXPR
534 && TREE_CODE (offset_b
) == MULT_EXPR
535 && TREE_OPERAND (offset_a
, 0) == TREE_OPERAND (offset_b
, 0)
536 && TREE_OPERAND (offset_a
, 1) == TREE_OPERAND (offset_b
, 1)))
543 /* 3. else if (DRA and DRB are represented differently or 2. fails)
544 only try to prove that the bases are surely different. */
546 /* Apply alias analysis. */
547 if (may_alias_p (addr_a
, addr_b
, dra
, drb
, &aliased
) && !aliased
)
553 /* An instruction writing through a restricted pointer is "independent" of any
554 instruction reading or writing through a different pointer, in the same
556 else if ((TYPE_RESTRICT (type_a
) && !DR_IS_READ (dra
))
557 || (TYPE_RESTRICT (type_b
) && !DR_IS_READ (drb
)))
565 /* Returns true iff A divides B. */
568 tree_fold_divides_p (tree a
,
571 /* Determines whether (A == gcd (A, B)). */
572 return tree_int_cst_equal (a
, tree_fold_gcd (a
, b
));
575 /* Returns true iff A divides B. */
578 int_divides_p (int a
, int b
)
580 return ((b
% a
) == 0);
585 /* Dump into FILE all the data references from DATAREFS. */
588 dump_data_references (FILE *file
, VEC (data_reference_p
, heap
) *datarefs
)
591 struct data_reference
*dr
;
593 for (i
= 0; VEC_iterate (data_reference_p
, datarefs
, i
, dr
); i
++)
594 dump_data_reference (file
, dr
);
597 /* Dump into FILE all the dependence relations from DDRS. */
600 dump_data_dependence_relations (FILE *file
,
601 VEC (ddr_p
, heap
) *ddrs
)
604 struct data_dependence_relation
*ddr
;
606 for (i
= 0; VEC_iterate (ddr_p
, ddrs
, i
, ddr
); i
++)
607 dump_data_dependence_relation (file
, ddr
);
610 /* Dump function for a DATA_REFERENCE structure. */
613 dump_data_reference (FILE *outf
,
614 struct data_reference
*dr
)
618 fprintf (outf
, "(Data Ref: \n stmt: ");
619 print_generic_stmt (outf
, DR_STMT (dr
), 0);
620 fprintf (outf
, " ref: ");
621 print_generic_stmt (outf
, DR_REF (dr
), 0);
622 fprintf (outf
, " base_object: ");
623 print_generic_stmt (outf
, DR_BASE_OBJECT (dr
), 0);
625 for (i
= 0; i
< DR_NUM_DIMENSIONS (dr
); i
++)
627 fprintf (outf
, " Access function %d: ", i
);
628 print_generic_stmt (outf
, DR_ACCESS_FN (dr
, i
), 0);
630 fprintf (outf
, ")\n");
633 /* Dump function for a SUBSCRIPT structure. */
636 dump_subscript (FILE *outf
, struct subscript
*subscript
)
638 tree chrec
= SUB_CONFLICTS_IN_A (subscript
);
640 fprintf (outf
, "\n (subscript \n");
641 fprintf (outf
, " iterations_that_access_an_element_twice_in_A: ");
642 print_generic_stmt (outf
, chrec
, 0);
643 if (chrec
== chrec_known
)
644 fprintf (outf
, " (no dependence)\n");
645 else if (chrec_contains_undetermined (chrec
))
646 fprintf (outf
, " (don't know)\n");
649 tree last_iteration
= SUB_LAST_CONFLICT (subscript
);
650 fprintf (outf
, " last_conflict: ");
651 print_generic_stmt (outf
, last_iteration
, 0);
654 chrec
= SUB_CONFLICTS_IN_B (subscript
);
655 fprintf (outf
, " iterations_that_access_an_element_twice_in_B: ");
656 print_generic_stmt (outf
, chrec
, 0);
657 if (chrec
== chrec_known
)
658 fprintf (outf
, " (no dependence)\n");
659 else if (chrec_contains_undetermined (chrec
))
660 fprintf (outf
, " (don't know)\n");
663 tree last_iteration
= SUB_LAST_CONFLICT (subscript
);
664 fprintf (outf
, " last_conflict: ");
665 print_generic_stmt (outf
, last_iteration
, 0);
668 fprintf (outf
, " (Subscript distance: ");
669 print_generic_stmt (outf
, SUB_DISTANCE (subscript
), 0);
670 fprintf (outf
, " )\n");
671 fprintf (outf
, " )\n");
674 /* Print the classic direction vector DIRV to OUTF. */
677 print_direction_vector (FILE *outf
,
683 for (eq
= 0; eq
< length
; eq
++)
685 enum data_dependence_direction dir
= dirv
[eq
];
690 fprintf (outf
, " +");
693 fprintf (outf
, " -");
696 fprintf (outf
, " =");
698 case dir_positive_or_equal
:
699 fprintf (outf
, " +=");
701 case dir_positive_or_negative
:
702 fprintf (outf
, " +-");
704 case dir_negative_or_equal
:
705 fprintf (outf
, " -=");
708 fprintf (outf
, " *");
711 fprintf (outf
, "indep");
715 fprintf (outf
, "\n");
718 /* Print a vector of direction vectors. */
721 print_dir_vectors (FILE *outf
, VEC (lambda_vector
, heap
) *dir_vects
,
727 for (j
= 0; VEC_iterate (lambda_vector
, dir_vects
, j
, v
); j
++)
728 print_direction_vector (outf
, v
, length
);
731 /* Print a vector of distance vectors. */
734 print_dist_vectors (FILE *outf
, VEC (lambda_vector
, heap
) *dist_vects
,
740 for (j
= 0; VEC_iterate (lambda_vector
, dist_vects
, j
, v
); j
++)
741 print_lambda_vector (outf
, v
, length
);
747 debug_data_dependence_relation (struct data_dependence_relation
*ddr
)
749 dump_data_dependence_relation (stderr
, ddr
);
752 /* Dump function for a DATA_DEPENDENCE_RELATION structure. */
755 dump_data_dependence_relation (FILE *outf
,
756 struct data_dependence_relation
*ddr
)
758 struct data_reference
*dra
, *drb
;
762 fprintf (outf
, "(Data Dep: \n");
763 if (DDR_ARE_DEPENDENT (ddr
) == chrec_dont_know
)
764 fprintf (outf
, " (don't know)\n");
766 else if (DDR_ARE_DEPENDENT (ddr
) == chrec_known
)
767 fprintf (outf
, " (no dependence)\n");
769 else if (DDR_ARE_DEPENDENT (ddr
) == NULL_TREE
)
774 for (i
= 0; i
< DDR_NUM_SUBSCRIPTS (ddr
); i
++)
776 fprintf (outf
, " access_fn_A: ");
777 print_generic_stmt (outf
, DR_ACCESS_FN (dra
, i
), 0);
778 fprintf (outf
, " access_fn_B: ");
779 print_generic_stmt (outf
, DR_ACCESS_FN (drb
, i
), 0);
780 dump_subscript (outf
, DDR_SUBSCRIPT (ddr
, i
));
783 fprintf (outf
, " loop nest: (");
784 for (i
= 0; VEC_iterate (loop_p
, DDR_LOOP_NEST (ddr
), i
, loopi
); i
++)
785 fprintf (outf
, "%d ", loopi
->num
);
786 fprintf (outf
, ")\n");
788 for (i
= 0; i
< DDR_NUM_DIST_VECTS (ddr
); i
++)
790 fprintf (outf
, " distance_vector: ");
791 print_lambda_vector (outf
, DDR_DIST_VECT (ddr
, i
),
795 for (i
= 0; i
< DDR_NUM_DIR_VECTS (ddr
); i
++)
797 fprintf (outf
, " direction_vector: ");
798 print_direction_vector (outf
, DDR_DIR_VECT (ddr
, i
),
803 fprintf (outf
, ")\n");
806 /* Dump function for a DATA_DEPENDENCE_DIRECTION structure. */
809 dump_data_dependence_direction (FILE *file
,
810 enum data_dependence_direction dir
)
826 case dir_positive_or_negative
:
827 fprintf (file
, "+-");
830 case dir_positive_or_equal
:
831 fprintf (file
, "+=");
834 case dir_negative_or_equal
:
835 fprintf (file
, "-=");
847 /* Dumps the distance and direction vectors in FILE. DDRS contains
848 the dependence relations, and VECT_SIZE is the size of the
849 dependence vectors, or in other words the number of loops in the
853 dump_dist_dir_vectors (FILE *file
, VEC (ddr_p
, heap
) *ddrs
)
856 struct data_dependence_relation
*ddr
;
859 for (i
= 0; VEC_iterate (ddr_p
, ddrs
, i
, ddr
); i
++)
860 if (DDR_ARE_DEPENDENT (ddr
) == NULL_TREE
&& DDR_AFFINE_P (ddr
))
862 for (j
= 0; VEC_iterate (lambda_vector
, DDR_DIST_VECTS (ddr
), j
, v
); j
++)
864 fprintf (file
, "DISTANCE_V (");
865 print_lambda_vector (file
, v
, DDR_NB_LOOPS (ddr
));
866 fprintf (file
, ")\n");
869 for (j
= 0; VEC_iterate (lambda_vector
, DDR_DIR_VECTS (ddr
), j
, v
); j
++)
871 fprintf (file
, "DIRECTION_V (");
872 print_direction_vector (file
, v
, DDR_NB_LOOPS (ddr
));
873 fprintf (file
, ")\n");
877 fprintf (file
, "\n\n");
880 /* Dumps the data dependence relations DDRS in FILE. */
883 dump_ddrs (FILE *file
, VEC (ddr_p
, heap
) *ddrs
)
886 struct data_dependence_relation
*ddr
;
888 for (i
= 0; VEC_iterate (ddr_p
, ddrs
, i
, ddr
); i
++)
889 dump_data_dependence_relation (file
, ddr
);
891 fprintf (file
, "\n\n");
896 /* Estimate the number of iterations from the size of the data and the
900 estimate_niter_from_size_of_data (struct loop
*loop
,
905 tree estimation
= NULL_TREE
;
906 tree array_size
, data_size
, element_size
;
909 init
= initial_condition (access_fn
);
910 step
= evolution_part_in_loop_num (access_fn
, loop
->num
);
912 array_size
= TYPE_SIZE (TREE_TYPE (opnd0
));
913 element_size
= TYPE_SIZE (TREE_TYPE (TREE_TYPE (opnd0
)));
914 if (array_size
== NULL_TREE
915 || TREE_CODE (array_size
) != INTEGER_CST
916 || TREE_CODE (element_size
) != INTEGER_CST
)
919 data_size
= fold_build2 (EXACT_DIV_EXPR
, integer_type_node
,
920 array_size
, element_size
);
922 if (init
!= NULL_TREE
924 && TREE_CODE (init
) == INTEGER_CST
925 && TREE_CODE (step
) == INTEGER_CST
)
927 tree i_plus_s
= fold_build2 (PLUS_EXPR
, integer_type_node
, init
, step
);
928 tree sign
= fold_binary (GT_EXPR
, boolean_type_node
, i_plus_s
, init
);
930 if (sign
== boolean_true_node
)
931 estimation
= fold_build2 (CEIL_DIV_EXPR
, integer_type_node
,
932 fold_build2 (MINUS_EXPR
, integer_type_node
,
933 data_size
, init
), step
);
935 /* When the step is negative, as in PR23386: (init = 3, step =
936 0ffffffff, data_size = 100), we have to compute the
937 estimation as ceil_div (init, 0 - step) + 1. */
938 else if (sign
== boolean_false_node
)
940 fold_build2 (PLUS_EXPR
, integer_type_node
,
941 fold_build2 (CEIL_DIV_EXPR
, integer_type_node
,
943 fold_build2 (MINUS_EXPR
, unsigned_type_node
,
944 integer_zero_node
, step
)),
948 record_estimate (loop
, estimation
, boolean_true_node
, stmt
);
952 /* Given an ARRAY_REF node REF, records its access functions.
953 Example: given A[i][3], record in ACCESS_FNS the opnd1 function,
954 i.e. the constant "3", then recursively call the function on opnd0,
955 i.e. the ARRAY_REF "A[i]".
956 If ESTIMATE_ONLY is true, we just set the estimated number of loop
957 iterations, we don't store the access function.
958 The function returns the base name: "A". */
961 analyze_array_indexes (struct loop
*loop
,
962 VEC(tree
,heap
) **access_fns
,
969 opnd0
= TREE_OPERAND (ref
, 0);
970 opnd1
= TREE_OPERAND (ref
, 1);
972 /* The detection of the evolution function for this data access is
973 postponed until the dependence test. This lazy strategy avoids
974 the computation of access functions that are of no interest for
976 access_fn
= instantiate_parameters
977 (loop
, analyze_scalar_evolution (loop
, opnd1
));
980 && chrec_contains_undetermined (loop
->estimated_nb_iterations
))
981 estimate_niter_from_size_of_data (loop
, opnd0
, access_fn
, stmt
);
984 VEC_safe_push (tree
, heap
, *access_fns
, access_fn
);
986 /* Recursively record other array access functions. */
987 if (TREE_CODE (opnd0
) == ARRAY_REF
)
988 return analyze_array_indexes (loop
, access_fns
, opnd0
, stmt
, estimate_only
);
990 /* Return the base name of the data access. */
995 /* For an array reference REF contained in STMT, attempt to bound the
996 number of iterations in the loop containing STMT */
999 estimate_iters_using_array (tree stmt
, tree ref
)
1001 analyze_array_indexes (loop_containing_stmt (stmt
), NULL
, ref
, stmt
,
1005 /* For a data reference REF contained in the statement STMT, initialize
1006 a DATA_REFERENCE structure, and return it. IS_READ flag has to be
1007 set to true when REF is in the right hand side of an
1010 struct data_reference
*
1011 analyze_array (tree stmt
, tree ref
, bool is_read
)
1013 struct data_reference
*res
;
1014 VEC(tree
,heap
) *acc_fns
;
1016 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1018 fprintf (dump_file
, "(analyze_array \n");
1019 fprintf (dump_file
, " (ref = ");
1020 print_generic_stmt (dump_file
, ref
, 0);
1021 fprintf (dump_file
, ")\n");
1024 res
= XNEW (struct data_reference
);
1026 DR_STMT (res
) = stmt
;
1028 acc_fns
= VEC_alloc (tree
, heap
, 3);
1029 DR_BASE_OBJECT (res
) = analyze_array_indexes
1030 (loop_containing_stmt (stmt
), &acc_fns
, ref
, stmt
, false);
1031 DR_TYPE (res
) = ARRAY_REF_TYPE
;
1032 DR_SET_ACCESS_FNS (res
, acc_fns
);
1033 DR_IS_READ (res
) = is_read
;
1034 DR_BASE_ADDRESS (res
) = NULL_TREE
;
1035 DR_OFFSET (res
) = NULL_TREE
;
1036 DR_INIT (res
) = NULL_TREE
;
1037 DR_STEP (res
) = NULL_TREE
;
1038 DR_OFFSET_MISALIGNMENT (res
) = NULL_TREE
;
1039 DR_MEMTAG (res
) = NULL_TREE
;
1040 DR_PTR_INFO (res
) = NULL
;
1042 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1043 fprintf (dump_file
, ")\n");
1048 /* Analyze an indirect memory reference, REF, that comes from STMT.
1049 IS_READ is true if this is an indirect load, and false if it is
1051 Return a new data reference structure representing the indirect_ref, or
1052 NULL if we cannot describe the access function. */
1054 static struct data_reference
*
1055 analyze_indirect_ref (tree stmt
, tree ref
, bool is_read
)
1057 struct loop
*loop
= loop_containing_stmt (stmt
);
1058 tree ptr_ref
= TREE_OPERAND (ref
, 0);
1059 tree access_fn
= analyze_scalar_evolution (loop
, ptr_ref
);
1060 tree init
= initial_condition_in_loop_num (access_fn
, loop
->num
);
1061 tree base_address
= NULL_TREE
, evolution
, step
= NULL_TREE
;
1062 struct ptr_info_def
*ptr_info
= NULL
;
1064 if (TREE_CODE (ptr_ref
) == SSA_NAME
)
1065 ptr_info
= SSA_NAME_PTR_INFO (ptr_ref
);
1068 if (access_fn
== chrec_dont_know
|| !init
|| init
== chrec_dont_know
)
1070 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1072 fprintf (dump_file
, "\nBad access function of ptr: ");
1073 print_generic_expr (dump_file
, ref
, TDF_SLIM
);
1074 fprintf (dump_file
, "\n");
1079 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1081 fprintf (dump_file
, "\nAccess function of ptr: ");
1082 print_generic_expr (dump_file
, access_fn
, TDF_SLIM
);
1083 fprintf (dump_file
, "\n");
1086 if (!expr_invariant_in_loop_p (loop
, init
))
1088 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1089 fprintf (dump_file
, "\ninitial condition is not loop invariant.\n");
1093 base_address
= init
;
1094 evolution
= evolution_part_in_loop_num (access_fn
, loop
->num
);
1095 if (evolution
!= chrec_dont_know
)
1098 step
= ssize_int (0);
1101 if (TREE_CODE (evolution
) == INTEGER_CST
)
1102 step
= fold_convert (ssizetype
, evolution
);
1104 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1105 fprintf (dump_file
, "\nnon constant step for ptr access.\n");
1109 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1110 fprintf (dump_file
, "\nunknown evolution of ptr.\n");
1112 return init_data_ref (stmt
, ref
, NULL_TREE
, access_fn
, is_read
, base_address
,
1113 NULL_TREE
, step
, NULL_TREE
, NULL_TREE
,
1114 ptr_info
, POINTER_REF_TYPE
);
1117 /* For a data reference REF contained in the statement STMT, initialize
1118 a DATA_REFERENCE structure, and return it. */
1120 struct data_reference
*
1121 init_data_ref (tree stmt
,
1131 struct ptr_info_def
*ptr_info
,
1132 enum data_ref_type type
)
1134 struct data_reference
*res
;
1135 VEC(tree
,heap
) *acc_fns
;
1137 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1139 fprintf (dump_file
, "(init_data_ref \n");
1140 fprintf (dump_file
, " (ref = ");
1141 print_generic_stmt (dump_file
, ref
, 0);
1142 fprintf (dump_file
, ")\n");
1145 res
= XNEW (struct data_reference
);
1147 DR_STMT (res
) = stmt
;
1149 DR_BASE_OBJECT (res
) = base
;
1150 DR_TYPE (res
) = type
;
1151 acc_fns
= VEC_alloc (tree
, heap
, 3);
1152 DR_SET_ACCESS_FNS (res
, acc_fns
);
1153 VEC_quick_push (tree
, DR_ACCESS_FNS (res
), access_fn
);
1154 DR_IS_READ (res
) = is_read
;
1155 DR_BASE_ADDRESS (res
) = base_address
;
1156 DR_OFFSET (res
) = init_offset
;
1157 DR_INIT (res
) = NULL_TREE
;
1158 DR_STEP (res
) = step
;
1159 DR_OFFSET_MISALIGNMENT (res
) = misalign
;
1160 DR_MEMTAG (res
) = memtag
;
1161 DR_PTR_INFO (res
) = ptr_info
;
1163 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1164 fprintf (dump_file
, ")\n");
1169 /* Function strip_conversions
1171 Strip conversions that don't narrow the mode. */
1174 strip_conversion (tree expr
)
1176 tree to
, ti
, oprnd0
;
1178 while (TREE_CODE (expr
) == NOP_EXPR
|| TREE_CODE (expr
) == CONVERT_EXPR
)
1180 to
= TREE_TYPE (expr
);
1181 oprnd0
= TREE_OPERAND (expr
, 0);
1182 ti
= TREE_TYPE (oprnd0
);
1184 if (!INTEGRAL_TYPE_P (to
) || !INTEGRAL_TYPE_P (ti
))
1186 if (GET_MODE_SIZE (TYPE_MODE (to
)) < GET_MODE_SIZE (TYPE_MODE (ti
)))
1195 /* Function analyze_offset_expr
1197 Given an offset expression EXPR received from get_inner_reference, analyze
1198 it and create an expression for INITIAL_OFFSET by substituting the variables
1199 of EXPR with initial_condition of the corresponding access_fn in the loop.
1202 for (j = 3; j < N; j++)
1205 For a[j].b[i][j], EXPR will be 'i * C_i + j * C_j + C'. 'i' cannot be
1206 substituted, since its access_fn in the inner loop is i. 'j' will be
1207 substituted with 3. An INITIAL_OFFSET will be 'i * C_i + C`', where
1210 Compute MISALIGN (the misalignment of the data reference initial access from
1211 its base). Misalignment can be calculated only if all the variables can be
1212 substituted with constants, otherwise, we record maximum possible alignment
1213 in ALIGNED_TO. In the above example, since 'i' cannot be substituted, MISALIGN
1214 will be NULL_TREE, and the biggest divider of C_i (a power of 2) will be
1215 recorded in ALIGNED_TO.
1217 STEP is an evolution of the data reference in this loop in bytes.
1218 In the above example, STEP is C_j.
1220 Return FALSE, if the analysis fails, e.g., there is no access_fn for a
1221 variable. In this case, all the outputs (INITIAL_OFFSET, MISALIGN, ALIGNED_TO
1222 and STEP) are NULL_TREEs. Otherwise, return TRUE.
1227 analyze_offset_expr (tree expr
,
1229 tree
*initial_offset
,
1236 tree left_offset
= ssize_int (0);
1237 tree right_offset
= ssize_int (0);
1238 tree left_misalign
= ssize_int (0);
1239 tree right_misalign
= ssize_int (0);
1240 tree left_step
= ssize_int (0);
1241 tree right_step
= ssize_int (0);
1242 enum tree_code code
;
1243 tree init
, evolution
;
1244 tree left_aligned_to
= NULL_TREE
, right_aligned_to
= NULL_TREE
;
1247 *misalign
= NULL_TREE
;
1248 *aligned_to
= NULL_TREE
;
1249 *initial_offset
= NULL_TREE
;
1251 /* Strip conversions that don't narrow the mode. */
1252 expr
= strip_conversion (expr
);
1258 if (TREE_CODE (expr
) == INTEGER_CST
)
1260 *initial_offset
= fold_convert (ssizetype
, expr
);
1261 *misalign
= fold_convert (ssizetype
, expr
);
1262 *step
= ssize_int (0);
1266 /* 2. Variable. Try to substitute with initial_condition of the corresponding
1267 access_fn in the current loop. */
1268 if (SSA_VAR_P (expr
))
1270 tree access_fn
= analyze_scalar_evolution (loop
, expr
);
1272 if (access_fn
== chrec_dont_know
)
1276 init
= initial_condition_in_loop_num (access_fn
, loop
->num
);
1277 if (!expr_invariant_in_loop_p (loop
, init
))
1278 /* Not enough information: may be not loop invariant.
1279 E.g., for a[b[i]], we get a[D], where D=b[i]. EXPR is D, its
1280 initial_condition is D, but it depends on i - loop's induction
1284 evolution
= evolution_part_in_loop_num (access_fn
, loop
->num
);
1285 if (evolution
&& TREE_CODE (evolution
) != INTEGER_CST
)
1286 /* Evolution is not constant. */
1289 if (TREE_CODE (init
) == INTEGER_CST
)
1290 *misalign
= fold_convert (ssizetype
, init
);
1292 /* Not constant, misalignment cannot be calculated. */
1293 *misalign
= NULL_TREE
;
1295 *initial_offset
= fold_convert (ssizetype
, init
);
1297 *step
= evolution
? fold_convert (ssizetype
, evolution
) : ssize_int (0);
1301 /* Recursive computation. */
1302 if (!BINARY_CLASS_P (expr
))
1304 /* We expect to get binary expressions (PLUS/MINUS and MULT). */
1305 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1307 fprintf (dump_file
, "\nNot binary expression ");
1308 print_generic_expr (dump_file
, expr
, TDF_SLIM
);
1309 fprintf (dump_file
, "\n");
1313 oprnd0
= TREE_OPERAND (expr
, 0);
1314 oprnd1
= TREE_OPERAND (expr
, 1);
1316 if (!analyze_offset_expr (oprnd0
, loop
, &left_offset
, &left_misalign
,
1317 &left_aligned_to
, &left_step
)
1318 || !analyze_offset_expr (oprnd1
, loop
, &right_offset
, &right_misalign
,
1319 &right_aligned_to
, &right_step
))
1322 /* The type of the operation: plus, minus or mult. */
1323 code
= TREE_CODE (expr
);
1327 if (TREE_CODE (right_offset
) != INTEGER_CST
)
1328 /* RIGHT_OFFSET can be not constant. For example, for arrays of variable
1330 FORNOW: We don't support such cases. */
1333 /* Strip conversions that don't narrow the mode. */
1334 left_offset
= strip_conversion (left_offset
);
1337 /* Misalignment computation. */
1338 if (SSA_VAR_P (left_offset
))
1340 /* If the left side contains variables that can't be substituted with
1341 constants, the misalignment is unknown. However, if the right side
1342 is a multiple of some alignment, we know that the expression is
1343 aligned to it. Therefore, we record such maximum possible value.
1345 *misalign
= NULL_TREE
;
1346 *aligned_to
= ssize_int (highest_pow2_factor (right_offset
));
1350 /* The left operand was successfully substituted with constant. */
1353 /* In case of EXPR '(i * C1 + j) * C2', LEFT_MISALIGN is
1355 *misalign
= size_binop (code
, left_misalign
, right_misalign
);
1356 if (left_aligned_to
&& right_aligned_to
)
1357 *aligned_to
= size_binop (MIN_EXPR
, left_aligned_to
,
1360 *aligned_to
= left_aligned_to
?
1361 left_aligned_to
: right_aligned_to
;
1364 *misalign
= NULL_TREE
;
1367 /* Step calculation. */
1368 /* Multiply the step by the right operand. */
1369 *step
= size_binop (MULT_EXPR
, left_step
, right_offset
);
1374 /* Combine the recursive calculations for step and misalignment. */
1375 *step
= size_binop (code
, left_step
, right_step
);
1377 /* Unknown alignment. */
1378 if ((!left_misalign
&& !left_aligned_to
)
1379 || (!right_misalign
&& !right_aligned_to
))
1381 *misalign
= NULL_TREE
;
1382 *aligned_to
= NULL_TREE
;
1386 if (left_misalign
&& right_misalign
)
1387 *misalign
= size_binop (code
, left_misalign
, right_misalign
);
1389 *misalign
= left_misalign
? left_misalign
: right_misalign
;
1391 if (left_aligned_to
&& right_aligned_to
)
1392 *aligned_to
= size_binop (MIN_EXPR
, left_aligned_to
, right_aligned_to
);
1394 *aligned_to
= left_aligned_to
? left_aligned_to
: right_aligned_to
;
1402 /* Compute offset. */
1403 *initial_offset
= fold_convert (ssizetype
,
1404 fold_build2 (code
, TREE_TYPE (left_offset
),
1410 /* Function address_analysis
1412 Return the BASE of the address expression EXPR.
1413 Also compute the OFFSET from BASE, MISALIGN and STEP.
1416 EXPR - the address expression that is being analyzed
1417 STMT - the statement that contains EXPR or its original memory reference
1418 IS_READ - TRUE if STMT reads from EXPR, FALSE if writes to EXPR
1419 DR - data_reference struct for the original memory reference
1422 BASE (returned value) - the base of the data reference EXPR.
1423 INITIAL_OFFSET - initial offset of EXPR from BASE (an expression)
1424 MISALIGN - offset of EXPR from BASE in bytes (a constant) or NULL_TREE if the
1425 computation is impossible
1426 ALIGNED_TO - maximum alignment of EXPR or NULL_TREE if MISALIGN can be
1427 calculated (doesn't depend on variables)
1428 STEP - evolution of EXPR in the loop
1430 If something unexpected is encountered (an unsupported form of data-ref),
1431 then NULL_TREE is returned.
1435 address_analysis (tree expr
, tree stmt
, bool is_read
, struct data_reference
*dr
,
1436 tree
*offset
, tree
*misalign
, tree
*aligned_to
, tree
*step
)
1438 tree oprnd0
, oprnd1
, base_address
, offset_expr
, base_addr0
, base_addr1
;
1439 tree address_offset
= ssize_int (0), address_misalign
= ssize_int (0);
1440 tree dummy
, address_aligned_to
= NULL_TREE
;
1441 struct ptr_info_def
*dummy1
;
1444 switch (TREE_CODE (expr
))
1448 /* EXPR is of form {base +/- offset} (or {offset +/- base}). */
1449 oprnd0
= TREE_OPERAND (expr
, 0);
1450 oprnd1
= TREE_OPERAND (expr
, 1);
1452 STRIP_NOPS (oprnd0
);
1453 STRIP_NOPS (oprnd1
);
1455 /* Recursively try to find the base of the address contained in EXPR.
1456 For offset, the returned base will be NULL. */
1457 base_addr0
= address_analysis (oprnd0
, stmt
, is_read
, dr
, &address_offset
,
1458 &address_misalign
, &address_aligned_to
,
1461 base_addr1
= address_analysis (oprnd1
, stmt
, is_read
, dr
, &address_offset
,
1462 &address_misalign
, &address_aligned_to
,
1465 /* We support cases where only one of the operands contains an
1467 if ((base_addr0
&& base_addr1
) || (!base_addr0
&& !base_addr1
))
1469 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1472 "\neither more than one address or no addresses in expr ");
1473 print_generic_expr (dump_file
, expr
, TDF_SLIM
);
1474 fprintf (dump_file
, "\n");
1479 /* To revert STRIP_NOPS. */
1480 oprnd0
= TREE_OPERAND (expr
, 0);
1481 oprnd1
= TREE_OPERAND (expr
, 1);
1483 offset_expr
= base_addr0
?
1484 fold_convert (ssizetype
, oprnd1
) : fold_convert (ssizetype
, oprnd0
);
1486 /* EXPR is of form {base +/- offset} (or {offset +/- base}). If offset is
1487 a number, we can add it to the misalignment value calculated for base,
1488 otherwise, misalignment is NULL. */
1489 if (TREE_CODE (offset_expr
) == INTEGER_CST
&& address_misalign
)
1491 *misalign
= size_binop (TREE_CODE (expr
), address_misalign
,
1493 *aligned_to
= address_aligned_to
;
1497 *misalign
= NULL_TREE
;
1498 *aligned_to
= NULL_TREE
;
1501 /* Combine offset (from EXPR {base + offset}) with the offset calculated
1503 *offset
= size_binop (TREE_CODE (expr
), address_offset
, offset_expr
);
1504 return base_addr0
? base_addr0
: base_addr1
;
1507 base_address
= object_analysis (TREE_OPERAND (expr
, 0), stmt
, is_read
,
1508 &dr
, offset
, misalign
, aligned_to
, step
,
1509 &dummy
, &dummy1
, &dummy2
);
1510 return base_address
;
1513 if (!POINTER_TYPE_P (TREE_TYPE (expr
)))
1515 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1517 fprintf (dump_file
, "\nnot pointer SSA_NAME ");
1518 print_generic_expr (dump_file
, expr
, TDF_SLIM
);
1519 fprintf (dump_file
, "\n");
1523 *aligned_to
= ssize_int (TYPE_ALIGN_UNIT (TREE_TYPE (TREE_TYPE (expr
))));
1524 *misalign
= ssize_int (0);
1525 *offset
= ssize_int (0);
1526 *step
= ssize_int (0);
1535 /* Function object_analysis
1537 Create a data-reference structure DR for MEMREF.
1538 Return the BASE of the data reference MEMREF if the analysis is possible.
1539 Also compute the INITIAL_OFFSET from BASE, MISALIGN and STEP.
1540 E.g., for EXPR a.b[i] + 4B, BASE is a, and OFFSET is the overall offset
1541 'a.b[i] + 4B' from a (can be an expression), MISALIGN is an OFFSET
1542 instantiated with initial_conditions of access_functions of variables,
1543 and STEP is the evolution of the DR_REF in this loop.
1545 Function get_inner_reference is used for the above in case of ARRAY_REF and
1548 The structure of the function is as follows:
1550 Case 1. For handled_component_p refs
1551 1.1 build data-reference structure for MEMREF
1552 1.2 call get_inner_reference
1553 1.2.1 analyze offset expr received from get_inner_reference
1554 (fall through with BASE)
1555 Case 2. For declarations
1557 Case 3. For INDIRECT_REFs
1558 3.1 build data-reference structure for MEMREF
1559 3.2 analyze evolution and initial condition of MEMREF
1560 3.3 set data-reference structure for MEMREF
1561 3.4 call address_analysis to analyze INIT of the access function
1562 3.5 extract memory tag
1565 Combine the results of object and address analysis to calculate
1566 INITIAL_OFFSET, STEP and misalignment info.
1569 MEMREF - the memory reference that is being analyzed
1570 STMT - the statement that contains MEMREF
1571 IS_READ - TRUE if STMT reads from MEMREF, FALSE if writes to MEMREF
1574 BASE_ADDRESS (returned value) - the base address of the data reference MEMREF
1575 E.g, if MEMREF is a.b[k].c[i][j] the returned
1577 DR - data_reference struct for MEMREF
1578 INITIAL_OFFSET - initial offset of MEMREF from BASE (an expression)
1579 MISALIGN - offset of MEMREF from BASE in bytes (a constant) modulo alignment of
1580 ALIGNMENT or NULL_TREE if the computation is impossible
1581 ALIGNED_TO - maximum alignment of EXPR or NULL_TREE if MISALIGN can be
1582 calculated (doesn't depend on variables)
1583 STEP - evolution of the DR_REF in the loop
1584 MEMTAG - memory tag for aliasing purposes
1585 PTR_INFO - NULL or points-to aliasing info from a pointer SSA_NAME
1586 SUBVARS - Sub-variables of the variable
1588 If the analysis of MEMREF evolution in the loop fails, NULL_TREE is returned,
1589 but DR can be created anyway.
1594 object_analysis (tree memref
, tree stmt
, bool is_read
,
1595 struct data_reference
**dr
, tree
*offset
, tree
*misalign
,
1596 tree
*aligned_to
, tree
*step
, tree
*memtag
,
1597 struct ptr_info_def
**ptr_info
, subvar_t
*subvars
)
1599 tree base
= NULL_TREE
, base_address
= NULL_TREE
;
1600 tree object_offset
= ssize_int (0), object_misalign
= ssize_int (0);
1601 tree object_step
= ssize_int (0), address_step
= ssize_int (0);
1602 tree address_offset
= ssize_int (0), address_misalign
= ssize_int (0);
1603 HOST_WIDE_INT pbitsize
, pbitpos
;
1604 tree poffset
, bit_pos_in_bytes
;
1605 enum machine_mode pmode
;
1606 int punsignedp
, pvolatilep
;
1607 tree ptr_step
= ssize_int (0), ptr_init
= NULL_TREE
;
1608 struct loop
*loop
= loop_containing_stmt (stmt
);
1609 struct data_reference
*ptr_dr
= NULL
;
1610 tree object_aligned_to
= NULL_TREE
, address_aligned_to
= NULL_TREE
;
1611 tree comp_ref
= NULL_TREE
;
1616 /* Case 1. handled_component_p refs. */
1617 if (handled_component_p (memref
))
1619 /* 1.1 build data-reference structure for MEMREF. */
1622 if (TREE_CODE (memref
) == ARRAY_REF
)
1623 *dr
= analyze_array (stmt
, memref
, is_read
);
1624 else if (TREE_CODE (memref
) == COMPONENT_REF
)
1628 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1630 fprintf (dump_file
, "\ndata-ref of unsupported type ");
1631 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1632 fprintf (dump_file
, "\n");
1638 /* 1.2 call get_inner_reference. */
1639 /* Find the base and the offset from it. */
1640 base
= get_inner_reference (memref
, &pbitsize
, &pbitpos
, &poffset
,
1641 &pmode
, &punsignedp
, &pvolatilep
, false);
1644 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1646 fprintf (dump_file
, "\nfailed to get inner ref for ");
1647 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1648 fprintf (dump_file
, "\n");
1653 /* 1.2.1 analyze offset expr received from get_inner_reference. */
1655 && !analyze_offset_expr (poffset
, loop
, &object_offset
,
1656 &object_misalign
, &object_aligned_to
,
1659 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1661 fprintf (dump_file
, "\nfailed to compute offset or step for ");
1662 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1663 fprintf (dump_file
, "\n");
1668 /* Add bit position to OFFSET and MISALIGN. */
1670 bit_pos_in_bytes
= ssize_int (pbitpos
/BITS_PER_UNIT
);
1671 /* Check that there is no remainder in bits. */
1672 if (pbitpos
%BITS_PER_UNIT
)
1674 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1675 fprintf (dump_file
, "\nbit offset alignment.\n");
1678 object_offset
= size_binop (PLUS_EXPR
, bit_pos_in_bytes
, object_offset
);
1679 if (object_misalign
)
1680 object_misalign
= size_binop (PLUS_EXPR
, object_misalign
,
1683 memref
= base
; /* To continue analysis of BASE. */
1687 /* Part 1: Case 2. Declarations. */
1688 if (DECL_P (memref
))
1690 /* We expect to get a decl only if we already have a DR, or with
1691 COMPONENT_REFs of type 'a[i].b'. */
1694 if (comp_ref
&& TREE_CODE (TREE_OPERAND (comp_ref
, 0)) == ARRAY_REF
)
1696 *dr
= analyze_array (stmt
, TREE_OPERAND (comp_ref
, 0), is_read
);
1697 if (DR_NUM_DIMENSIONS (*dr
) != 1)
1699 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1701 fprintf (dump_file
, "\n multidimensional component ref ");
1702 print_generic_expr (dump_file
, comp_ref
, TDF_SLIM
);
1703 fprintf (dump_file
, "\n");
1710 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1712 fprintf (dump_file
, "\nunhandled decl ");
1713 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1714 fprintf (dump_file
, "\n");
1720 /* TODO: if during the analysis of INDIRECT_REF we get to an object, put
1721 the object in BASE_OBJECT field if we can prove that this is O.K.,
1722 i.e., the data-ref access is bounded by the bounds of the BASE_OBJECT.
1723 (e.g., if the object is an array base 'a', where 'a[N]', we must prove
1724 that every access with 'p' (the original INDIRECT_REF based on '&a')
1725 in the loop is within the array boundaries - from a[0] to a[N-1]).
1726 Otherwise, our alias analysis can be incorrect.
1727 Even if an access function based on BASE_OBJECT can't be build, update
1728 BASE_OBJECT field to enable us to prove that two data-refs are
1729 different (without access function, distance analysis is impossible).
1731 if (SSA_VAR_P (memref
) && var_can_have_subvars (memref
))
1732 *subvars
= get_subvars_for_var (memref
);
1733 base_address
= build_fold_addr_expr (memref
);
1734 /* 2.1 set MEMTAG. */
1738 /* Part 1: Case 3. INDIRECT_REFs. */
1739 else if (TREE_CODE (memref
) == INDIRECT_REF
)
1741 tree ptr_ref
= TREE_OPERAND (memref
, 0);
1742 if (TREE_CODE (ptr_ref
) == SSA_NAME
)
1743 *ptr_info
= SSA_NAME_PTR_INFO (ptr_ref
);
1745 /* 3.1 build data-reference structure for MEMREF. */
1746 ptr_dr
= analyze_indirect_ref (stmt
, memref
, is_read
);
1749 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1751 fprintf (dump_file
, "\nfailed to create dr for ");
1752 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1753 fprintf (dump_file
, "\n");
1758 /* 3.2 analyze evolution and initial condition of MEMREF. */
1759 ptr_step
= DR_STEP (ptr_dr
);
1760 ptr_init
= DR_BASE_ADDRESS (ptr_dr
);
1761 if (!ptr_init
|| !ptr_step
|| !POINTER_TYPE_P (TREE_TYPE (ptr_init
)))
1763 *dr
= (*dr
) ? *dr
: ptr_dr
;
1764 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1766 fprintf (dump_file
, "\nbad pointer access ");
1767 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1768 fprintf (dump_file
, "\n");
1773 if (integer_zerop (ptr_step
) && !(*dr
))
1775 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1776 fprintf (dump_file
, "\nptr is loop invariant.\n");
1780 /* If there exists DR for MEMREF, we are analyzing the base of
1781 handled component (PTR_INIT), which not necessary has evolution in
1784 object_step
= size_binop (PLUS_EXPR
, object_step
, ptr_step
);
1786 /* 3.3 set data-reference structure for MEMREF. */
1790 /* 3.4 call address_analysis to analyze INIT of the access
1792 base_address
= address_analysis (ptr_init
, stmt
, is_read
, *dr
,
1793 &address_offset
, &address_misalign
,
1794 &address_aligned_to
, &address_step
);
1797 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1799 fprintf (dump_file
, "\nfailed to analyze address ");
1800 print_generic_expr (dump_file
, ptr_init
, TDF_SLIM
);
1801 fprintf (dump_file
, "\n");
1806 /* 3.5 extract memory tag. */
1807 switch (TREE_CODE (base_address
))
1810 *memtag
= get_var_ann (SSA_NAME_VAR (base_address
))->symbol_mem_tag
;
1811 if (!(*memtag
) && TREE_CODE (TREE_OPERAND (memref
, 0)) == SSA_NAME
)
1812 *memtag
= get_var_ann (
1813 SSA_NAME_VAR (TREE_OPERAND (memref
, 0)))->symbol_mem_tag
;
1816 *memtag
= TREE_OPERAND (base_address
, 0);
1819 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1821 fprintf (dump_file
, "\nno memtag for ");
1822 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1823 fprintf (dump_file
, "\n");
1825 *memtag
= NULL_TREE
;
1832 /* MEMREF cannot be analyzed. */
1833 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1835 fprintf (dump_file
, "\ndata-ref of unsupported type ");
1836 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1837 fprintf (dump_file
, "\n");
1843 DR_REF (*dr
) = comp_ref
;
1845 if (SSA_VAR_P (*memtag
) && var_can_have_subvars (*memtag
))
1846 *subvars
= get_subvars_for_var (*memtag
);
1848 /* Part 2: Combine the results of object and address analysis to calculate
1849 INITIAL_OFFSET, STEP and misalignment info. */
1850 *offset
= size_binop (PLUS_EXPR
, object_offset
, address_offset
);
1852 if ((!object_misalign
&& !object_aligned_to
)
1853 || (!address_misalign
&& !address_aligned_to
))
1855 *misalign
= NULL_TREE
;
1856 *aligned_to
= NULL_TREE
;
1860 if (object_misalign
&& address_misalign
)
1861 *misalign
= size_binop (PLUS_EXPR
, object_misalign
, address_misalign
);
1863 *misalign
= object_misalign
? object_misalign
: address_misalign
;
1864 if (object_aligned_to
&& address_aligned_to
)
1865 *aligned_to
= size_binop (MIN_EXPR
, object_aligned_to
,
1866 address_aligned_to
);
1868 *aligned_to
= object_aligned_to
?
1869 object_aligned_to
: address_aligned_to
;
1871 *step
= size_binop (PLUS_EXPR
, object_step
, address_step
);
1873 return base_address
;
1876 /* Function analyze_offset.
1878 Extract INVARIANT and CONSTANT parts from OFFSET.
1882 analyze_offset (tree offset
, tree
*invariant
, tree
*constant
)
1884 tree op0
, op1
, constant_0
, constant_1
, invariant_0
, invariant_1
;
1885 enum tree_code code
= TREE_CODE (offset
);
1887 *invariant
= NULL_TREE
;
1888 *constant
= NULL_TREE
;
1890 /* Not PLUS/MINUS expression - recursion stop condition. */
1891 if (code
!= PLUS_EXPR
&& code
!= MINUS_EXPR
)
1893 if (TREE_CODE (offset
) == INTEGER_CST
)
1896 *invariant
= offset
;
1900 op0
= TREE_OPERAND (offset
, 0);
1901 op1
= TREE_OPERAND (offset
, 1);
1903 /* Recursive call with the operands. */
1904 if (!analyze_offset (op0
, &invariant_0
, &constant_0
)
1905 || !analyze_offset (op1
, &invariant_1
, &constant_1
))
1908 /* Combine the results. Add negation to the subtrahend in case of
1910 if (constant_0
&& constant_1
)
1912 *constant
= constant_0
? constant_0
: constant_1
;
1913 if (code
== MINUS_EXPR
&& constant_1
)
1914 *constant
= fold_build1 (NEGATE_EXPR
, TREE_TYPE (*constant
), *constant
);
1916 if (invariant_0
&& invariant_1
)
1918 fold_build2 (code
, TREE_TYPE (invariant_0
), invariant_0
, invariant_1
);
1921 *invariant
= invariant_0
? invariant_0
: invariant_1
;
1922 if (code
== MINUS_EXPR
&& invariant_1
)
1924 fold_build1 (NEGATE_EXPR
, TREE_TYPE (*invariant
), *invariant
);
1929 /* Free the memory used by the data reference DR. */
1932 free_data_ref (data_reference_p dr
)
1934 DR_FREE_ACCESS_FNS (dr
);
1938 /* Function create_data_ref.
1940 Create a data-reference structure for MEMREF. Set its DR_BASE_ADDRESS,
1941 DR_OFFSET, DR_INIT, DR_STEP, DR_OFFSET_MISALIGNMENT, DR_ALIGNED_TO,
1942 DR_MEMTAG, and DR_POINTSTO_INFO fields.
1945 MEMREF - the memory reference that is being analyzed
1946 STMT - the statement that contains MEMREF
1947 IS_READ - TRUE if STMT reads from MEMREF, FALSE if writes to MEMREF
1950 DR (returned value) - data_reference struct for MEMREF
1953 static struct data_reference
*
1954 create_data_ref (tree memref
, tree stmt
, bool is_read
)
1956 struct data_reference
*dr
= NULL
;
1957 tree base_address
, offset
, step
, misalign
, memtag
;
1958 struct loop
*loop
= loop_containing_stmt (stmt
);
1959 tree invariant
= NULL_TREE
, constant
= NULL_TREE
;
1960 tree type_size
, init_cond
;
1961 struct ptr_info_def
*ptr_info
;
1962 subvar_t subvars
= NULL
;
1963 tree aligned_to
, type
= NULL_TREE
, orig_offset
;
1968 base_address
= object_analysis (memref
, stmt
, is_read
, &dr
, &offset
,
1969 &misalign
, &aligned_to
, &step
, &memtag
,
1970 &ptr_info
, &subvars
);
1971 if (!dr
|| !base_address
)
1973 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1975 fprintf (dump_file
, "\ncreate_data_ref: failed to create a dr for ");
1976 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
1977 fprintf (dump_file
, "\n");
1982 DR_BASE_ADDRESS (dr
) = base_address
;
1983 DR_OFFSET (dr
) = offset
;
1984 DR_INIT (dr
) = ssize_int (0);
1985 DR_STEP (dr
) = step
;
1986 DR_OFFSET_MISALIGNMENT (dr
) = misalign
;
1987 DR_ALIGNED_TO (dr
) = aligned_to
;
1988 DR_MEMTAG (dr
) = memtag
;
1989 DR_PTR_INFO (dr
) = ptr_info
;
1990 DR_SUBVARS (dr
) = subvars
;
1992 type_size
= fold_convert (ssizetype
, TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dr
))));
1994 /* Extract CONSTANT and INVARIANT from OFFSET. */
1995 /* Remove cast from OFFSET and restore it for INVARIANT part. */
1996 orig_offset
= offset
;
1997 STRIP_NOPS (offset
);
1998 if (offset
!= orig_offset
)
1999 type
= TREE_TYPE (orig_offset
);
2000 if (!analyze_offset (offset
, &invariant
, &constant
))
2002 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2004 fprintf (dump_file
, "\ncreate_data_ref: failed to analyze dr's");
2005 fprintf (dump_file
, " offset for ");
2006 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
2007 fprintf (dump_file
, "\n");
2011 if (type
&& invariant
)
2012 invariant
= fold_convert (type
, invariant
);
2014 /* Put CONSTANT part of OFFSET in DR_INIT and INVARIANT in DR_OFFSET field
2018 DR_INIT (dr
) = fold_convert (ssizetype
, constant
);
2019 init_cond
= fold_build2 (TRUNC_DIV_EXPR
, TREE_TYPE (constant
),
2020 constant
, type_size
);
2023 DR_INIT (dr
) = init_cond
= ssize_int (0);
2026 DR_OFFSET (dr
) = invariant
;
2028 DR_OFFSET (dr
) = ssize_int (0);
2030 /* Change the access function for INIDIRECT_REFs, according to
2031 DR_BASE_ADDRESS. Analyze OFFSET calculated in object_analysis. OFFSET is
2032 an expression that can contain loop invariant expressions and constants.
2033 We put the constant part in the initial condition of the access function
2034 (for data dependence tests), and in DR_INIT of the data-ref. The loop
2035 invariant part is put in DR_OFFSET.
2036 The evolution part of the access function is STEP calculated in
2037 object_analysis divided by the size of data type.
2039 if (!DR_BASE_OBJECT (dr
)
2040 || (TREE_CODE (memref
) == COMPONENT_REF
&& DR_NUM_DIMENSIONS (dr
) == 1))
2045 /* Update access function. */
2046 access_fn
= DR_ACCESS_FN (dr
, 0);
2047 if (automatically_generated_chrec_p (access_fn
))
2053 new_step
= size_binop (TRUNC_DIV_EXPR
,
2054 fold_convert (ssizetype
, step
), type_size
);
2056 init_cond
= chrec_convert (chrec_type (access_fn
), init_cond
, stmt
);
2057 new_step
= chrec_convert (chrec_type (access_fn
), new_step
, stmt
);
2058 if (automatically_generated_chrec_p (init_cond
)
2059 || automatically_generated_chrec_p (new_step
))
2064 access_fn
= chrec_replace_initial_condition (access_fn
, init_cond
);
2065 access_fn
= reset_evolution_in_loop (loop
->num
, access_fn
, new_step
);
2067 VEC_replace (tree
, DR_ACCESS_FNS (dr
), 0, access_fn
);
2070 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2072 struct ptr_info_def
*pi
= DR_PTR_INFO (dr
);
2074 fprintf (dump_file
, "\nCreated dr for ");
2075 print_generic_expr (dump_file
, memref
, TDF_SLIM
);
2076 fprintf (dump_file
, "\n\tbase_address: ");
2077 print_generic_expr (dump_file
, DR_BASE_ADDRESS (dr
), TDF_SLIM
);
2078 fprintf (dump_file
, "\n\toffset from base address: ");
2079 print_generic_expr (dump_file
, DR_OFFSET (dr
), TDF_SLIM
);
2080 fprintf (dump_file
, "\n\tconstant offset from base address: ");
2081 print_generic_expr (dump_file
, DR_INIT (dr
), TDF_SLIM
);
2082 fprintf (dump_file
, "\n\tbase_object: ");
2083 print_generic_expr (dump_file
, DR_BASE_OBJECT (dr
), TDF_SLIM
);
2084 fprintf (dump_file
, "\n\tstep: ");
2085 print_generic_expr (dump_file
, DR_STEP (dr
), TDF_SLIM
);
2086 fprintf (dump_file
, "B\n\tmisalignment from base: ");
2087 print_generic_expr (dump_file
, DR_OFFSET_MISALIGNMENT (dr
), TDF_SLIM
);
2088 if (DR_OFFSET_MISALIGNMENT (dr
))
2089 fprintf (dump_file
, "B");
2090 if (DR_ALIGNED_TO (dr
))
2092 fprintf (dump_file
, "\n\taligned to: ");
2093 print_generic_expr (dump_file
, DR_ALIGNED_TO (dr
), TDF_SLIM
);
2095 fprintf (dump_file
, "\n\tmemtag: ");
2096 print_generic_expr (dump_file
, DR_MEMTAG (dr
), TDF_SLIM
);
2097 fprintf (dump_file
, "\n");
2098 if (pi
&& pi
->name_mem_tag
)
2100 fprintf (dump_file
, "\n\tnametag: ");
2101 print_generic_expr (dump_file
, pi
->name_mem_tag
, TDF_SLIM
);
2102 fprintf (dump_file
, "\n");
2109 /* Returns true when all the functions of a tree_vec CHREC are the
2113 all_chrecs_equal_p (tree chrec
)
2117 for (j
= 0; j
< TREE_VEC_LENGTH (chrec
) - 1; j
++)
2118 if (!eq_evolutions_p (TREE_VEC_ELT (chrec
, j
),
2119 TREE_VEC_ELT (chrec
, j
+ 1)))
2125 /* Determine for each subscript in the data dependence relation DDR
2129 compute_subscript_distance (struct data_dependence_relation
*ddr
)
2131 if (DDR_ARE_DEPENDENT (ddr
) == NULL_TREE
)
2135 for (i
= 0; i
< DDR_NUM_SUBSCRIPTS (ddr
); i
++)
2137 tree conflicts_a
, conflicts_b
, difference
;
2138 struct subscript
*subscript
;
2140 subscript
= DDR_SUBSCRIPT (ddr
, i
);
2141 conflicts_a
= SUB_CONFLICTS_IN_A (subscript
);
2142 conflicts_b
= SUB_CONFLICTS_IN_B (subscript
);
2144 if (TREE_CODE (conflicts_a
) == TREE_VEC
)
2146 if (!all_chrecs_equal_p (conflicts_a
))
2148 SUB_DISTANCE (subscript
) = chrec_dont_know
;
2152 conflicts_a
= TREE_VEC_ELT (conflicts_a
, 0);
2155 if (TREE_CODE (conflicts_b
) == TREE_VEC
)
2157 if (!all_chrecs_equal_p (conflicts_b
))
2159 SUB_DISTANCE (subscript
) = chrec_dont_know
;
2163 conflicts_b
= TREE_VEC_ELT (conflicts_b
, 0);
2166 conflicts_b
= chrec_convert (integer_type_node
, conflicts_b
,
2168 conflicts_a
= chrec_convert (integer_type_node
, conflicts_a
,
2170 difference
= chrec_fold_minus
2171 (integer_type_node
, conflicts_b
, conflicts_a
);
2173 if (evolution_function_is_constant_p (difference
))
2174 SUB_DISTANCE (subscript
) = difference
;
2177 SUB_DISTANCE (subscript
) = chrec_dont_know
;
2182 /* Initialize a data dependence relation between data accesses A and
2183 B. NB_LOOPS is the number of loops surrounding the references: the
2184 size of the classic distance/direction vectors. */
2186 static struct data_dependence_relation
*
2187 initialize_data_dependence_relation (struct data_reference
*a
,
2188 struct data_reference
*b
,
2189 VEC (loop_p
, heap
) *loop_nest
)
2191 struct data_dependence_relation
*res
;
2192 bool differ_p
, known_dependence
;
2195 res
= XNEW (struct data_dependence_relation
);
2198 DDR_LOOP_NEST (res
) = NULL
;
2200 if (a
== NULL
|| b
== NULL
)
2202 DDR_ARE_DEPENDENT (res
) = chrec_dont_know
;
2206 /* When A and B are arrays and their dimensions differ, we directly
2207 initialize the relation to "there is no dependence": chrec_known. */
2208 if (DR_BASE_OBJECT (a
) && DR_BASE_OBJECT (b
)
2209 && DR_NUM_DIMENSIONS (a
) != DR_NUM_DIMENSIONS (b
))
2211 DDR_ARE_DEPENDENT (res
) = chrec_known
;
2215 if (DR_BASE_ADDRESS (a
) && DR_BASE_ADDRESS (b
))
2216 known_dependence
= base_addr_differ_p (a
, b
, &differ_p
);
2218 known_dependence
= base_object_differ_p (a
, b
, &differ_p
);
2220 if (!known_dependence
)
2222 /* Can't determine whether the data-refs access the same memory
2224 DDR_ARE_DEPENDENT (res
) = chrec_dont_know
;
2230 DDR_ARE_DEPENDENT (res
) = chrec_known
;
2234 DDR_AFFINE_P (res
) = true;
2235 DDR_ARE_DEPENDENT (res
) = NULL_TREE
;
2236 DDR_SUBSCRIPTS (res
) = VEC_alloc (subscript_p
, heap
, DR_NUM_DIMENSIONS (a
));
2237 DDR_LOOP_NEST (res
) = loop_nest
;
2238 DDR_DIR_VECTS (res
) = NULL
;
2239 DDR_DIST_VECTS (res
) = NULL
;
2241 for (i
= 0; i
< DR_NUM_DIMENSIONS (a
); i
++)
2243 struct subscript
*subscript
;
2245 subscript
= XNEW (struct subscript
);
2246 SUB_CONFLICTS_IN_A (subscript
) = chrec_dont_know
;
2247 SUB_CONFLICTS_IN_B (subscript
) = chrec_dont_know
;
2248 SUB_LAST_CONFLICT (subscript
) = chrec_dont_know
;
2249 SUB_DISTANCE (subscript
) = chrec_dont_know
;
2250 VEC_safe_push (subscript_p
, heap
, DDR_SUBSCRIPTS (res
), subscript
);
2256 /* Set DDR_ARE_DEPENDENT to CHREC and finalize the subscript overlap
2260 finalize_ddr_dependent (struct data_dependence_relation
*ddr
,
2263 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2265 fprintf (dump_file
, "(dependence classified: ");
2266 print_generic_expr (dump_file
, chrec
, 0);
2267 fprintf (dump_file
, ")\n");
2270 DDR_ARE_DEPENDENT (ddr
) = chrec
;
2271 VEC_free (subscript_p
, heap
, DDR_SUBSCRIPTS (ddr
));
2274 /* The dependence relation DDR cannot be represented by a distance
2278 non_affine_dependence_relation (struct data_dependence_relation
*ddr
)
2280 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2281 fprintf (dump_file
, "(Dependence relation cannot be represented by distance vector.) \n");
2283 DDR_AFFINE_P (ddr
) = false;
2288 /* This section contains the classic Banerjee tests. */
2290 /* Returns true iff CHREC_A and CHREC_B are not dependent on any index
2291 variables, i.e., if the ZIV (Zero Index Variable) test is true. */
2294 ziv_subscript_p (tree chrec_a
,
2297 return (evolution_function_is_constant_p (chrec_a
)
2298 && evolution_function_is_constant_p (chrec_b
));
2301 /* Returns true iff CHREC_A and CHREC_B are dependent on an index
2302 variable, i.e., if the SIV (Single Index Variable) test is true. */
2305 siv_subscript_p (tree chrec_a
,
2308 if ((evolution_function_is_constant_p (chrec_a
)
2309 && evolution_function_is_univariate_p (chrec_b
))
2310 || (evolution_function_is_constant_p (chrec_b
)
2311 && evolution_function_is_univariate_p (chrec_a
)))
2314 if (evolution_function_is_univariate_p (chrec_a
)
2315 && evolution_function_is_univariate_p (chrec_b
))
2317 switch (TREE_CODE (chrec_a
))
2319 case POLYNOMIAL_CHREC
:
2320 switch (TREE_CODE (chrec_b
))
2322 case POLYNOMIAL_CHREC
:
2323 if (CHREC_VARIABLE (chrec_a
) != CHREC_VARIABLE (chrec_b
))
2338 /* Analyze a ZIV (Zero Index Variable) subscript. *OVERLAPS_A and
2339 *OVERLAPS_B are initialized to the functions that describe the
2340 relation between the elements accessed twice by CHREC_A and
2341 CHREC_B. For k >= 0, the following property is verified:
2343 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
2346 analyze_ziv_subscript (tree chrec_a
,
2350 tree
*last_conflicts
)
2353 dependence_stats
.num_ziv
++;
2355 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2356 fprintf (dump_file
, "(analyze_ziv_subscript \n");
2358 chrec_a
= chrec_convert (integer_type_node
, chrec_a
, NULL_TREE
);
2359 chrec_b
= chrec_convert (integer_type_node
, chrec_b
, NULL_TREE
);
2360 difference
= chrec_fold_minus (integer_type_node
, chrec_a
, chrec_b
);
2362 switch (TREE_CODE (difference
))
2365 if (integer_zerop (difference
))
2367 /* The difference is equal to zero: the accessed index
2368 overlaps for each iteration in the loop. */
2369 *overlaps_a
= integer_zero_node
;
2370 *overlaps_b
= integer_zero_node
;
2371 *last_conflicts
= chrec_dont_know
;
2372 dependence_stats
.num_ziv_dependent
++;
2376 /* The accesses do not overlap. */
2377 *overlaps_a
= chrec_known
;
2378 *overlaps_b
= chrec_known
;
2379 *last_conflicts
= integer_zero_node
;
2380 dependence_stats
.num_ziv_independent
++;
2385 /* We're not sure whether the indexes overlap. For the moment,
2386 conservatively answer "don't know". */
2387 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2388 fprintf (dump_file
, "ziv test failed: difference is non-integer.\n");
2390 *overlaps_a
= chrec_dont_know
;
2391 *overlaps_b
= chrec_dont_know
;
2392 *last_conflicts
= chrec_dont_know
;
2393 dependence_stats
.num_ziv_unimplemented
++;
2397 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2398 fprintf (dump_file
, ")\n");
2401 /* Get the real or estimated number of iterations for LOOPNUM, whichever is
2402 available. Return the number of iterations as a tree, or NULL_TREE if
2406 get_number_of_iters_for_loop (int loopnum
)
2408 tree numiter
= number_of_iterations_in_loop (current_loops
->parray
[loopnum
]);
2410 if (TREE_CODE (numiter
) != INTEGER_CST
)
2411 numiter
= current_loops
->parray
[loopnum
]->estimated_nb_iterations
;
2412 if (chrec_contains_undetermined (numiter
))
2417 /* Analyze a SIV (Single Index Variable) subscript where CHREC_A is a
2418 constant, and CHREC_B is an affine function. *OVERLAPS_A and
2419 *OVERLAPS_B are initialized to the functions that describe the
2420 relation between the elements accessed twice by CHREC_A and
2421 CHREC_B. For k >= 0, the following property is verified:
2423 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
2426 analyze_siv_subscript_cst_affine (tree chrec_a
,
2430 tree
*last_conflicts
)
2432 bool value0
, value1
, value2
;
2435 chrec_a
= chrec_convert (integer_type_node
, chrec_a
, NULL_TREE
);
2436 chrec_b
= chrec_convert (integer_type_node
, chrec_b
, NULL_TREE
);
2437 difference
= chrec_fold_minus
2438 (integer_type_node
, initial_condition (chrec_b
), chrec_a
);
2440 if (!chrec_is_positive (initial_condition (difference
), &value0
))
2442 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2443 fprintf (dump_file
, "siv test failed: chrec is not positive.\n");
2445 dependence_stats
.num_siv_unimplemented
++;
2446 *overlaps_a
= chrec_dont_know
;
2447 *overlaps_b
= chrec_dont_know
;
2448 *last_conflicts
= chrec_dont_know
;
2453 if (value0
== false)
2455 if (!chrec_is_positive (CHREC_RIGHT (chrec_b
), &value1
))
2457 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2458 fprintf (dump_file
, "siv test failed: chrec not positive.\n");
2460 *overlaps_a
= chrec_dont_know
;
2461 *overlaps_b
= chrec_dont_know
;
2462 *last_conflicts
= chrec_dont_know
;
2463 dependence_stats
.num_siv_unimplemented
++;
2472 chrec_b = {10, +, 1}
2475 if (tree_fold_divides_p (CHREC_RIGHT (chrec_b
), difference
))
2478 int loopnum
= CHREC_VARIABLE (chrec_b
);
2480 *overlaps_a
= integer_zero_node
;
2481 *overlaps_b
= fold_build2 (EXACT_DIV_EXPR
, integer_type_node
,
2482 fold_build1 (ABS_EXPR
,
2485 CHREC_RIGHT (chrec_b
));
2486 *last_conflicts
= integer_one_node
;
2489 /* Perform weak-zero siv test to see if overlap is
2490 outside the loop bounds. */
2491 numiter
= get_number_of_iters_for_loop (loopnum
);
2493 if (numiter
!= NULL_TREE
2494 && TREE_CODE (*overlaps_b
) == INTEGER_CST
2495 && tree_int_cst_lt (numiter
, *overlaps_b
))
2497 *overlaps_a
= chrec_known
;
2498 *overlaps_b
= chrec_known
;
2499 *last_conflicts
= integer_zero_node
;
2500 dependence_stats
.num_siv_independent
++;
2503 dependence_stats
.num_siv_dependent
++;
2507 /* When the step does not divide the difference, there are
2511 *overlaps_a
= chrec_known
;
2512 *overlaps_b
= chrec_known
;
2513 *last_conflicts
= integer_zero_node
;
2514 dependence_stats
.num_siv_independent
++;
2523 chrec_b = {10, +, -1}
2525 In this case, chrec_a will not overlap with chrec_b. */
2526 *overlaps_a
= chrec_known
;
2527 *overlaps_b
= chrec_known
;
2528 *last_conflicts
= integer_zero_node
;
2529 dependence_stats
.num_siv_independent
++;
2536 if (!chrec_is_positive (CHREC_RIGHT (chrec_b
), &value2
))
2538 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2539 fprintf (dump_file
, "siv test failed: chrec not positive.\n");
2541 *overlaps_a
= chrec_dont_know
;
2542 *overlaps_b
= chrec_dont_know
;
2543 *last_conflicts
= chrec_dont_know
;
2544 dependence_stats
.num_siv_unimplemented
++;
2549 if (value2
== false)
2553 chrec_b = {10, +, -1}
2555 if (tree_fold_divides_p (CHREC_RIGHT (chrec_b
), difference
))
2558 int loopnum
= CHREC_VARIABLE (chrec_b
);
2560 *overlaps_a
= integer_zero_node
;
2561 *overlaps_b
= fold_build2 (EXACT_DIV_EXPR
,
2562 integer_type_node
, difference
,
2563 CHREC_RIGHT (chrec_b
));
2564 *last_conflicts
= integer_one_node
;
2566 /* Perform weak-zero siv test to see if overlap is
2567 outside the loop bounds. */
2568 numiter
= get_number_of_iters_for_loop (loopnum
);
2570 if (numiter
!= NULL_TREE
2571 && TREE_CODE (*overlaps_b
) == INTEGER_CST
2572 && tree_int_cst_lt (numiter
, *overlaps_b
))
2574 *overlaps_a
= chrec_known
;
2575 *overlaps_b
= chrec_known
;
2576 *last_conflicts
= integer_zero_node
;
2577 dependence_stats
.num_siv_independent
++;
2580 dependence_stats
.num_siv_dependent
++;
2584 /* When the step does not divide the difference, there
2588 *overlaps_a
= chrec_known
;
2589 *overlaps_b
= chrec_known
;
2590 *last_conflicts
= integer_zero_node
;
2591 dependence_stats
.num_siv_independent
++;
2601 In this case, chrec_a will not overlap with chrec_b. */
2602 *overlaps_a
= chrec_known
;
2603 *overlaps_b
= chrec_known
;
2604 *last_conflicts
= integer_zero_node
;
2605 dependence_stats
.num_siv_independent
++;
2613 /* Helper recursive function for initializing the matrix A. Returns
2614 the initial value of CHREC. */
2617 initialize_matrix_A (lambda_matrix A
, tree chrec
, unsigned index
, int mult
)
2621 if (TREE_CODE (chrec
) != POLYNOMIAL_CHREC
)
2622 return int_cst_value (chrec
);
2624 A
[index
][0] = mult
* int_cst_value (CHREC_RIGHT (chrec
));
2625 return initialize_matrix_A (A
, CHREC_LEFT (chrec
), index
+ 1, mult
);
2628 #define FLOOR_DIV(x,y) ((x) / (y))
2630 /* Solves the special case of the Diophantine equation:
2631 | {0, +, STEP_A}_x (OVERLAPS_A) = {0, +, STEP_B}_y (OVERLAPS_B)
2633 Computes the descriptions OVERLAPS_A and OVERLAPS_B. NITER is the
2634 number of iterations that loops X and Y run. The overlaps will be
2635 constructed as evolutions in dimension DIM. */
2638 compute_overlap_steps_for_affine_univar (int niter
, int step_a
, int step_b
,
2639 tree
*overlaps_a
, tree
*overlaps_b
,
2640 tree
*last_conflicts
, int dim
)
2642 if (((step_a
> 0 && step_b
> 0)
2643 || (step_a
< 0 && step_b
< 0)))
2645 int step_overlaps_a
, step_overlaps_b
;
2646 int gcd_steps_a_b
, last_conflict
, tau2
;
2648 gcd_steps_a_b
= gcd (step_a
, step_b
);
2649 step_overlaps_a
= step_b
/ gcd_steps_a_b
;
2650 step_overlaps_b
= step_a
/ gcd_steps_a_b
;
2652 tau2
= FLOOR_DIV (niter
, step_overlaps_a
);
2653 tau2
= MIN (tau2
, FLOOR_DIV (niter
, step_overlaps_b
));
2654 last_conflict
= tau2
;
2656 *overlaps_a
= build_polynomial_chrec
2657 (dim
, integer_zero_node
,
2658 build_int_cst (NULL_TREE
, step_overlaps_a
));
2659 *overlaps_b
= build_polynomial_chrec
2660 (dim
, integer_zero_node
,
2661 build_int_cst (NULL_TREE
, step_overlaps_b
));
2662 *last_conflicts
= build_int_cst (NULL_TREE
, last_conflict
);
2667 *overlaps_a
= integer_zero_node
;
2668 *overlaps_b
= integer_zero_node
;
2669 *last_conflicts
= integer_zero_node
;
2674 /* Solves the special case of a Diophantine equation where CHREC_A is
2675 an affine bivariate function, and CHREC_B is an affine univariate
2676 function. For example,
2678 | {{0, +, 1}_x, +, 1335}_y = {0, +, 1336}_z
2680 has the following overlapping functions:
2682 | x (t, u, v) = {{0, +, 1336}_t, +, 1}_v
2683 | y (t, u, v) = {{0, +, 1336}_u, +, 1}_v
2684 | z (t, u, v) = {{{0, +, 1}_t, +, 1335}_u, +, 1}_v
2686 FORNOW: This is a specialized implementation for a case occurring in
2687 a common benchmark. Implement the general algorithm. */
2690 compute_overlap_steps_for_affine_1_2 (tree chrec_a
, tree chrec_b
,
2691 tree
*overlaps_a
, tree
*overlaps_b
,
2692 tree
*last_conflicts
)
2694 bool xz_p
, yz_p
, xyz_p
;
2695 int step_x
, step_y
, step_z
;
2696 int niter_x
, niter_y
, niter_z
, niter
;
2697 tree numiter_x
, numiter_y
, numiter_z
;
2698 tree overlaps_a_xz
, overlaps_b_xz
, last_conflicts_xz
;
2699 tree overlaps_a_yz
, overlaps_b_yz
, last_conflicts_yz
;
2700 tree overlaps_a_xyz
, overlaps_b_xyz
, last_conflicts_xyz
;
2702 step_x
= int_cst_value (CHREC_RIGHT (CHREC_LEFT (chrec_a
)));
2703 step_y
= int_cst_value (CHREC_RIGHT (chrec_a
));
2704 step_z
= int_cst_value (CHREC_RIGHT (chrec_b
));
2706 numiter_x
= get_number_of_iters_for_loop (CHREC_VARIABLE (CHREC_LEFT (chrec_a
)));
2707 numiter_y
= get_number_of_iters_for_loop (CHREC_VARIABLE (chrec_a
));
2708 numiter_z
= get_number_of_iters_for_loop (CHREC_VARIABLE (chrec_b
));
2710 if (numiter_x
== NULL_TREE
|| numiter_y
== NULL_TREE
2711 || numiter_z
== NULL_TREE
)
2713 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2714 fprintf (dump_file
, "overlap steps test failed: no iteration counts.\n");
2716 *overlaps_a
= chrec_dont_know
;
2717 *overlaps_b
= chrec_dont_know
;
2718 *last_conflicts
= chrec_dont_know
;
2722 niter_x
= int_cst_value (numiter_x
);
2723 niter_y
= int_cst_value (numiter_y
);
2724 niter_z
= int_cst_value (numiter_z
);
2726 niter
= MIN (niter_x
, niter_z
);
2727 compute_overlap_steps_for_affine_univar (niter
, step_x
, step_z
,
2730 &last_conflicts_xz
, 1);
2731 niter
= MIN (niter_y
, niter_z
);
2732 compute_overlap_steps_for_affine_univar (niter
, step_y
, step_z
,
2735 &last_conflicts_yz
, 2);
2736 niter
= MIN (niter_x
, niter_z
);
2737 niter
= MIN (niter_y
, niter
);
2738 compute_overlap_steps_for_affine_univar (niter
, step_x
+ step_y
, step_z
,
2741 &last_conflicts_xyz
, 3);
2743 xz_p
= !integer_zerop (last_conflicts_xz
);
2744 yz_p
= !integer_zerop (last_conflicts_yz
);
2745 xyz_p
= !integer_zerop (last_conflicts_xyz
);
2747 if (xz_p
|| yz_p
|| xyz_p
)
2749 *overlaps_a
= make_tree_vec (2);
2750 TREE_VEC_ELT (*overlaps_a
, 0) = integer_zero_node
;
2751 TREE_VEC_ELT (*overlaps_a
, 1) = integer_zero_node
;
2752 *overlaps_b
= integer_zero_node
;
2755 tree t0
= chrec_convert (integer_type_node
,
2756 TREE_VEC_ELT (*overlaps_a
, 0), NULL_TREE
);
2757 tree t1
= chrec_convert (integer_type_node
, overlaps_a_xz
,
2759 tree t2
= chrec_convert (integer_type_node
, *overlaps_b
,
2761 tree t3
= chrec_convert (integer_type_node
, overlaps_b_xz
,
2764 TREE_VEC_ELT (*overlaps_a
, 0) = chrec_fold_plus (integer_type_node
,
2766 *overlaps_b
= chrec_fold_plus (integer_type_node
, t2
, t3
);
2767 *last_conflicts
= last_conflicts_xz
;
2771 tree t0
= chrec_convert (integer_type_node
,
2772 TREE_VEC_ELT (*overlaps_a
, 1), NULL_TREE
);
2773 tree t1
= chrec_convert (integer_type_node
, overlaps_a_yz
, NULL_TREE
);
2774 tree t2
= chrec_convert (integer_type_node
, *overlaps_b
, NULL_TREE
);
2775 tree t3
= chrec_convert (integer_type_node
, overlaps_b_yz
, NULL_TREE
);
2777 TREE_VEC_ELT (*overlaps_a
, 1) = chrec_fold_plus (integer_type_node
,
2779 *overlaps_b
= chrec_fold_plus (integer_type_node
, t2
, t3
);
2780 *last_conflicts
= last_conflicts_yz
;
2784 tree t0
= chrec_convert (integer_type_node
,
2785 TREE_VEC_ELT (*overlaps_a
, 0), NULL_TREE
);
2786 tree t1
= chrec_convert (integer_type_node
, overlaps_a_xyz
,
2788 tree t2
= chrec_convert (integer_type_node
,
2789 TREE_VEC_ELT (*overlaps_a
, 1), NULL_TREE
);
2790 tree t3
= chrec_convert (integer_type_node
, overlaps_a_xyz
,
2792 tree t4
= chrec_convert (integer_type_node
, *overlaps_b
, NULL_TREE
);
2793 tree t5
= chrec_convert (integer_type_node
, overlaps_b_xyz
,
2796 TREE_VEC_ELT (*overlaps_a
, 0) = chrec_fold_plus (integer_type_node
,
2798 TREE_VEC_ELT (*overlaps_a
, 1) = chrec_fold_plus (integer_type_node
,
2800 *overlaps_b
= chrec_fold_plus (integer_type_node
, t4
, t5
);
2801 *last_conflicts
= last_conflicts_xyz
;
2806 *overlaps_a
= integer_zero_node
;
2807 *overlaps_b
= integer_zero_node
;
2808 *last_conflicts
= integer_zero_node
;
2812 /* Determines the overlapping elements due to accesses CHREC_A and
2813 CHREC_B, that are affine functions. This function cannot handle
2814 symbolic evolution functions, ie. when initial conditions are
2815 parameters, because it uses lambda matrices of integers. */
2818 analyze_subscript_affine_affine (tree chrec_a
,
2822 tree
*last_conflicts
)
2824 unsigned nb_vars_a
, nb_vars_b
, dim
;
2825 int init_a
, init_b
, gamma
, gcd_alpha_beta
;
2827 lambda_matrix A
, U
, S
;
2829 if (eq_evolutions_p (chrec_a
, chrec_b
))
2831 /* The accessed index overlaps for each iteration in the
2833 *overlaps_a
= integer_zero_node
;
2834 *overlaps_b
= integer_zero_node
;
2835 *last_conflicts
= chrec_dont_know
;
2838 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2839 fprintf (dump_file
, "(analyze_subscript_affine_affine \n");
2841 /* For determining the initial intersection, we have to solve a
2842 Diophantine equation. This is the most time consuming part.
2844 For answering to the question: "Is there a dependence?" we have
2845 to prove that there exists a solution to the Diophantine
2846 equation, and that the solution is in the iteration domain,
2847 i.e. the solution is positive or zero, and that the solution
2848 happens before the upper bound loop.nb_iterations. Otherwise
2849 there is no dependence. This function outputs a description of
2850 the iterations that hold the intersections. */
2852 nb_vars_a
= nb_vars_in_chrec (chrec_a
);
2853 nb_vars_b
= nb_vars_in_chrec (chrec_b
);
2855 dim
= nb_vars_a
+ nb_vars_b
;
2856 U
= lambda_matrix_new (dim
, dim
);
2857 A
= lambda_matrix_new (dim
, 1);
2858 S
= lambda_matrix_new (dim
, 1);
2860 init_a
= initialize_matrix_A (A
, chrec_a
, 0, 1);
2861 init_b
= initialize_matrix_A (A
, chrec_b
, nb_vars_a
, -1);
2862 gamma
= init_b
- init_a
;
2864 /* Don't do all the hard work of solving the Diophantine equation
2865 when we already know the solution: for example,
2868 | gamma = 3 - 3 = 0.
2869 Then the first overlap occurs during the first iterations:
2870 | {3, +, 1}_1 ({0, +, 4}_x) = {3, +, 4}_2 ({0, +, 1}_x)
2874 if (nb_vars_a
== 1 && nb_vars_b
== 1)
2877 int niter
, niter_a
, niter_b
;
2878 tree numiter_a
, numiter_b
;
2880 numiter_a
= get_number_of_iters_for_loop (CHREC_VARIABLE (chrec_a
));
2881 numiter_b
= get_number_of_iters_for_loop (CHREC_VARIABLE (chrec_b
));
2882 if (numiter_a
== NULL_TREE
|| numiter_b
== NULL_TREE
)
2884 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2885 fprintf (dump_file
, "affine-affine test failed: missing iteration counts.\n");
2886 *overlaps_a
= chrec_dont_know
;
2887 *overlaps_b
= chrec_dont_know
;
2888 *last_conflicts
= chrec_dont_know
;
2889 goto end_analyze_subs_aa
;
2892 niter_a
= int_cst_value (numiter_a
);
2893 niter_b
= int_cst_value (numiter_b
);
2894 niter
= MIN (niter_a
, niter_b
);
2896 step_a
= int_cst_value (CHREC_RIGHT (chrec_a
));
2897 step_b
= int_cst_value (CHREC_RIGHT (chrec_b
));
2899 compute_overlap_steps_for_affine_univar (niter
, step_a
, step_b
,
2900 overlaps_a
, overlaps_b
,
2904 else if (nb_vars_a
== 2 && nb_vars_b
== 1)
2905 compute_overlap_steps_for_affine_1_2
2906 (chrec_a
, chrec_b
, overlaps_a
, overlaps_b
, last_conflicts
);
2908 else if (nb_vars_a
== 1 && nb_vars_b
== 2)
2909 compute_overlap_steps_for_affine_1_2
2910 (chrec_b
, chrec_a
, overlaps_b
, overlaps_a
, last_conflicts
);
2914 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2915 fprintf (dump_file
, "affine-affine test failed: too many variables.\n");
2916 *overlaps_a
= chrec_dont_know
;
2917 *overlaps_b
= chrec_dont_know
;
2918 *last_conflicts
= chrec_dont_know
;
2920 goto end_analyze_subs_aa
;
2924 lambda_matrix_right_hermite (A
, dim
, 1, S
, U
);
2929 lambda_matrix_row_negate (U
, dim
, 0);
2931 gcd_alpha_beta
= S
[0][0];
2933 /* Something went wrong: for example in {1, +, 0}_5 vs. {0, +, 0}_5,
2934 but that is a quite strange case. Instead of ICEing, answer
2936 if (gcd_alpha_beta
== 0)
2938 *overlaps_a
= chrec_dont_know
;
2939 *overlaps_b
= chrec_dont_know
;
2940 *last_conflicts
= chrec_dont_know
;
2941 goto end_analyze_subs_aa
;
2944 /* The classic "gcd-test". */
2945 if (!int_divides_p (gcd_alpha_beta
, gamma
))
2947 /* The "gcd-test" has determined that there is no integer
2948 solution, i.e. there is no dependence. */
2949 *overlaps_a
= chrec_known
;
2950 *overlaps_b
= chrec_known
;
2951 *last_conflicts
= integer_zero_node
;
2954 /* Both access functions are univariate. This includes SIV and MIV cases. */
2955 else if (nb_vars_a
== 1 && nb_vars_b
== 1)
2957 /* Both functions should have the same evolution sign. */
2958 if (((A
[0][0] > 0 && -A
[1][0] > 0)
2959 || (A
[0][0] < 0 && -A
[1][0] < 0)))
2961 /* The solutions are given by:
2963 | [GAMMA/GCD_ALPHA_BETA t].[u11 u12] = [x0]
2966 For a given integer t. Using the following variables,
2968 | i0 = u11 * gamma / gcd_alpha_beta
2969 | j0 = u12 * gamma / gcd_alpha_beta
2976 | y0 = j0 + j1 * t. */
2980 /* X0 and Y0 are the first iterations for which there is a
2981 dependence. X0, Y0 are two solutions of the Diophantine
2982 equation: chrec_a (X0) = chrec_b (Y0). */
2984 int niter
, niter_a
, niter_b
;
2985 tree numiter_a
, numiter_b
;
2987 numiter_a
= get_number_of_iters_for_loop (CHREC_VARIABLE (chrec_a
));
2988 numiter_b
= get_number_of_iters_for_loop (CHREC_VARIABLE (chrec_b
));
2990 if (numiter_a
== NULL_TREE
|| numiter_b
== NULL_TREE
)
2992 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2993 fprintf (dump_file
, "affine-affine test failed: missing iteration counts.\n");
2994 *overlaps_a
= chrec_dont_know
;
2995 *overlaps_b
= chrec_dont_know
;
2996 *last_conflicts
= chrec_dont_know
;
2997 goto end_analyze_subs_aa
;
3000 niter_a
= int_cst_value (numiter_a
);
3001 niter_b
= int_cst_value (numiter_b
);
3002 niter
= MIN (niter_a
, niter_b
);
3004 i0
= U
[0][0] * gamma
/ gcd_alpha_beta
;
3005 j0
= U
[0][1] * gamma
/ gcd_alpha_beta
;
3009 if ((i1
== 0 && i0
< 0)
3010 || (j1
== 0 && j0
< 0))
3012 /* There is no solution.
3013 FIXME: The case "i0 > nb_iterations, j0 > nb_iterations"
3014 falls in here, but for the moment we don't look at the
3015 upper bound of the iteration domain. */
3016 *overlaps_a
= chrec_known
;
3017 *overlaps_b
= chrec_known
;
3018 *last_conflicts
= integer_zero_node
;
3025 tau1
= CEIL (-i0
, i1
);
3026 tau2
= FLOOR_DIV (niter
- i0
, i1
);
3030 int last_conflict
, min_multiple
;
3031 tau1
= MAX (tau1
, CEIL (-j0
, j1
));
3032 tau2
= MIN (tau2
, FLOOR_DIV (niter
- j0
, j1
));
3034 x0
= i1
* tau1
+ i0
;
3035 y0
= j1
* tau1
+ j0
;
3037 /* At this point (x0, y0) is one of the
3038 solutions to the Diophantine equation. The
3039 next step has to compute the smallest
3040 positive solution: the first conflicts. */
3041 min_multiple
= MIN (x0
/ i1
, y0
/ j1
);
3042 x0
-= i1
* min_multiple
;
3043 y0
-= j1
* min_multiple
;
3045 tau1
= (x0
- i0
)/i1
;
3046 last_conflict
= tau2
- tau1
;
3048 /* If the overlap occurs outside of the bounds of the
3049 loop, there is no dependence. */
3050 if (x0
> niter
|| y0
> niter
)
3052 *overlaps_a
= chrec_known
;
3053 *overlaps_b
= chrec_known
;
3054 *last_conflicts
= integer_zero_node
;
3058 *overlaps_a
= build_polynomial_chrec
3060 build_int_cst (NULL_TREE
, x0
),
3061 build_int_cst (NULL_TREE
, i1
));
3062 *overlaps_b
= build_polynomial_chrec
3064 build_int_cst (NULL_TREE
, y0
),
3065 build_int_cst (NULL_TREE
, j1
));
3066 *last_conflicts
= build_int_cst (NULL_TREE
, last_conflict
);
3071 /* FIXME: For the moment, the upper bound of the
3072 iteration domain for j is not checked. */
3073 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3074 fprintf (dump_file
, "affine-affine test failed: unimplemented.\n");
3075 *overlaps_a
= chrec_dont_know
;
3076 *overlaps_b
= chrec_dont_know
;
3077 *last_conflicts
= chrec_dont_know
;
3083 /* FIXME: For the moment, the upper bound of the
3084 iteration domain for i is not checked. */
3085 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3086 fprintf (dump_file
, "affine-affine test failed: unimplemented.\n");
3087 *overlaps_a
= chrec_dont_know
;
3088 *overlaps_b
= chrec_dont_know
;
3089 *last_conflicts
= chrec_dont_know
;
3095 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3096 fprintf (dump_file
, "affine-affine test failed: unimplemented.\n");
3097 *overlaps_a
= chrec_dont_know
;
3098 *overlaps_b
= chrec_dont_know
;
3099 *last_conflicts
= chrec_dont_know
;
3105 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3106 fprintf (dump_file
, "affine-affine test failed: unimplemented.\n");
3107 *overlaps_a
= chrec_dont_know
;
3108 *overlaps_b
= chrec_dont_know
;
3109 *last_conflicts
= chrec_dont_know
;
3112 end_analyze_subs_aa
:
3113 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3115 fprintf (dump_file
, " (overlaps_a = ");
3116 print_generic_expr (dump_file
, *overlaps_a
, 0);
3117 fprintf (dump_file
, ")\n (overlaps_b = ");
3118 print_generic_expr (dump_file
, *overlaps_b
, 0);
3119 fprintf (dump_file
, ")\n");
3120 fprintf (dump_file
, ")\n");
3124 /* Returns true when analyze_subscript_affine_affine can be used for
3125 determining the dependence relation between chrec_a and chrec_b,
3126 that contain symbols. This function modifies chrec_a and chrec_b
3127 such that the analysis result is the same, and such that they don't
3128 contain symbols, and then can safely be passed to the analyzer.
3130 Example: The analysis of the following tuples of evolutions produce
3131 the same results: {x+1, +, 1}_1 vs. {x+3, +, 1}_1, and {-2, +, 1}_1
3134 {x+1, +, 1}_1 ({2, +, 1}_1) = {x+3, +, 1}_1 ({0, +, 1}_1)
3135 {-2, +, 1}_1 ({2, +, 1}_1) = {0, +, 1}_1 ({0, +, 1}_1)
3139 can_use_analyze_subscript_affine_affine (tree
*chrec_a
, tree
*chrec_b
)
3141 tree diff
, type
, left_a
, left_b
, right_b
;
3143 if (chrec_contains_symbols (CHREC_RIGHT (*chrec_a
))
3144 || chrec_contains_symbols (CHREC_RIGHT (*chrec_b
)))
3145 /* FIXME: For the moment not handled. Might be refined later. */
3148 type
= chrec_type (*chrec_a
);
3149 left_a
= CHREC_LEFT (*chrec_a
);
3150 left_b
= chrec_convert (type
, CHREC_LEFT (*chrec_b
), NULL_TREE
);
3151 diff
= chrec_fold_minus (type
, left_a
, left_b
);
3153 if (!evolution_function_is_constant_p (diff
))
3156 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3157 fprintf (dump_file
, "can_use_subscript_aff_aff_for_symbolic \n");
3159 *chrec_a
= build_polynomial_chrec (CHREC_VARIABLE (*chrec_a
),
3160 diff
, CHREC_RIGHT (*chrec_a
));
3161 right_b
= chrec_convert (type
, CHREC_RIGHT (*chrec_b
), NULL_TREE
);
3162 *chrec_b
= build_polynomial_chrec (CHREC_VARIABLE (*chrec_b
),
3163 build_int_cst (type
, 0),
3168 /* Analyze a SIV (Single Index Variable) subscript. *OVERLAPS_A and
3169 *OVERLAPS_B are initialized to the functions that describe the
3170 relation between the elements accessed twice by CHREC_A and
3171 CHREC_B. For k >= 0, the following property is verified:
3173 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
3176 analyze_siv_subscript (tree chrec_a
,
3180 tree
*last_conflicts
)
3182 dependence_stats
.num_siv
++;
3184 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3185 fprintf (dump_file
, "(analyze_siv_subscript \n");
3187 if (evolution_function_is_constant_p (chrec_a
)
3188 && evolution_function_is_affine_p (chrec_b
))
3189 analyze_siv_subscript_cst_affine (chrec_a
, chrec_b
,
3190 overlaps_a
, overlaps_b
, last_conflicts
);
3192 else if (evolution_function_is_affine_p (chrec_a
)
3193 && evolution_function_is_constant_p (chrec_b
))
3194 analyze_siv_subscript_cst_affine (chrec_b
, chrec_a
,
3195 overlaps_b
, overlaps_a
, last_conflicts
);
3197 else if (evolution_function_is_affine_p (chrec_a
)
3198 && evolution_function_is_affine_p (chrec_b
))
3200 if (!chrec_contains_symbols (chrec_a
)
3201 && !chrec_contains_symbols (chrec_b
))
3203 analyze_subscript_affine_affine (chrec_a
, chrec_b
,
3204 overlaps_a
, overlaps_b
,
3207 if (*overlaps_a
== chrec_dont_know
3208 || *overlaps_b
== chrec_dont_know
)
3209 dependence_stats
.num_siv_unimplemented
++;
3210 else if (*overlaps_a
== chrec_known
3211 || *overlaps_b
== chrec_known
)
3212 dependence_stats
.num_siv_independent
++;
3214 dependence_stats
.num_siv_dependent
++;
3216 else if (can_use_analyze_subscript_affine_affine (&chrec_a
,
3219 analyze_subscript_affine_affine (chrec_a
, chrec_b
,
3220 overlaps_a
, overlaps_b
,
3222 /* FIXME: The number of iterations is a symbolic expression.
3223 Compute it properly. */
3224 *last_conflicts
= chrec_dont_know
;
3226 if (*overlaps_a
== chrec_dont_know
3227 || *overlaps_b
== chrec_dont_know
)
3228 dependence_stats
.num_siv_unimplemented
++;
3229 else if (*overlaps_a
== chrec_known
3230 || *overlaps_b
== chrec_known
)
3231 dependence_stats
.num_siv_independent
++;
3233 dependence_stats
.num_siv_dependent
++;
3236 goto siv_subscript_dontknow
;
3241 siv_subscript_dontknow
:;
3242 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3243 fprintf (dump_file
, "siv test failed: unimplemented.\n");
3244 *overlaps_a
= chrec_dont_know
;
3245 *overlaps_b
= chrec_dont_know
;
3246 *last_conflicts
= chrec_dont_know
;
3247 dependence_stats
.num_siv_unimplemented
++;
3250 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3251 fprintf (dump_file
, ")\n");
3254 /* Return true when the property can be computed. RES should contain
3255 true when calling the first time this function, then it is set to
3256 false when one of the evolution steps of an affine CHREC does not
3257 divide the constant CST. */
3260 chrec_steps_divide_constant_p (tree chrec
,
3264 switch (TREE_CODE (chrec
))
3266 case POLYNOMIAL_CHREC
:
3267 if (evolution_function_is_constant_p (CHREC_RIGHT (chrec
)))
3269 if (tree_fold_divides_p (CHREC_RIGHT (chrec
), cst
))
3270 /* Keep RES to true, and iterate on other dimensions. */
3271 return chrec_steps_divide_constant_p (CHREC_LEFT (chrec
), cst
, res
);
3277 /* When the step is a parameter the result is undetermined. */
3281 /* On the initial condition, return true. */
3286 /* Analyze a MIV (Multiple Index Variable) subscript. *OVERLAPS_A and
3287 *OVERLAPS_B are initialized to the functions that describe the
3288 relation between the elements accessed twice by CHREC_A and
3289 CHREC_B. For k >= 0, the following property is verified:
3291 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
3294 analyze_miv_subscript (tree chrec_a
,
3298 tree
*last_conflicts
)
3300 /* FIXME: This is a MIV subscript, not yet handled.
3301 Example: (A[{1, +, 1}_1] vs. A[{1, +, 1}_2]) that comes from
3304 In the SIV test we had to solve a Diophantine equation with two
3305 variables. In the MIV case we have to solve a Diophantine
3306 equation with 2*n variables (if the subscript uses n IVs).
3308 bool divide_p
= true;
3310 dependence_stats
.num_miv
++;
3311 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3312 fprintf (dump_file
, "(analyze_miv_subscript \n");
3314 chrec_a
= chrec_convert (integer_type_node
, chrec_a
, NULL_TREE
);
3315 chrec_b
= chrec_convert (integer_type_node
, chrec_b
, NULL_TREE
);
3316 difference
= chrec_fold_minus (integer_type_node
, chrec_a
, chrec_b
);
3318 if (eq_evolutions_p (chrec_a
, chrec_b
))
3320 /* Access functions are the same: all the elements are accessed
3321 in the same order. */
3322 *overlaps_a
= integer_zero_node
;
3323 *overlaps_b
= integer_zero_node
;
3324 *last_conflicts
= get_number_of_iters_for_loop (CHREC_VARIABLE (chrec_a
));
3325 dependence_stats
.num_miv_dependent
++;
3328 else if (evolution_function_is_constant_p (difference
)
3329 /* For the moment, the following is verified:
3330 evolution_function_is_affine_multivariate_p (chrec_a) */
3331 && chrec_steps_divide_constant_p (chrec_a
, difference
, ÷_p
)
3334 /* testsuite/.../ssa-chrec-33.c
3335 {{21, +, 2}_1, +, -2}_2 vs. {{20, +, 2}_1, +, -2}_2
3337 The difference is 1, and the evolution steps are equal to 2,
3338 consequently there are no overlapping elements. */
3339 *overlaps_a
= chrec_known
;
3340 *overlaps_b
= chrec_known
;
3341 *last_conflicts
= integer_zero_node
;
3342 dependence_stats
.num_miv_independent
++;
3345 else if (evolution_function_is_affine_multivariate_p (chrec_a
)
3346 && !chrec_contains_symbols (chrec_a
)
3347 && evolution_function_is_affine_multivariate_p (chrec_b
)
3348 && !chrec_contains_symbols (chrec_b
))
3350 /* testsuite/.../ssa-chrec-35.c
3351 {0, +, 1}_2 vs. {0, +, 1}_3
3352 the overlapping elements are respectively located at iterations:
3353 {0, +, 1}_x and {0, +, 1}_x,
3354 in other words, we have the equality:
3355 {0, +, 1}_2 ({0, +, 1}_x) = {0, +, 1}_3 ({0, +, 1}_x)
3358 {{0, +, 1}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y) =
3359 {0, +, 1}_1 ({{0, +, 1}_x, +, 2}_y)
3361 {{0, +, 2}_1, +, 3}_2 ({0, +, 1}_y, {0, +, 1}_x) =
3362 {{0, +, 3}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y)
3364 analyze_subscript_affine_affine (chrec_a
, chrec_b
,
3365 overlaps_a
, overlaps_b
, last_conflicts
);
3367 if (*overlaps_a
== chrec_dont_know
3368 || *overlaps_b
== chrec_dont_know
)
3369 dependence_stats
.num_miv_unimplemented
++;
3370 else if (*overlaps_a
== chrec_known
3371 || *overlaps_b
== chrec_known
)
3372 dependence_stats
.num_miv_independent
++;
3374 dependence_stats
.num_miv_dependent
++;
3379 /* When the analysis is too difficult, answer "don't know". */
3380 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3381 fprintf (dump_file
, "analyze_miv_subscript test failed: unimplemented.\n");
3383 *overlaps_a
= chrec_dont_know
;
3384 *overlaps_b
= chrec_dont_know
;
3385 *last_conflicts
= chrec_dont_know
;
3386 dependence_stats
.num_miv_unimplemented
++;
3389 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3390 fprintf (dump_file
, ")\n");
3393 /* Determines the iterations for which CHREC_A is equal to CHREC_B.
3394 OVERLAP_ITERATIONS_A and OVERLAP_ITERATIONS_B are initialized with
3395 two functions that describe the iterations that contain conflicting
3398 Remark: For an integer k >= 0, the following equality is true:
3400 CHREC_A (OVERLAP_ITERATIONS_A (k)) == CHREC_B (OVERLAP_ITERATIONS_B (k)).
3404 analyze_overlapping_iterations (tree chrec_a
,
3406 tree
*overlap_iterations_a
,
3407 tree
*overlap_iterations_b
,
3408 tree
*last_conflicts
)
3410 dependence_stats
.num_subscript_tests
++;
3412 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3414 fprintf (dump_file
, "(analyze_overlapping_iterations \n");
3415 fprintf (dump_file
, " (chrec_a = ");
3416 print_generic_expr (dump_file
, chrec_a
, 0);
3417 fprintf (dump_file
, ")\n (chrec_b = ");
3418 print_generic_expr (dump_file
, chrec_b
, 0);
3419 fprintf (dump_file
, ")\n");
3422 if (chrec_a
== NULL_TREE
3423 || chrec_b
== NULL_TREE
3424 || chrec_contains_undetermined (chrec_a
)
3425 || chrec_contains_undetermined (chrec_b
))
3427 dependence_stats
.num_subscript_undetermined
++;
3429 *overlap_iterations_a
= chrec_dont_know
;
3430 *overlap_iterations_b
= chrec_dont_know
;
3433 /* If they are the same chrec, and are affine, they overlap
3434 on every iteration. */
3435 else if (eq_evolutions_p (chrec_a
, chrec_b
)
3436 && evolution_function_is_affine_multivariate_p (chrec_a
))
3438 dependence_stats
.num_same_subscript_function
++;
3439 *overlap_iterations_a
= integer_zero_node
;
3440 *overlap_iterations_b
= integer_zero_node
;
3441 *last_conflicts
= chrec_dont_know
;
3444 /* If they aren't the same, and aren't affine, we can't do anything
3446 else if ((chrec_contains_symbols (chrec_a
)
3447 || chrec_contains_symbols (chrec_b
))
3448 && (!evolution_function_is_affine_multivariate_p (chrec_a
)
3449 || !evolution_function_is_affine_multivariate_p (chrec_b
)))
3451 dependence_stats
.num_subscript_undetermined
++;
3452 *overlap_iterations_a
= chrec_dont_know
;
3453 *overlap_iterations_b
= chrec_dont_know
;
3456 else if (ziv_subscript_p (chrec_a
, chrec_b
))
3457 analyze_ziv_subscript (chrec_a
, chrec_b
,
3458 overlap_iterations_a
, overlap_iterations_b
,
3461 else if (siv_subscript_p (chrec_a
, chrec_b
))
3462 analyze_siv_subscript (chrec_a
, chrec_b
,
3463 overlap_iterations_a
, overlap_iterations_b
,
3467 analyze_miv_subscript (chrec_a
, chrec_b
,
3468 overlap_iterations_a
, overlap_iterations_b
,
3471 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3473 fprintf (dump_file
, " (overlap_iterations_a = ");
3474 print_generic_expr (dump_file
, *overlap_iterations_a
, 0);
3475 fprintf (dump_file
, ")\n (overlap_iterations_b = ");
3476 print_generic_expr (dump_file
, *overlap_iterations_b
, 0);
3477 fprintf (dump_file
, ")\n");
3478 fprintf (dump_file
, ")\n");
3482 /* Helper function for uniquely inserting distance vectors. */
3485 save_dist_v (struct data_dependence_relation
*ddr
, lambda_vector dist_v
)
3490 for (i
= 0; VEC_iterate (lambda_vector
, DDR_DIST_VECTS (ddr
), i
, v
); i
++)
3491 if (lambda_vector_equal (v
, dist_v
, DDR_NB_LOOPS (ddr
)))
3494 VEC_safe_push (lambda_vector
, heap
, DDR_DIST_VECTS (ddr
), dist_v
);
3497 /* Helper function for uniquely inserting direction vectors. */
3500 save_dir_v (struct data_dependence_relation
*ddr
, lambda_vector dir_v
)
3505 for (i
= 0; VEC_iterate (lambda_vector
, DDR_DIR_VECTS (ddr
), i
, v
); i
++)
3506 if (lambda_vector_equal (v
, dir_v
, DDR_NB_LOOPS (ddr
)))
3509 VEC_safe_push (lambda_vector
, heap
, DDR_DIR_VECTS (ddr
), dir_v
);
3512 /* Add a distance of 1 on all the loops outer than INDEX. If we
3513 haven't yet determined a distance for this outer loop, push a new
3514 distance vector composed of the previous distance, and a distance
3515 of 1 for this outer loop. Example:
3523 Saved vectors are of the form (dist_in_1, dist_in_2). First, we
3524 save (0, 1), then we have to save (1, 0). */
3527 add_outer_distances (struct data_dependence_relation
*ddr
,
3528 lambda_vector dist_v
, int index
)
3530 /* For each outer loop where init_v is not set, the accesses are
3531 in dependence of distance 1 in the loop. */
3532 while (--index
>= 0)
3534 lambda_vector save_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3535 lambda_vector_copy (dist_v
, save_v
, DDR_NB_LOOPS (ddr
));
3537 save_dist_v (ddr
, save_v
);
3541 /* Return false when fail to represent the data dependence as a
3542 distance vector. INIT_B is set to true when a component has been
3543 added to the distance vector DIST_V. INDEX_CARRY is then set to
3544 the index in DIST_V that carries the dependence. */
3547 build_classic_dist_vector_1 (struct data_dependence_relation
*ddr
,
3548 struct data_reference
*ddr_a
,
3549 struct data_reference
*ddr_b
,
3550 lambda_vector dist_v
, bool *init_b
,
3554 lambda_vector init_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3556 for (i
= 0; i
< DDR_NUM_SUBSCRIPTS (ddr
); i
++)
3558 tree access_fn_a
, access_fn_b
;
3559 struct subscript
*subscript
= DDR_SUBSCRIPT (ddr
, i
);
3561 if (chrec_contains_undetermined (SUB_DISTANCE (subscript
)))
3563 non_affine_dependence_relation (ddr
);
3567 access_fn_a
= DR_ACCESS_FN (ddr_a
, i
);
3568 access_fn_b
= DR_ACCESS_FN (ddr_b
, i
);
3570 if (TREE_CODE (access_fn_a
) == POLYNOMIAL_CHREC
3571 && TREE_CODE (access_fn_b
) == POLYNOMIAL_CHREC
)
3574 int index_a
= index_in_loop_nest (CHREC_VARIABLE (access_fn_a
),
3575 DDR_LOOP_NEST (ddr
));
3576 int index_b
= index_in_loop_nest (CHREC_VARIABLE (access_fn_b
),
3577 DDR_LOOP_NEST (ddr
));
3579 /* The dependence is carried by the outermost loop. Example:
3586 In this case, the dependence is carried by loop_1. */
3587 index
= index_a
< index_b
? index_a
: index_b
;
3588 *index_carry
= MIN (index
, *index_carry
);
3590 if (chrec_contains_undetermined (SUB_DISTANCE (subscript
)))
3592 non_affine_dependence_relation (ddr
);
3596 dist
= int_cst_value (SUB_DISTANCE (subscript
));
3598 /* This is the subscript coupling test. If we have already
3599 recorded a distance for this loop (a distance coming from
3600 another subscript), it should be the same. For example,
3601 in the following code, there is no dependence:
3608 if (init_v
[index
] != 0 && dist_v
[index
] != dist
)
3610 finalize_ddr_dependent (ddr
, chrec_known
);
3614 dist_v
[index
] = dist
;
3620 /* This can be for example an affine vs. constant dependence
3621 (T[i] vs. T[3]) that is not an affine dependence and is
3622 not representable as a distance vector. */
3623 non_affine_dependence_relation (ddr
);
3631 /* Return true when the DDR contains two data references that have the
3632 same access functions. */
3635 same_access_functions (struct data_dependence_relation
*ddr
)
3639 for (i
= 0; i
< DDR_NUM_SUBSCRIPTS (ddr
); i
++)
3640 if (!eq_evolutions_p (DR_ACCESS_FN (DDR_A (ddr
), i
),
3641 DR_ACCESS_FN (DDR_B (ddr
), i
)))
3647 /* Helper function for the case where DDR_A and DDR_B are the same
3648 multivariate access function. */
3651 add_multivariate_self_dist (struct data_dependence_relation
*ddr
, tree c_2
)
3654 tree c_1
= CHREC_LEFT (c_2
);
3655 tree c_0
= CHREC_LEFT (c_1
);
3656 lambda_vector dist_v
;
3658 /* Polynomials with more than 2 variables are not handled yet. */
3659 if (TREE_CODE (c_0
) != INTEGER_CST
)
3661 DDR_ARE_DEPENDENT (ddr
) = chrec_dont_know
;
3665 x_2
= index_in_loop_nest (CHREC_VARIABLE (c_2
), DDR_LOOP_NEST (ddr
));
3666 x_1
= index_in_loop_nest (CHREC_VARIABLE (c_1
), DDR_LOOP_NEST (ddr
));
3668 /* For "{{0, +, 2}_1, +, 3}_2" the distance vector is (3, -2). */
3669 dist_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3670 dist_v
[x_1
] = int_cst_value (CHREC_RIGHT (c_2
));
3671 dist_v
[x_2
] = -int_cst_value (CHREC_RIGHT (c_1
));
3672 save_dist_v (ddr
, dist_v
);
3674 add_outer_distances (ddr
, dist_v
, x_1
);
3677 /* Helper function for the case where DDR_A and DDR_B are the same
3678 access functions. */
3681 add_other_self_distances (struct data_dependence_relation
*ddr
)
3683 lambda_vector dist_v
;
3685 int index_carry
= DDR_NB_LOOPS (ddr
);
3687 for (i
= 0; i
< DDR_NUM_SUBSCRIPTS (ddr
); i
++)
3689 tree access_fun
= DR_ACCESS_FN (DDR_A (ddr
), i
);
3691 if (TREE_CODE (access_fun
) == POLYNOMIAL_CHREC
)
3693 if (!evolution_function_is_univariate_p (access_fun
))
3695 if (DDR_NUM_SUBSCRIPTS (ddr
) != 1)
3697 DDR_ARE_DEPENDENT (ddr
) = chrec_dont_know
;
3701 add_multivariate_self_dist (ddr
, DR_ACCESS_FN (DDR_A (ddr
), 0));
3705 index_carry
= MIN (index_carry
,
3706 index_in_loop_nest (CHREC_VARIABLE (access_fun
),
3707 DDR_LOOP_NEST (ddr
)));
3711 dist_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3712 add_outer_distances (ddr
, dist_v
, index_carry
);
3715 /* Compute the classic per loop distance vector. DDR is the data
3716 dependence relation to build a vector from. Return false when fail
3717 to represent the data dependence as a distance vector. */
3720 build_classic_dist_vector (struct data_dependence_relation
*ddr
)
3722 bool init_b
= false;
3723 int index_carry
= DDR_NB_LOOPS (ddr
);
3724 lambda_vector dist_v
;
3726 if (DDR_ARE_DEPENDENT (ddr
) != NULL_TREE
)
3729 if (same_access_functions (ddr
))
3731 /* Save the 0 vector. */
3732 dist_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3733 save_dist_v (ddr
, dist_v
);
3735 if (DDR_NB_LOOPS (ddr
) > 1)
3736 add_other_self_distances (ddr
);
3741 dist_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3742 if (!build_classic_dist_vector_1 (ddr
, DDR_A (ddr
), DDR_B (ddr
),
3743 dist_v
, &init_b
, &index_carry
))
3746 /* Save the distance vector if we initialized one. */
3749 /* Verify a basic constraint: classic distance vectors should
3750 always be lexicographically positive.
3752 Data references are collected in the order of execution of
3753 the program, thus for the following loop
3755 | for (i = 1; i < 100; i++)
3756 | for (j = 1; j < 100; j++)
3758 | t = T[j+1][i-1]; // A
3759 | T[j][i] = t + 2; // B
3762 references are collected following the direction of the wind:
3763 A then B. The data dependence tests are performed also
3764 following this order, such that we're looking at the distance
3765 separating the elements accessed by A from the elements later
3766 accessed by B. But in this example, the distance returned by
3767 test_dep (A, B) is lexicographically negative (-1, 1), that
3768 means that the access A occurs later than B with respect to
3769 the outer loop, ie. we're actually looking upwind. In this
3770 case we solve test_dep (B, A) looking downwind to the
3771 lexicographically positive solution, that returns the
3772 distance vector (1, -1). */
3773 if (!lambda_vector_lexico_pos (dist_v
, DDR_NB_LOOPS (ddr
)))
3775 lambda_vector save_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3776 subscript_dependence_tester_1 (ddr
, DDR_B (ddr
), DDR_A (ddr
));
3777 compute_subscript_distance (ddr
);
3778 build_classic_dist_vector_1 (ddr
, DDR_B (ddr
), DDR_A (ddr
),
3779 save_v
, &init_b
, &index_carry
);
3780 save_dist_v (ddr
, save_v
);
3782 /* In this case there is a dependence forward for all the
3785 | for (k = 1; k < 100; k++)
3786 | for (i = 1; i < 100; i++)
3787 | for (j = 1; j < 100; j++)
3789 | t = T[j+1][i-1]; // A
3790 | T[j][i] = t + 2; // B
3798 if (DDR_NB_LOOPS (ddr
) > 1)
3800 add_outer_distances (ddr
, save_v
, index_carry
);
3801 add_outer_distances (ddr
, dist_v
, index_carry
);
3806 lambda_vector save_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3807 lambda_vector_copy (dist_v
, save_v
, DDR_NB_LOOPS (ddr
));
3808 save_dist_v (ddr
, save_v
);
3810 if (DDR_NB_LOOPS (ddr
) > 1)
3812 lambda_vector opposite_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3814 subscript_dependence_tester_1 (ddr
, DDR_B (ddr
), DDR_A (ddr
));
3815 compute_subscript_distance (ddr
);
3816 build_classic_dist_vector_1 (ddr
, DDR_B (ddr
), DDR_A (ddr
),
3817 opposite_v
, &init_b
, &index_carry
);
3819 add_outer_distances (ddr
, dist_v
, index_carry
);
3820 add_outer_distances (ddr
, opposite_v
, index_carry
);
3826 /* There is a distance of 1 on all the outer loops: Example:
3827 there is a dependence of distance 1 on loop_1 for the array A.
3833 add_outer_distances (ddr
, dist_v
,
3834 lambda_vector_first_nz (dist_v
,
3835 DDR_NB_LOOPS (ddr
), 0));
3838 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3842 fprintf (dump_file
, "(build_classic_dist_vector\n");
3843 for (i
= 0; i
< DDR_NUM_DIST_VECTS (ddr
); i
++)
3845 fprintf (dump_file
, " dist_vector = (");
3846 print_lambda_vector (dump_file
, DDR_DIST_VECT (ddr
, i
),
3847 DDR_NB_LOOPS (ddr
));
3848 fprintf (dump_file
, " )\n");
3850 fprintf (dump_file
, ")\n");
3856 /* Return the direction for a given distance.
3857 FIXME: Computing dir this way is suboptimal, since dir can catch
3858 cases that dist is unable to represent. */
3860 static inline enum data_dependence_direction
3861 dir_from_dist (int dist
)
3864 return dir_positive
;
3866 return dir_negative
;
3871 /* Compute the classic per loop direction vector. DDR is the data
3872 dependence relation to build a vector from. */
3875 build_classic_dir_vector (struct data_dependence_relation
*ddr
)
3878 lambda_vector dist_v
;
3880 for (i
= 0; VEC_iterate (lambda_vector
, DDR_DIST_VECTS (ddr
), i
, dist_v
); i
++)
3882 lambda_vector dir_v
= lambda_vector_new (DDR_NB_LOOPS (ddr
));
3884 for (j
= 0; j
< DDR_NB_LOOPS (ddr
); j
++)
3885 dir_v
[j
] = dir_from_dist (dist_v
[j
]);
3887 save_dir_v (ddr
, dir_v
);
3891 /* Helper function. Returns true when there is a dependence between
3892 data references DRA and DRB. */
3895 subscript_dependence_tester_1 (struct data_dependence_relation
*ddr
,
3896 struct data_reference
*dra
,
3897 struct data_reference
*drb
)
3900 tree last_conflicts
;
3901 struct subscript
*subscript
;
3903 for (i
= 0; VEC_iterate (subscript_p
, DDR_SUBSCRIPTS (ddr
), i
, subscript
);
3906 tree overlaps_a
, overlaps_b
;
3908 analyze_overlapping_iterations (DR_ACCESS_FN (dra
, i
),
3909 DR_ACCESS_FN (drb
, i
),
3910 &overlaps_a
, &overlaps_b
,
3913 if (chrec_contains_undetermined (overlaps_a
)
3914 || chrec_contains_undetermined (overlaps_b
))
3916 finalize_ddr_dependent (ddr
, chrec_dont_know
);
3917 dependence_stats
.num_dependence_undetermined
++;
3921 else if (overlaps_a
== chrec_known
3922 || overlaps_b
== chrec_known
)
3924 finalize_ddr_dependent (ddr
, chrec_known
);
3925 dependence_stats
.num_dependence_independent
++;
3931 SUB_CONFLICTS_IN_A (subscript
) = overlaps_a
;
3932 SUB_CONFLICTS_IN_B (subscript
) = overlaps_b
;
3933 SUB_LAST_CONFLICT (subscript
) = last_conflicts
;
3940 /* Computes the conflicting iterations, and initialize DDR. */
3943 subscript_dependence_tester (struct data_dependence_relation
*ddr
)
3946 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3947 fprintf (dump_file
, "(subscript_dependence_tester \n");
3949 if (subscript_dependence_tester_1 (ddr
, DDR_A (ddr
), DDR_B (ddr
)))
3950 dependence_stats
.num_dependence_dependent
++;
3952 compute_subscript_distance (ddr
);
3953 if (build_classic_dist_vector (ddr
))
3954 build_classic_dir_vector (ddr
);
3956 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3957 fprintf (dump_file
, ")\n");
3960 /* Returns true when all the access functions of A are affine or
3964 access_functions_are_affine_or_constant_p (struct data_reference
*a
)
3967 VEC(tree
,heap
) **fns
= DR_ACCESS_FNS_ADDR (a
);
3970 for (i
= 0; VEC_iterate (tree
, *fns
, i
, t
); i
++)
3971 if (!evolution_function_is_constant_p (t
)
3972 && !evolution_function_is_affine_multivariate_p (t
))
3978 /* This computes the affine dependence relation between A and B.
3979 CHREC_KNOWN is used for representing the independence between two
3980 accesses, while CHREC_DONT_KNOW is used for representing the unknown
3983 Note that it is possible to stop the computation of the dependence
3984 relation the first time we detect a CHREC_KNOWN element for a given
3988 compute_affine_dependence (struct data_dependence_relation
*ddr
)
3990 struct data_reference
*dra
= DDR_A (ddr
);
3991 struct data_reference
*drb
= DDR_B (ddr
);
3993 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3995 fprintf (dump_file
, "(compute_affine_dependence\n");
3996 fprintf (dump_file
, " (stmt_a = \n");
3997 print_generic_expr (dump_file
, DR_STMT (dra
), 0);
3998 fprintf (dump_file
, ")\n (stmt_b = \n");
3999 print_generic_expr (dump_file
, DR_STMT (drb
), 0);
4000 fprintf (dump_file
, ")\n");
4003 /* Analyze only when the dependence relation is not yet known. */
4004 if (DDR_ARE_DEPENDENT (ddr
) == NULL_TREE
)
4006 dependence_stats
.num_dependence_tests
++;
4008 if (access_functions_are_affine_or_constant_p (dra
)
4009 && access_functions_are_affine_or_constant_p (drb
))
4010 subscript_dependence_tester (ddr
);
4012 /* As a last case, if the dependence cannot be determined, or if
4013 the dependence is considered too difficult to determine, answer
4017 dependence_stats
.num_dependence_undetermined
++;
4019 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4021 fprintf (dump_file
, "Data ref a:\n");
4022 dump_data_reference (dump_file
, dra
);
4023 fprintf (dump_file
, "Data ref b:\n");
4024 dump_data_reference (dump_file
, drb
);
4025 fprintf (dump_file
, "affine dependence test not usable: access function not affine or constant.\n");
4027 finalize_ddr_dependent (ddr
, chrec_dont_know
);
4031 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4032 fprintf (dump_file
, ")\n");
4035 /* This computes the dependence relation for the same data
4036 reference into DDR. */
4039 compute_self_dependence (struct data_dependence_relation
*ddr
)
4042 struct subscript
*subscript
;
4044 for (i
= 0; VEC_iterate (subscript_p
, DDR_SUBSCRIPTS (ddr
), i
, subscript
);
4047 /* The accessed index overlaps for each iteration. */
4048 SUB_CONFLICTS_IN_A (subscript
) = integer_zero_node
;
4049 SUB_CONFLICTS_IN_B (subscript
) = integer_zero_node
;
4050 SUB_LAST_CONFLICT (subscript
) = chrec_dont_know
;
4053 /* The distance vector is the zero vector. */
4054 save_dist_v (ddr
, lambda_vector_new (DDR_NB_LOOPS (ddr
)));
4055 save_dir_v (ddr
, lambda_vector_new (DDR_NB_LOOPS (ddr
)));
4058 /* Compute in DEPENDENCE_RELATIONS the data dependence graph for all
4059 the data references in DATAREFS, in the LOOP_NEST. When
4060 COMPUTE_SELF_AND_RR is FALSE, don't compute read-read and self
4064 compute_all_dependences (VEC (data_reference_p
, heap
) *datarefs
,
4065 VEC (ddr_p
, heap
) **dependence_relations
,
4066 VEC (loop_p
, heap
) *loop_nest
,
4067 bool compute_self_and_rr
)
4069 struct data_dependence_relation
*ddr
;
4070 struct data_reference
*a
, *b
;
4073 for (i
= 0; VEC_iterate (data_reference_p
, datarefs
, i
, a
); i
++)
4074 for (j
= i
+ 1; VEC_iterate (data_reference_p
, datarefs
, j
, b
); j
++)
4075 if (!DR_IS_READ (a
) || !DR_IS_READ (b
) || compute_self_and_rr
)
4077 ddr
= initialize_data_dependence_relation (a
, b
, loop_nest
);
4078 VEC_safe_push (ddr_p
, heap
, *dependence_relations
, ddr
);
4079 compute_affine_dependence (ddr
);
4082 if (compute_self_and_rr
)
4083 for (i
= 0; VEC_iterate (data_reference_p
, datarefs
, i
, a
); i
++)
4085 ddr
= initialize_data_dependence_relation (a
, a
, loop_nest
);
4086 VEC_safe_push (ddr_p
, heap
, *dependence_relations
, ddr
);
4087 compute_self_dependence (ddr
);
4091 /* Search the data references in LOOP, and record the information into
4092 DATAREFS. Returns chrec_dont_know when failing to analyze a
4093 difficult case, returns NULL_TREE otherwise.
4095 TODO: This function should be made smarter so that it can handle address
4096 arithmetic as if they were array accesses, etc. */
4099 find_data_references_in_loop (struct loop
*loop
,
4100 VEC (data_reference_p
, heap
) **datarefs
)
4102 basic_block bb
, *bbs
;
4104 block_stmt_iterator bsi
;
4105 struct data_reference
*dr
;
4107 bbs
= get_loop_body (loop
);
4109 for (i
= 0; i
< loop
->num_nodes
; i
++)
4113 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
4115 tree stmt
= bsi_stmt (bsi
);
4117 /* ASM_EXPR and CALL_EXPR may embed arbitrary side effects.
4118 Calls have side-effects, except those to const or pure
4120 if ((TREE_CODE (stmt
) == CALL_EXPR
4121 && !(call_expr_flags (stmt
) & (ECF_CONST
| ECF_PURE
)))
4122 || (TREE_CODE (stmt
) == ASM_EXPR
4123 && ASM_VOLATILE_P (stmt
)))
4124 goto insert_dont_know_node
;
4126 if (ZERO_SSA_OPERANDS (stmt
, SSA_OP_ALL_VIRTUALS
))
4129 switch (TREE_CODE (stmt
))
4133 bool one_inserted
= false;
4134 tree opnd0
= TREE_OPERAND (stmt
, 0);
4135 tree opnd1
= TREE_OPERAND (stmt
, 1);
4137 if (TREE_CODE (opnd0
) == ARRAY_REF
4138 || TREE_CODE (opnd0
) == INDIRECT_REF
4139 || TREE_CODE (opnd0
) == COMPONENT_REF
)
4141 dr
= create_data_ref (opnd0
, stmt
, false);
4144 VEC_safe_push (data_reference_p
, heap
, *datarefs
, dr
);
4145 one_inserted
= true;
4149 if (TREE_CODE (opnd1
) == ARRAY_REF
4150 || TREE_CODE (opnd1
) == INDIRECT_REF
4151 || TREE_CODE (opnd1
) == COMPONENT_REF
)
4153 dr
= create_data_ref (opnd1
, stmt
, true);
4156 VEC_safe_push (data_reference_p
, heap
, *datarefs
, dr
);
4157 one_inserted
= true;
4162 goto insert_dont_know_node
;
4170 bool one_inserted
= false;
4172 for (args
= TREE_OPERAND (stmt
, 1); args
;
4173 args
= TREE_CHAIN (args
))
4174 if (TREE_CODE (TREE_VALUE (args
)) == ARRAY_REF
4175 || TREE_CODE (TREE_VALUE (args
)) == INDIRECT_REF
4176 || TREE_CODE (TREE_VALUE (args
)) == COMPONENT_REF
)
4178 dr
= create_data_ref (TREE_VALUE (args
), stmt
, true);
4181 VEC_safe_push (data_reference_p
, heap
, *datarefs
, dr
);
4182 one_inserted
= true;
4187 goto insert_dont_know_node
;
4194 struct data_reference
*res
;
4196 insert_dont_know_node
:;
4197 res
= XNEW (struct data_reference
);
4198 DR_STMT (res
) = NULL_TREE
;
4199 DR_REF (res
) = NULL_TREE
;
4200 DR_BASE_OBJECT (res
) = NULL
;
4201 DR_TYPE (res
) = ARRAY_REF_TYPE
;
4202 DR_SET_ACCESS_FNS (res
, NULL
);
4203 DR_BASE_OBJECT (res
) = NULL
;
4204 DR_IS_READ (res
) = false;
4205 DR_BASE_ADDRESS (res
) = NULL_TREE
;
4206 DR_OFFSET (res
) = NULL_TREE
;
4207 DR_INIT (res
) = NULL_TREE
;
4208 DR_STEP (res
) = NULL_TREE
;
4209 DR_OFFSET_MISALIGNMENT (res
) = NULL_TREE
;
4210 DR_MEMTAG (res
) = NULL_TREE
;
4211 DR_PTR_INFO (res
) = NULL
;
4212 VEC_safe_push (data_reference_p
, heap
, *datarefs
, res
);
4215 return chrec_dont_know
;
4219 /* When there are no defs in the loop, the loop is parallel. */
4220 if (!ZERO_SSA_OPERANDS (stmt
, SSA_OP_VIRTUAL_DEFS
))
4221 loop
->parallel_p
= false;
4230 /* Recursive helper function. */
4233 find_loop_nest_1 (struct loop
*loop
, VEC (loop_p
, heap
) **loop_nest
)
4235 /* Inner loops of the nest should not contain siblings. Example:
4236 when there are two consecutive loops,
4247 the dependence relation cannot be captured by the distance
4252 VEC_safe_push (loop_p
, heap
, *loop_nest
, loop
);
4254 return find_loop_nest_1 (loop
->inner
, loop_nest
);
4258 /* Return false when the LOOP is not well nested. Otherwise return
4259 true and insert in LOOP_NEST the loops of the nest. LOOP_NEST will
4260 contain the loops from the outermost to the innermost, as they will
4261 appear in the classic distance vector. */
4264 find_loop_nest (struct loop
*loop
, VEC (loop_p
, heap
) **loop_nest
)
4266 VEC_safe_push (loop_p
, heap
, *loop_nest
, loop
);
4268 return find_loop_nest_1 (loop
->inner
, loop_nest
);
4272 /* Given a loop nest LOOP, the following vectors are returned:
4273 DATAREFS is initialized to all the array elements contained in this loop,
4274 DEPENDENCE_RELATIONS contains the relations between the data references.
4275 Compute read-read and self relations if
4276 COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE. */
4279 compute_data_dependences_for_loop (struct loop
*loop
,
4280 bool compute_self_and_read_read_dependences
,
4281 VEC (data_reference_p
, heap
) **datarefs
,
4282 VEC (ddr_p
, heap
) **dependence_relations
)
4284 struct loop
*loop_nest
= loop
;
4285 VEC (loop_p
, heap
) *vloops
= VEC_alloc (loop_p
, heap
, 3);
4287 memset (&dependence_stats
, 0, sizeof (dependence_stats
));
4289 /* If the loop nest is not well formed, or one of the data references
4290 is not computable, give up without spending time to compute other
4293 || !find_loop_nest (loop_nest
, &vloops
)
4294 || find_data_references_in_loop (loop
, datarefs
) == chrec_dont_know
)
4296 struct data_dependence_relation
*ddr
;
4298 /* Insert a single relation into dependence_relations:
4300 ddr
= initialize_data_dependence_relation (NULL
, NULL
, vloops
);
4301 VEC_safe_push (ddr_p
, heap
, *dependence_relations
, ddr
);
4304 compute_all_dependences (*datarefs
, dependence_relations
, vloops
,
4305 compute_self_and_read_read_dependences
);
4307 if (dump_file
&& (dump_flags
& TDF_STATS
))
4309 fprintf (dump_file
, "Dependence tester statistics:\n");
4311 fprintf (dump_file
, "Number of dependence tests: %d\n",
4312 dependence_stats
.num_dependence_tests
);
4313 fprintf (dump_file
, "Number of dependence tests classified dependent: %d\n",
4314 dependence_stats
.num_dependence_dependent
);
4315 fprintf (dump_file
, "Number of dependence tests classified independent: %d\n",
4316 dependence_stats
.num_dependence_independent
);
4317 fprintf (dump_file
, "Number of undetermined dependence tests: %d\n",
4318 dependence_stats
.num_dependence_undetermined
);
4320 fprintf (dump_file
, "Number of subscript tests: %d\n",
4321 dependence_stats
.num_subscript_tests
);
4322 fprintf (dump_file
, "Number of undetermined subscript tests: %d\n",
4323 dependence_stats
.num_subscript_undetermined
);
4324 fprintf (dump_file
, "Number of same subscript function: %d\n",
4325 dependence_stats
.num_same_subscript_function
);
4327 fprintf (dump_file
, "Number of ziv tests: %d\n",
4328 dependence_stats
.num_ziv
);
4329 fprintf (dump_file
, "Number of ziv tests returning dependent: %d\n",
4330 dependence_stats
.num_ziv_dependent
);
4331 fprintf (dump_file
, "Number of ziv tests returning independent: %d\n",
4332 dependence_stats
.num_ziv_independent
);
4333 fprintf (dump_file
, "Number of ziv tests unimplemented: %d\n",
4334 dependence_stats
.num_ziv_unimplemented
);
4336 fprintf (dump_file
, "Number of siv tests: %d\n",
4337 dependence_stats
.num_siv
);
4338 fprintf (dump_file
, "Number of siv tests returning dependent: %d\n",
4339 dependence_stats
.num_siv_dependent
);
4340 fprintf (dump_file
, "Number of siv tests returning independent: %d\n",
4341 dependence_stats
.num_siv_independent
);
4342 fprintf (dump_file
, "Number of siv tests unimplemented: %d\n",
4343 dependence_stats
.num_siv_unimplemented
);
4345 fprintf (dump_file
, "Number of miv tests: %d\n",
4346 dependence_stats
.num_miv
);
4347 fprintf (dump_file
, "Number of miv tests returning dependent: %d\n",
4348 dependence_stats
.num_miv_dependent
);
4349 fprintf (dump_file
, "Number of miv tests returning independent: %d\n",
4350 dependence_stats
.num_miv_independent
);
4351 fprintf (dump_file
, "Number of miv tests unimplemented: %d\n",
4352 dependence_stats
.num_miv_unimplemented
);
4356 /* Entry point (for testing only). Analyze all the data references
4357 and the dependence relations.
4359 The data references are computed first.
4361 A relation on these nodes is represented by a complete graph. Some
4362 of the relations could be of no interest, thus the relations can be
4365 In the following function we compute all the relations. This is
4366 just a first implementation that is here for:
4367 - for showing how to ask for the dependence relations,
4368 - for the debugging the whole dependence graph,
4369 - for the dejagnu testcases and maintenance.
4371 It is possible to ask only for a part of the graph, avoiding to
4372 compute the whole dependence graph. The computed dependences are
4373 stored in a knowledge base (KB) such that later queries don't
4374 recompute the same information. The implementation of this KB is
4375 transparent to the optimizer, and thus the KB can be changed with a
4376 more efficient implementation, or the KB could be disabled. */
4379 analyze_all_data_dependences (struct loops
*loops
)
4382 int nb_data_refs
= 10;
4383 VEC (data_reference_p
, heap
) *datarefs
=
4384 VEC_alloc (data_reference_p
, heap
, nb_data_refs
);
4385 VEC (ddr_p
, heap
) *dependence_relations
=
4386 VEC_alloc (ddr_p
, heap
, nb_data_refs
* nb_data_refs
);
4388 /* Compute DDs on the whole function. */
4389 compute_data_dependences_for_loop (loops
->parray
[0], false,
4390 &datarefs
, &dependence_relations
);
4394 dump_data_dependence_relations (dump_file
, dependence_relations
);
4395 fprintf (dump_file
, "\n\n");
4397 if (dump_flags
& TDF_DETAILS
)
4398 dump_dist_dir_vectors (dump_file
, dependence_relations
);
4400 if (dump_flags
& TDF_STATS
)
4402 unsigned nb_top_relations
= 0;
4403 unsigned nb_bot_relations
= 0;
4404 unsigned nb_basename_differ
= 0;
4405 unsigned nb_chrec_relations
= 0;
4406 struct data_dependence_relation
*ddr
;
4408 for (i
= 0; VEC_iterate (ddr_p
, dependence_relations
, i
, ddr
); i
++)
4410 if (chrec_contains_undetermined (DDR_ARE_DEPENDENT (ddr
)))
4413 else if (DDR_ARE_DEPENDENT (ddr
) == chrec_known
)
4415 struct data_reference
*a
= DDR_A (ddr
);
4416 struct data_reference
*b
= DDR_B (ddr
);
4419 if ((DR_BASE_OBJECT (a
) && DR_BASE_OBJECT (b
)
4420 && DR_NUM_DIMENSIONS (a
) != DR_NUM_DIMENSIONS (b
))
4421 || (base_object_differ_p (a
, b
, &differ_p
)
4423 nb_basename_differ
++;
4429 nb_chrec_relations
++;
4432 gather_stats_on_scev_database ();
4436 free_dependence_relations (dependence_relations
);
4437 free_data_refs (datarefs
);
4441 /* Free the memory used by a data dependence relation DDR. */
4444 free_dependence_relation (struct data_dependence_relation
*ddr
)
4449 if (DDR_ARE_DEPENDENT (ddr
) == NULL_TREE
&& DDR_SUBSCRIPTS (ddr
))
4450 VEC_free (subscript_p
, heap
, DDR_SUBSCRIPTS (ddr
));
4455 /* Free the memory used by the data dependence relations from
4456 DEPENDENCE_RELATIONS. */
4459 free_dependence_relations (VEC (ddr_p
, heap
) *dependence_relations
)
4462 struct data_dependence_relation
*ddr
;
4463 VEC (loop_p
, heap
) *loop_nest
= NULL
;
4465 for (i
= 0; VEC_iterate (ddr_p
, dependence_relations
, i
, ddr
); i
++)
4469 if (loop_nest
== NULL
)
4470 loop_nest
= DDR_LOOP_NEST (ddr
);
4472 gcc_assert (DDR_LOOP_NEST (ddr
) == NULL
4473 || DDR_LOOP_NEST (ddr
) == loop_nest
);
4474 free_dependence_relation (ddr
);
4478 VEC_free (loop_p
, heap
, loop_nest
);
4479 VEC_free (ddr_p
, heap
, dependence_relations
);
4482 /* Free the memory used by the data references from DATAREFS. */
4485 free_data_refs (VEC (data_reference_p
, heap
) *datarefs
)
4488 struct data_reference
*dr
;
4490 for (i
= 0; VEC_iterate (data_reference_p
, datarefs
, i
, dr
); i
++)
4492 VEC_free (data_reference_p
, heap
, datarefs
);