* config/rs6000/darwin.h (ALWAYS_PUSH_CONSTS_USING_REGS_P): Remove.
[official-gcc.git] / gcc / tree-data-ref.c
blobac5aa50ebbdeaa6df1954735423e7ba7f6b4c6f0
1 /* Data references and dependences detectors.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <pop@cri.ensmp.fr>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
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:
41 - distance vectors
42 - direction vectors
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
48 information,
50 - to define an interface to access this data.
53 Definitions:
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
62 | 3*x + 2*y = 1
63 has an integer solution x = 1 and y = -1.
65 References:
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"
72 by Utpal Banerjee.
77 #include "config.h"
78 #include "system.h"
79 #include "coretypes.h"
80 #include "tm.h"
81 #include "ggc.h"
82 #include "tree.h"
84 /* These RTL headers are needed for basic-block.h. */
85 #include "rtl.h"
86 #include "basic-block.h"
87 #include "diagnostic.h"
88 #include "tree-flow.h"
89 #include "tree-dump.h"
90 #include "timevar.h"
91 #include "cfgloop.h"
92 #include "tree-chrec.h"
93 #include "tree-data-ref.h"
94 #include "tree-scalar-evolution.h"
95 #include "tree-pass.h"
96 #include "langhooks.h"
98 static struct datadep_stats
100 int num_dependence_tests;
101 int num_dependence_dependent;
102 int num_dependence_independent;
103 int num_dependence_undetermined;
105 int num_subscript_tests;
106 int num_subscript_undetermined;
107 int num_same_subscript_function;
109 int num_ziv;
110 int num_ziv_independent;
111 int num_ziv_dependent;
112 int num_ziv_unimplemented;
114 int num_siv;
115 int num_siv_independent;
116 int num_siv_dependent;
117 int num_siv_unimplemented;
119 int num_miv;
120 int num_miv_independent;
121 int num_miv_dependent;
122 int num_miv_unimplemented;
123 } dependence_stats;
125 static tree object_analysis (tree, tree, bool, struct data_reference **,
126 tree *, tree *, tree *, tree *, tree *,
127 struct ptr_info_def **, subvar_t *);
128 static bool subscript_dependence_tester_1 (struct data_dependence_relation *,
129 struct data_reference *,
130 struct data_reference *);
132 /* Determine if PTR and DECL may alias, the result is put in ALIASED.
133 Return FALSE if there is no symbol memory tag for PTR. */
135 static bool
136 ptr_decl_may_alias_p (tree ptr, tree decl,
137 struct data_reference *ptr_dr,
138 bool *aliased)
140 tree tag = NULL_TREE;
141 struct ptr_info_def *pi = DR_PTR_INFO (ptr_dr);
143 gcc_assert (TREE_CODE (ptr) == SSA_NAME && DECL_P (decl));
145 if (pi)
146 tag = pi->name_mem_tag;
147 if (!tag)
148 tag = symbol_mem_tag (SSA_NAME_VAR (ptr));
149 if (!tag)
150 tag = DR_MEMTAG (ptr_dr);
151 if (!tag)
152 return false;
154 *aliased = is_aliased_with (tag, decl);
155 return true;
159 /* Determine if two pointers may alias, the result is put in ALIASED.
160 Return FALSE if there is no symbol memory tag for one of the pointers. */
162 static bool
163 ptr_ptr_may_alias_p (tree ptr_a, tree ptr_b,
164 struct data_reference *dra,
165 struct data_reference *drb,
166 bool *aliased)
168 tree tag_a = NULL_TREE, tag_b = NULL_TREE;
169 struct ptr_info_def *pi_a = DR_PTR_INFO (dra);
170 struct ptr_info_def *pi_b = DR_PTR_INFO (drb);
171 bitmap bal1, bal2;
173 if (pi_a && pi_a->name_mem_tag && pi_b && pi_b->name_mem_tag)
175 tag_a = pi_a->name_mem_tag;
176 tag_b = pi_b->name_mem_tag;
178 else
180 tag_a = symbol_mem_tag (SSA_NAME_VAR (ptr_a));
181 if (!tag_a)
182 tag_a = DR_MEMTAG (dra);
183 if (!tag_a)
184 return false;
186 tag_b = symbol_mem_tag (SSA_NAME_VAR (ptr_b));
187 if (!tag_b)
188 tag_b = DR_MEMTAG (drb);
189 if (!tag_b)
190 return false;
192 bal1 = BITMAP_ALLOC (NULL);
193 bitmap_set_bit (bal1, DECL_UID (tag_a));
194 if (MTAG_P (tag_a) && MTAG_ALIASES (tag_a))
195 bitmap_ior_into (bal1, MTAG_ALIASES (tag_a));
197 bal2 = BITMAP_ALLOC (NULL);
198 bitmap_set_bit (bal2, DECL_UID (tag_b));
199 if (MTAG_P (tag_b) && MTAG_ALIASES (tag_b))
200 bitmap_ior_into (bal2, MTAG_ALIASES (tag_b));
201 *aliased = bitmap_intersect_p (bal1, bal2);
203 BITMAP_FREE (bal1);
204 BITMAP_FREE (bal2);
205 return true;
209 /* Determine if BASE_A and BASE_B may alias, the result is put in ALIASED.
210 Return FALSE if there is no symbol memory tag for one of the symbols. */
212 static bool
213 may_alias_p (tree base_a, tree base_b,
214 struct data_reference *dra,
215 struct data_reference *drb,
216 bool *aliased)
218 if (TREE_CODE (base_a) == ADDR_EXPR || TREE_CODE (base_b) == ADDR_EXPR)
220 if (TREE_CODE (base_a) == ADDR_EXPR && TREE_CODE (base_b) == ADDR_EXPR)
222 *aliased = (TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0));
223 return true;
225 if (TREE_CODE (base_a) == ADDR_EXPR)
226 return ptr_decl_may_alias_p (base_b, TREE_OPERAND (base_a, 0), drb,
227 aliased);
228 else
229 return ptr_decl_may_alias_p (base_a, TREE_OPERAND (base_b, 0), dra,
230 aliased);
233 return ptr_ptr_may_alias_p (base_a, base_b, dra, drb, aliased);
237 /* Determine if a pointer (BASE_A) and a record/union access (BASE_B)
238 are not aliased. Return TRUE if they differ. */
239 static bool
240 record_ptr_differ_p (struct data_reference *dra,
241 struct data_reference *drb)
243 bool aliased;
244 tree base_a = DR_BASE_OBJECT (dra);
245 tree base_b = DR_BASE_OBJECT (drb);
247 if (TREE_CODE (base_b) != COMPONENT_REF)
248 return false;
250 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
251 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
252 Probably will be unnecessary with struct alias analysis. */
253 while (TREE_CODE (base_b) == COMPONENT_REF)
254 base_b = TREE_OPERAND (base_b, 0);
255 /* Compare a record/union access (b.c[i] or p->c[i]) and a pointer
256 ((*q)[i]). */
257 if (TREE_CODE (base_a) == INDIRECT_REF
258 && ((TREE_CODE (base_b) == VAR_DECL
259 && (ptr_decl_may_alias_p (TREE_OPERAND (base_a, 0), base_b, dra,
260 &aliased)
261 && !aliased))
262 || (TREE_CODE (base_b) == INDIRECT_REF
263 && (ptr_ptr_may_alias_p (TREE_OPERAND (base_a, 0),
264 TREE_OPERAND (base_b, 0), dra, drb,
265 &aliased)
266 && !aliased))))
267 return true;
268 else
269 return false;
272 /* Determine if two record/union accesses are aliased. Return TRUE if they
273 differ. */
274 static bool
275 record_record_differ_p (struct data_reference *dra,
276 struct data_reference *drb)
278 bool aliased;
279 tree base_a = DR_BASE_OBJECT (dra);
280 tree base_b = DR_BASE_OBJECT (drb);
282 if (TREE_CODE (base_b) != COMPONENT_REF
283 || TREE_CODE (base_a) != COMPONENT_REF)
284 return false;
286 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
287 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
288 Probably will be unnecessary with struct alias analysis. */
289 while (TREE_CODE (base_b) == COMPONENT_REF)
290 base_b = TREE_OPERAND (base_b, 0);
291 while (TREE_CODE (base_a) == COMPONENT_REF)
292 base_a = TREE_OPERAND (base_a, 0);
294 if (TREE_CODE (base_a) == INDIRECT_REF
295 && TREE_CODE (base_b) == INDIRECT_REF
296 && ptr_ptr_may_alias_p (TREE_OPERAND (base_a, 0),
297 TREE_OPERAND (base_b, 0),
298 dra, drb, &aliased)
299 && !aliased)
300 return true;
301 else
302 return false;
305 /* Determine if an array access (BASE_A) and a record/union access (BASE_B)
306 are not aliased. Return TRUE if they differ. */
307 static bool
308 record_array_differ_p (struct data_reference *dra,
309 struct data_reference *drb)
311 bool aliased;
312 tree base_a = DR_BASE_OBJECT (dra);
313 tree base_b = DR_BASE_OBJECT (drb);
315 if (TREE_CODE (base_b) != COMPONENT_REF)
316 return false;
318 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
319 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
320 Probably will be unnecessary with struct alias analysis. */
321 while (TREE_CODE (base_b) == COMPONENT_REF)
322 base_b = TREE_OPERAND (base_b, 0);
324 /* Compare a record/union access (b.c[i] or p->c[i]) and an array access
325 (a[i]). In case of p->c[i] use alias analysis to verify that p is not
326 pointing to a. */
327 if (TREE_CODE (base_a) == VAR_DECL
328 && (TREE_CODE (base_b) == VAR_DECL
329 || (TREE_CODE (base_b) == INDIRECT_REF
330 && (ptr_decl_may_alias_p (TREE_OPERAND (base_b, 0), base_a, drb,
331 &aliased)
332 && !aliased))))
333 return true;
334 else
335 return false;
339 /* Determine if an array access (BASE_A) and a pointer (BASE_B)
340 are not aliased. Return TRUE if they differ. */
341 static bool
342 array_ptr_differ_p (tree base_a, tree base_b,
343 struct data_reference *drb)
345 bool aliased;
347 /* In case one of the bases is a pointer (a[i] and (*p)[i]), we check with the
348 help of alias analysis that p is not pointing to a. */
349 if (TREE_CODE (base_a) == VAR_DECL && TREE_CODE (base_b) == INDIRECT_REF
350 && (ptr_decl_may_alias_p (TREE_OPERAND (base_b, 0), base_a, drb, &aliased)
351 && !aliased))
352 return true;
353 else
354 return false;
358 /* This is the simplest data dependence test: determines whether the
359 data references A and B access the same array/region. Returns
360 false when the property is not computable at compile time.
361 Otherwise return true, and DIFFER_P will record the result. This
362 utility will not be necessary when alias_sets_conflict_p will be
363 less conservative. */
365 static bool
366 base_object_differ_p (struct data_reference *a,
367 struct data_reference *b,
368 bool *differ_p)
370 tree base_a = DR_BASE_OBJECT (a);
371 tree base_b = DR_BASE_OBJECT (b);
372 bool aliased;
374 if (!base_a || !base_b)
375 return false;
377 /* Determine if same base. Example: for the array accesses
378 a[i], b[i] or pointer accesses *a, *b, bases are a, b. */
379 if (base_a == base_b)
381 *differ_p = false;
382 return true;
385 /* For pointer based accesses, (*p)[i], (*q)[j], the bases are (*p)
386 and (*q) */
387 if (TREE_CODE (base_a) == INDIRECT_REF && TREE_CODE (base_b) == INDIRECT_REF
388 && TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0))
390 *differ_p = false;
391 return true;
394 /* Record/union based accesses - s.a[i], t.b[j]. bases are s.a,t.b. */
395 if (TREE_CODE (base_a) == COMPONENT_REF && TREE_CODE (base_b) == COMPONENT_REF
396 && TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0)
397 && TREE_OPERAND (base_a, 1) == TREE_OPERAND (base_b, 1))
399 *differ_p = false;
400 return true;
404 /* Determine if different bases. */
406 /* At this point we know that base_a != base_b. However, pointer
407 accesses of the form x=(*p) and y=(*q), whose bases are p and q,
408 may still be pointing to the same base. In SSAed GIMPLE p and q will
409 be SSA_NAMES in this case. Therefore, here we check if they are
410 really two different declarations. */
411 if (TREE_CODE (base_a) == VAR_DECL && TREE_CODE (base_b) == VAR_DECL)
413 *differ_p = true;
414 return true;
417 /* In case one of the bases is a pointer (a[i] and (*p)[i]), we check with the
418 help of alias analysis that p is not pointing to a. */
419 if (array_ptr_differ_p (base_a, base_b, b)
420 || array_ptr_differ_p (base_b, base_a, a))
422 *differ_p = true;
423 return true;
426 /* If the bases are pointers ((*q)[i] and (*p)[i]), we check with the
427 help of alias analysis they don't point to the same bases. */
428 if (TREE_CODE (base_a) == INDIRECT_REF && TREE_CODE (base_b) == INDIRECT_REF
429 && (may_alias_p (TREE_OPERAND (base_a, 0), TREE_OPERAND (base_b, 0), a, b,
430 &aliased)
431 && !aliased))
433 *differ_p = true;
434 return true;
437 /* Compare two record/union bases s.a and t.b: s != t or (a != b and
438 s and t are not unions). */
439 if (TREE_CODE (base_a) == COMPONENT_REF && TREE_CODE (base_b) == COMPONENT_REF
440 && ((TREE_CODE (TREE_OPERAND (base_a, 0)) == VAR_DECL
441 && TREE_CODE (TREE_OPERAND (base_b, 0)) == VAR_DECL
442 && TREE_OPERAND (base_a, 0) != TREE_OPERAND (base_b, 0))
443 || (TREE_CODE (TREE_TYPE (TREE_OPERAND (base_a, 0))) == RECORD_TYPE
444 && TREE_CODE (TREE_TYPE (TREE_OPERAND (base_b, 0))) == RECORD_TYPE
445 && TREE_OPERAND (base_a, 1) != TREE_OPERAND (base_b, 1))))
447 *differ_p = true;
448 return true;
451 /* Compare a record/union access (b.c[i] or p->c[i]) and a pointer
452 ((*q)[i]). */
453 if (record_ptr_differ_p (a, b) || record_ptr_differ_p (b, a))
455 *differ_p = true;
456 return true;
459 /* Compare a record/union access (b.c[i] or p->c[i]) and an array access
460 (a[i]). In case of p->c[i] use alias analysis to verify that p is not
461 pointing to a. */
462 if (record_array_differ_p (a, b) || record_array_differ_p (b, a))
464 *differ_p = true;
465 return true;
468 /* Compare two record/union accesses (b.c[i] or p->c[i]). */
469 if (record_record_differ_p (a, b))
471 *differ_p = true;
472 return true;
475 return false;
478 /* Function base_addr_differ_p.
480 This is the simplest data dependence test: determines whether the
481 data references DRA and DRB access the same array/region. Returns
482 false when the property is not computable at compile time.
483 Otherwise return true, and DIFFER_P will record the result.
485 The algorithm:
486 1. if (both DRA and DRB are represented as arrays)
487 compare DRA.BASE_OBJECT and DRB.BASE_OBJECT
488 2. else if (both DRA and DRB are represented as pointers)
489 try to prove that DRA.FIRST_LOCATION == DRB.FIRST_LOCATION
490 3. else if (DRA and DRB are represented differently or 2. fails)
491 only try to prove that the bases are surely different
494 static bool
495 base_addr_differ_p (struct data_reference *dra,
496 struct data_reference *drb,
497 bool *differ_p)
499 tree addr_a = DR_BASE_ADDRESS (dra);
500 tree addr_b = DR_BASE_ADDRESS (drb);
501 tree type_a, type_b;
502 tree decl_a, decl_b;
503 bool aliased;
505 if (!addr_a || !addr_b)
506 return false;
508 type_a = TREE_TYPE (addr_a);
509 type_b = TREE_TYPE (addr_b);
511 gcc_assert (POINTER_TYPE_P (type_a) && POINTER_TYPE_P (type_b));
513 /* 1. if (both DRA and DRB are represented as arrays)
514 compare DRA.BASE_OBJECT and DRB.BASE_OBJECT. */
515 if (DR_TYPE (dra) == ARRAY_REF_TYPE && DR_TYPE (drb) == ARRAY_REF_TYPE)
516 return base_object_differ_p (dra, drb, differ_p);
518 /* 2. else if (both DRA and DRB are represented as pointers)
519 try to prove that DRA.FIRST_LOCATION == DRB.FIRST_LOCATION. */
520 /* If base addresses are the same, we check the offsets, since the access of
521 the data-ref is described by {base addr + offset} and its access function,
522 i.e., in order to decide whether the bases of data-refs are the same we
523 compare both base addresses and offsets. */
524 if (DR_TYPE (dra) == POINTER_REF_TYPE && DR_TYPE (drb) == POINTER_REF_TYPE
525 && (addr_a == addr_b
526 || (TREE_CODE (addr_a) == ADDR_EXPR && TREE_CODE (addr_b) == ADDR_EXPR
527 && TREE_OPERAND (addr_a, 0) == TREE_OPERAND (addr_b, 0))))
529 /* Compare offsets. */
530 tree offset_a = DR_OFFSET (dra);
531 tree offset_b = DR_OFFSET (drb);
533 STRIP_NOPS (offset_a);
534 STRIP_NOPS (offset_b);
536 /* FORNOW: we only compare offsets that are MULT_EXPR, i.e., we don't handle
537 PLUS_EXPR. */
538 if (offset_a == offset_b
539 || (TREE_CODE (offset_a) == MULT_EXPR
540 && TREE_CODE (offset_b) == MULT_EXPR
541 && TREE_OPERAND (offset_a, 0) == TREE_OPERAND (offset_b, 0)
542 && TREE_OPERAND (offset_a, 1) == TREE_OPERAND (offset_b, 1)))
544 *differ_p = false;
545 return true;
549 /* 3. else if (DRA and DRB are represented differently or 2. fails)
550 only try to prove that the bases are surely different. */
552 /* Apply alias analysis. */
553 if (may_alias_p (addr_a, addr_b, dra, drb, &aliased) && !aliased)
555 *differ_p = true;
556 return true;
559 /* An instruction writing through a restricted pointer is "independent" of any
560 instruction reading or writing through a different restricted pointer,
561 in the same block/scope. */
562 else if (TYPE_RESTRICT (type_a)
563 && TYPE_RESTRICT (type_b)
564 && (!DR_IS_READ (drb) || !DR_IS_READ (dra))
565 && TREE_CODE (DR_BASE_ADDRESS (dra)) == SSA_NAME
566 && (decl_a = SSA_NAME_VAR (DR_BASE_ADDRESS (dra)))
567 && TREE_CODE (decl_a) == PARM_DECL
568 && TREE_CODE (DECL_CONTEXT (decl_a)) == FUNCTION_DECL
569 && TREE_CODE (DR_BASE_ADDRESS (drb)) == SSA_NAME
570 && (decl_b = SSA_NAME_VAR (DR_BASE_ADDRESS (drb)))
571 && TREE_CODE (decl_b) == PARM_DECL
572 && TREE_CODE (DECL_CONTEXT (decl_b)) == FUNCTION_DECL
573 && DECL_CONTEXT (decl_a) == DECL_CONTEXT (decl_b))
575 *differ_p = true;
576 return true;
579 return false;
582 /* Returns true iff A divides B. */
584 static inline bool
585 tree_fold_divides_p (tree a, tree b)
587 gcc_assert (TREE_CODE (a) == INTEGER_CST);
588 gcc_assert (TREE_CODE (b) == INTEGER_CST);
589 return integer_zerop (int_const_binop (TRUNC_MOD_EXPR, b, a, 0));
592 /* Returns true iff A divides B. */
594 static inline bool
595 int_divides_p (int a, int b)
597 return ((b % a) == 0);
602 /* Dump into FILE all the data references from DATAREFS. */
604 void
605 dump_data_references (FILE *file, VEC (data_reference_p, heap) *datarefs)
607 unsigned int i;
608 struct data_reference *dr;
610 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
611 dump_data_reference (file, dr);
614 /* Dump into FILE all the dependence relations from DDRS. */
616 void
617 dump_data_dependence_relations (FILE *file,
618 VEC (ddr_p, heap) *ddrs)
620 unsigned int i;
621 struct data_dependence_relation *ddr;
623 for (i = 0; VEC_iterate (ddr_p, ddrs, i, ddr); i++)
624 dump_data_dependence_relation (file, ddr);
627 /* Dump function for a DATA_REFERENCE structure. */
629 void
630 dump_data_reference (FILE *outf,
631 struct data_reference *dr)
633 unsigned int i;
635 fprintf (outf, "(Data Ref: \n stmt: ");
636 print_generic_stmt (outf, DR_STMT (dr), 0);
637 fprintf (outf, " ref: ");
638 print_generic_stmt (outf, DR_REF (dr), 0);
639 fprintf (outf, " base_object: ");
640 print_generic_stmt (outf, DR_BASE_OBJECT (dr), 0);
642 for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
644 fprintf (outf, " Access function %d: ", i);
645 print_generic_stmt (outf, DR_ACCESS_FN (dr, i), 0);
647 fprintf (outf, ")\n");
650 /* Dumps the affine function described by FN to the file OUTF. */
652 static void
653 dump_affine_function (FILE *outf, affine_fn fn)
655 unsigned i;
656 tree coef;
658 print_generic_expr (outf, VEC_index (tree, fn, 0), TDF_SLIM);
659 for (i = 1; VEC_iterate (tree, fn, i, coef); i++)
661 fprintf (outf, " + ");
662 print_generic_expr (outf, coef, TDF_SLIM);
663 fprintf (outf, " * x_%u", i);
667 /* Dumps the conflict function CF to the file OUTF. */
669 static void
670 dump_conflict_function (FILE *outf, conflict_function *cf)
672 unsigned i;
674 if (cf->n == NO_DEPENDENCE)
675 fprintf (outf, "no dependence\n");
676 else if (cf->n == NOT_KNOWN)
677 fprintf (outf, "not known\n");
678 else
680 for (i = 0; i < cf->n; i++)
682 fprintf (outf, "[");
683 dump_affine_function (outf, cf->fns[i]);
684 fprintf (outf, "]\n");
689 /* Dump function for a SUBSCRIPT structure. */
691 void
692 dump_subscript (FILE *outf, struct subscript *subscript)
694 conflict_function *cf = SUB_CONFLICTS_IN_A (subscript);
696 fprintf (outf, "\n (subscript \n");
697 fprintf (outf, " iterations_that_access_an_element_twice_in_A: ");
698 dump_conflict_function (outf, cf);
699 if (CF_NONTRIVIAL_P (cf))
701 tree last_iteration = SUB_LAST_CONFLICT (subscript);
702 fprintf (outf, " last_conflict: ");
703 print_generic_stmt (outf, last_iteration, 0);
706 cf = SUB_CONFLICTS_IN_B (subscript);
707 fprintf (outf, " iterations_that_access_an_element_twice_in_B: ");
708 dump_conflict_function (outf, cf);
709 if (CF_NONTRIVIAL_P (cf))
711 tree last_iteration = SUB_LAST_CONFLICT (subscript);
712 fprintf (outf, " last_conflict: ");
713 print_generic_stmt (outf, last_iteration, 0);
716 fprintf (outf, " (Subscript distance: ");
717 print_generic_stmt (outf, SUB_DISTANCE (subscript), 0);
718 fprintf (outf, " )\n");
719 fprintf (outf, " )\n");
722 /* Print the classic direction vector DIRV to OUTF. */
724 void
725 print_direction_vector (FILE *outf,
726 lambda_vector dirv,
727 int length)
729 int eq;
731 for (eq = 0; eq < length; eq++)
733 enum data_dependence_direction dir = dirv[eq];
735 switch (dir)
737 case dir_positive:
738 fprintf (outf, " +");
739 break;
740 case dir_negative:
741 fprintf (outf, " -");
742 break;
743 case dir_equal:
744 fprintf (outf, " =");
745 break;
746 case dir_positive_or_equal:
747 fprintf (outf, " +=");
748 break;
749 case dir_positive_or_negative:
750 fprintf (outf, " +-");
751 break;
752 case dir_negative_or_equal:
753 fprintf (outf, " -=");
754 break;
755 case dir_star:
756 fprintf (outf, " *");
757 break;
758 default:
759 fprintf (outf, "indep");
760 break;
763 fprintf (outf, "\n");
766 /* Print a vector of direction vectors. */
768 void
769 print_dir_vectors (FILE *outf, VEC (lambda_vector, heap) *dir_vects,
770 int length)
772 unsigned j;
773 lambda_vector v;
775 for (j = 0; VEC_iterate (lambda_vector, dir_vects, j, v); j++)
776 print_direction_vector (outf, v, length);
779 /* Print a vector of distance vectors. */
781 void
782 print_dist_vectors (FILE *outf, VEC (lambda_vector, heap) *dist_vects,
783 int length)
785 unsigned j;
786 lambda_vector v;
788 for (j = 0; VEC_iterate (lambda_vector, dist_vects, j, v); j++)
789 print_lambda_vector (outf, v, length);
792 /* Debug version. */
794 void
795 debug_data_dependence_relation (struct data_dependence_relation *ddr)
797 dump_data_dependence_relation (stderr, ddr);
800 /* Dump function for a DATA_DEPENDENCE_RELATION structure. */
802 void
803 dump_data_dependence_relation (FILE *outf,
804 struct data_dependence_relation *ddr)
806 struct data_reference *dra, *drb;
808 dra = DDR_A (ddr);
809 drb = DDR_B (ddr);
810 fprintf (outf, "(Data Dep: \n");
811 if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
812 fprintf (outf, " (don't know)\n");
814 else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
815 fprintf (outf, " (no dependence)\n");
817 else if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
819 unsigned int i;
820 struct loop *loopi;
822 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
824 fprintf (outf, " access_fn_A: ");
825 print_generic_stmt (outf, DR_ACCESS_FN (dra, i), 0);
826 fprintf (outf, " access_fn_B: ");
827 print_generic_stmt (outf, DR_ACCESS_FN (drb, i), 0);
828 dump_subscript (outf, DDR_SUBSCRIPT (ddr, i));
831 fprintf (outf, " inner loop index: %d\n", DDR_INNER_LOOP (ddr));
832 fprintf (outf, " loop nest: (");
833 for (i = 0; VEC_iterate (loop_p, DDR_LOOP_NEST (ddr), i, loopi); i++)
834 fprintf (outf, "%d ", loopi->num);
835 fprintf (outf, ")\n");
837 for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
839 fprintf (outf, " distance_vector: ");
840 print_lambda_vector (outf, DDR_DIST_VECT (ddr, i),
841 DDR_NB_LOOPS (ddr));
844 for (i = 0; i < DDR_NUM_DIR_VECTS (ddr); i++)
846 fprintf (outf, " direction_vector: ");
847 print_direction_vector (outf, DDR_DIR_VECT (ddr, i),
848 DDR_NB_LOOPS (ddr));
852 fprintf (outf, ")\n");
855 /* Dump function for a DATA_DEPENDENCE_DIRECTION structure. */
857 void
858 dump_data_dependence_direction (FILE *file,
859 enum data_dependence_direction dir)
861 switch (dir)
863 case dir_positive:
864 fprintf (file, "+");
865 break;
867 case dir_negative:
868 fprintf (file, "-");
869 break;
871 case dir_equal:
872 fprintf (file, "=");
873 break;
875 case dir_positive_or_negative:
876 fprintf (file, "+-");
877 break;
879 case dir_positive_or_equal:
880 fprintf (file, "+=");
881 break;
883 case dir_negative_or_equal:
884 fprintf (file, "-=");
885 break;
887 case dir_star:
888 fprintf (file, "*");
889 break;
891 default:
892 break;
896 /* Dumps the distance and direction vectors in FILE. DDRS contains
897 the dependence relations, and VECT_SIZE is the size of the
898 dependence vectors, or in other words the number of loops in the
899 considered nest. */
901 void
902 dump_dist_dir_vectors (FILE *file, VEC (ddr_p, heap) *ddrs)
904 unsigned int i, j;
905 struct data_dependence_relation *ddr;
906 lambda_vector v;
908 for (i = 0; VEC_iterate (ddr_p, ddrs, i, ddr); i++)
909 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_AFFINE_P (ddr))
911 for (j = 0; VEC_iterate (lambda_vector, DDR_DIST_VECTS (ddr), j, v); j++)
913 fprintf (file, "DISTANCE_V (");
914 print_lambda_vector (file, v, DDR_NB_LOOPS (ddr));
915 fprintf (file, ")\n");
918 for (j = 0; VEC_iterate (lambda_vector, DDR_DIR_VECTS (ddr), j, v); j++)
920 fprintf (file, "DIRECTION_V (");
921 print_direction_vector (file, v, DDR_NB_LOOPS (ddr));
922 fprintf (file, ")\n");
926 fprintf (file, "\n\n");
929 /* Dumps the data dependence relations DDRS in FILE. */
931 void
932 dump_ddrs (FILE *file, VEC (ddr_p, heap) *ddrs)
934 unsigned int i;
935 struct data_dependence_relation *ddr;
937 for (i = 0; VEC_iterate (ddr_p, ddrs, i, ddr); i++)
938 dump_data_dependence_relation (file, ddr);
940 fprintf (file, "\n\n");
945 /* Given an ARRAY_REF node REF, records its access functions.
946 Example: given A[i][3], record in ACCESS_FNS the opnd1 function,
947 i.e. the constant "3", then recursively call the function on opnd0,
948 i.e. the ARRAY_REF "A[i]".
949 The function returns the base name: "A". */
951 static tree
952 analyze_array_indexes (struct loop *loop,
953 VEC(tree,heap) **access_fns,
954 tree ref, tree stmt)
956 tree opnd0, opnd1;
957 tree access_fn;
959 opnd0 = TREE_OPERAND (ref, 0);
960 opnd1 = TREE_OPERAND (ref, 1);
962 /* The detection of the evolution function for this data access is
963 postponed until the dependence test. This lazy strategy avoids
964 the computation of access functions that are of no interest for
965 the optimizers. */
966 access_fn = instantiate_parameters
967 (loop, analyze_scalar_evolution (loop, opnd1));
969 VEC_safe_push (tree, heap, *access_fns, access_fn);
971 /* Recursively record other array access functions. */
972 if (TREE_CODE (opnd0) == ARRAY_REF)
973 return analyze_array_indexes (loop, access_fns, opnd0, stmt);
975 /* Return the base name of the data access. */
976 else
977 return opnd0;
980 /* For a data reference REF contained in the statement STMT, initialize
981 a DATA_REFERENCE structure, and return it. IS_READ flag has to be
982 set to true when REF is in the right hand side of an
983 assignment. */
985 static struct data_reference *
986 init_array_ref (tree stmt, tree ref, bool is_read)
988 struct loop *loop = loop_containing_stmt (stmt);
989 VEC(tree,heap) *acc_fns = VEC_alloc (tree, heap, 3);
990 struct data_reference *res = XNEW (struct data_reference);;
992 if (dump_file && (dump_flags & TDF_DETAILS))
994 fprintf (dump_file, "(init_array_ref \n");
995 fprintf (dump_file, " (ref = ");
996 print_generic_stmt (dump_file, ref, 0);
997 fprintf (dump_file, ")\n");
1000 DR_STMT (res) = stmt;
1001 DR_REF (res) = ref;
1002 DR_BASE_OBJECT (res) = analyze_array_indexes (loop, &acc_fns, ref, stmt);
1003 DR_TYPE (res) = ARRAY_REF_TYPE;
1004 DR_SET_ACCESS_FNS (res, acc_fns);
1005 DR_IS_READ (res) = is_read;
1006 DR_BASE_ADDRESS (res) = NULL_TREE;
1007 DR_OFFSET (res) = NULL_TREE;
1008 DR_INIT (res) = NULL_TREE;
1009 DR_STEP (res) = NULL_TREE;
1010 DR_OFFSET_MISALIGNMENT (res) = NULL_TREE;
1011 DR_MEMTAG (res) = NULL_TREE;
1012 DR_PTR_INFO (res) = NULL;
1014 if (dump_file && (dump_flags & TDF_DETAILS))
1015 fprintf (dump_file, ")\n");
1017 return res;
1020 /* For a data reference REF contained in the statement STMT, initialize
1021 a DATA_REFERENCE structure, and return it. */
1023 static struct data_reference *
1024 init_pointer_ref (tree stmt, tree ref, tree access_fn, bool is_read,
1025 tree base_address, tree step, struct ptr_info_def *ptr_info)
1027 struct data_reference *res = XNEW (struct data_reference);
1028 VEC(tree,heap) *acc_fns = VEC_alloc (tree, heap, 3);
1030 if (dump_file && (dump_flags & TDF_DETAILS))
1032 fprintf (dump_file, "(init_pointer_ref \n");
1033 fprintf (dump_file, " (ref = ");
1034 print_generic_stmt (dump_file, ref, 0);
1035 fprintf (dump_file, ")\n");
1038 DR_STMT (res) = stmt;
1039 DR_REF (res) = ref;
1040 DR_BASE_OBJECT (res) = NULL_TREE;
1041 DR_TYPE (res) = POINTER_REF_TYPE;
1042 DR_SET_ACCESS_FNS (res, acc_fns);
1043 VEC_quick_push (tree, DR_ACCESS_FNS (res), access_fn);
1044 DR_IS_READ (res) = is_read;
1045 DR_BASE_ADDRESS (res) = base_address;
1046 DR_OFFSET (res) = NULL_TREE;
1047 DR_INIT (res) = NULL_TREE;
1048 DR_STEP (res) = step;
1049 DR_OFFSET_MISALIGNMENT (res) = NULL_TREE;
1050 DR_MEMTAG (res) = NULL_TREE;
1051 DR_PTR_INFO (res) = ptr_info;
1053 if (dump_file && (dump_flags & TDF_DETAILS))
1054 fprintf (dump_file, ")\n");
1056 return res;
1059 /* Analyze an indirect memory reference, REF, that comes from STMT.
1060 IS_READ is true if this is an indirect load, and false if it is
1061 an indirect store.
1062 Return a new data reference structure representing the indirect_ref, or
1063 NULL if we cannot describe the access function. */
1065 static struct data_reference *
1066 analyze_indirect_ref (tree stmt, tree ref, bool is_read)
1068 struct loop *loop = loop_containing_stmt (stmt);
1069 tree ptr_ref = TREE_OPERAND (ref, 0);
1070 tree access_fn = analyze_scalar_evolution (loop, ptr_ref);
1071 tree init = initial_condition_in_loop_num (access_fn, loop->num);
1072 tree base_address = NULL_TREE, evolution, step = NULL_TREE;
1073 struct ptr_info_def *ptr_info = NULL;
1075 if (TREE_CODE (ptr_ref) == SSA_NAME)
1076 ptr_info = SSA_NAME_PTR_INFO (ptr_ref);
1078 STRIP_NOPS (init);
1079 if (access_fn == chrec_dont_know || !init || init == chrec_dont_know)
1081 if (dump_file && (dump_flags & TDF_DETAILS))
1083 fprintf (dump_file, "\nBad access function of ptr: ");
1084 print_generic_expr (dump_file, ref, TDF_SLIM);
1085 fprintf (dump_file, "\n");
1087 return NULL;
1090 if (dump_file && (dump_flags & TDF_DETAILS))
1092 fprintf (dump_file, "\nAccess function of ptr: ");
1093 print_generic_expr (dump_file, access_fn, TDF_SLIM);
1094 fprintf (dump_file, "\n");
1097 if (!expr_invariant_in_loop_p (loop, init))
1099 if (dump_file && (dump_flags & TDF_DETAILS))
1100 fprintf (dump_file, "\ninitial condition is not loop invariant.\n");
1102 else
1104 base_address = init;
1105 evolution = evolution_part_in_loop_num (access_fn, loop->num);
1106 if (evolution != chrec_dont_know)
1108 if (!evolution)
1109 step = ssize_int (0);
1110 else
1112 if (TREE_CODE (evolution) == INTEGER_CST)
1113 step = fold_convert (ssizetype, evolution);
1114 else
1115 if (dump_file && (dump_flags & TDF_DETAILS))
1116 fprintf (dump_file, "\nnon constant step for ptr access.\n");
1119 else
1120 if (dump_file && (dump_flags & TDF_DETAILS))
1121 fprintf (dump_file, "\nunknown evolution of ptr.\n");
1123 return init_pointer_ref (stmt, ref, access_fn, is_read, base_address,
1124 step, ptr_info);
1127 /* Function strip_conversions
1129 Strip conversions that don't narrow the mode. */
1131 static tree
1132 strip_conversion (tree expr)
1134 tree to, ti, oprnd0;
1136 while (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR)
1138 to = TREE_TYPE (expr);
1139 oprnd0 = TREE_OPERAND (expr, 0);
1140 ti = TREE_TYPE (oprnd0);
1142 if (!INTEGRAL_TYPE_P (to) || !INTEGRAL_TYPE_P (ti))
1143 return NULL_TREE;
1144 if (GET_MODE_SIZE (TYPE_MODE (to)) < GET_MODE_SIZE (TYPE_MODE (ti)))
1145 return NULL_TREE;
1147 expr = oprnd0;
1149 return expr;
1153 /* Function analyze_offset_expr
1155 Given an offset expression EXPR received from get_inner_reference, analyze
1156 it and create an expression for INITIAL_OFFSET by substituting the variables
1157 of EXPR with initial_condition of the corresponding access_fn in the loop.
1158 E.g.,
1159 for i
1160 for (j = 3; j < N; j++)
1161 a[j].b[i][j] = 0;
1163 For a[j].b[i][j], EXPR will be 'i * C_i + j * C_j + C'. 'i' cannot be
1164 substituted, since its access_fn in the inner loop is i. 'j' will be
1165 substituted with 3. An INITIAL_OFFSET will be 'i * C_i + C`', where
1166 C` = 3 * C_j + C.
1168 Compute MISALIGN (the misalignment of the data reference initial access from
1169 its base). Misalignment can be calculated only if all the variables can be
1170 substituted with constants, otherwise, we record maximum possible alignment
1171 in ALIGNED_TO. In the above example, since 'i' cannot be substituted, MISALIGN
1172 will be NULL_TREE, and the biggest divider of C_i (a power of 2) will be
1173 recorded in ALIGNED_TO.
1175 STEP is an evolution of the data reference in this loop in bytes.
1176 In the above example, STEP is C_j.
1178 Return FALSE, if the analysis fails, e.g., there is no access_fn for a
1179 variable. In this case, all the outputs (INITIAL_OFFSET, MISALIGN, ALIGNED_TO
1180 and STEP) are NULL_TREEs. Otherwise, return TRUE.
1184 static bool
1185 analyze_offset_expr (tree expr,
1186 struct loop *loop,
1187 tree *initial_offset,
1188 tree *misalign,
1189 tree *aligned_to,
1190 tree *step)
1192 tree oprnd0;
1193 tree oprnd1;
1194 tree left_offset = ssize_int (0);
1195 tree right_offset = ssize_int (0);
1196 tree left_misalign = ssize_int (0);
1197 tree right_misalign = ssize_int (0);
1198 tree left_step = ssize_int (0);
1199 tree right_step = ssize_int (0);
1200 enum tree_code code;
1201 tree init, evolution;
1202 tree left_aligned_to = NULL_TREE, right_aligned_to = NULL_TREE;
1204 *step = NULL_TREE;
1205 *misalign = NULL_TREE;
1206 *aligned_to = NULL_TREE;
1207 *initial_offset = NULL_TREE;
1209 /* Strip conversions that don't narrow the mode. */
1210 expr = strip_conversion (expr);
1211 if (!expr)
1212 return false;
1214 /* Stop conditions:
1215 1. Constant. */
1216 if (TREE_CODE (expr) == INTEGER_CST)
1218 *initial_offset = fold_convert (ssizetype, expr);
1219 *misalign = fold_convert (ssizetype, expr);
1220 *step = ssize_int (0);
1221 return true;
1224 /* 2. Variable. Try to substitute with initial_condition of the corresponding
1225 access_fn in the current loop. */
1226 if (SSA_VAR_P (expr))
1228 tree access_fn = analyze_scalar_evolution (loop, expr);
1230 if (access_fn == chrec_dont_know)
1231 /* No access_fn. */
1232 return false;
1234 init = initial_condition_in_loop_num (access_fn, loop->num);
1235 if (!expr_invariant_in_loop_p (loop, init))
1236 /* Not enough information: may be not loop invariant.
1237 E.g., for a[b[i]], we get a[D], where D=b[i]. EXPR is D, its
1238 initial_condition is D, but it depends on i - loop's induction
1239 variable. */
1240 return false;
1242 evolution = evolution_part_in_loop_num (access_fn, loop->num);
1243 if (evolution && TREE_CODE (evolution) != INTEGER_CST)
1244 /* Evolution is not constant. */
1245 return false;
1247 if (TREE_CODE (init) == INTEGER_CST)
1248 *misalign = fold_convert (ssizetype, init);
1249 else
1250 /* Not constant, misalignment cannot be calculated. */
1251 *misalign = NULL_TREE;
1253 *initial_offset = fold_convert (ssizetype, init);
1255 *step = evolution ? fold_convert (ssizetype, evolution) : ssize_int (0);
1256 return true;
1259 /* Recursive computation. */
1260 if (!BINARY_CLASS_P (expr))
1262 /* We expect to get binary expressions (PLUS/MINUS and MULT). */
1263 if (dump_file && (dump_flags & TDF_DETAILS))
1265 fprintf (dump_file, "\nNot binary expression ");
1266 print_generic_expr (dump_file, expr, TDF_SLIM);
1267 fprintf (dump_file, "\n");
1269 return false;
1271 oprnd0 = TREE_OPERAND (expr, 0);
1272 oprnd1 = TREE_OPERAND (expr, 1);
1274 if (!analyze_offset_expr (oprnd0, loop, &left_offset, &left_misalign,
1275 &left_aligned_to, &left_step)
1276 || !analyze_offset_expr (oprnd1, loop, &right_offset, &right_misalign,
1277 &right_aligned_to, &right_step))
1278 return false;
1280 /* The type of the operation: plus, minus or mult. */
1281 code = TREE_CODE (expr);
1282 switch (code)
1284 case MULT_EXPR:
1285 if (TREE_CODE (right_offset) != INTEGER_CST)
1286 /* RIGHT_OFFSET can be not constant. For example, for arrays of variable
1287 sized types.
1288 FORNOW: We don't support such cases. */
1289 return false;
1291 /* Strip conversions that don't narrow the mode. */
1292 left_offset = strip_conversion (left_offset);
1293 if (!left_offset)
1294 return false;
1295 /* Misalignment computation. */
1296 if (SSA_VAR_P (left_offset))
1298 /* If the left side contains variables that can't be substituted with
1299 constants, the misalignment is unknown. However, if the right side
1300 is a multiple of some alignment, we know that the expression is
1301 aligned to it. Therefore, we record such maximum possible value.
1303 *misalign = NULL_TREE;
1304 *aligned_to = ssize_int (highest_pow2_factor (right_offset));
1306 else
1308 /* The left operand was successfully substituted with constant. */
1309 if (left_misalign)
1311 /* In case of EXPR '(i * C1 + j) * C2', LEFT_MISALIGN is
1312 NULL_TREE. */
1313 *misalign = size_binop (code, left_misalign, right_misalign);
1314 if (left_aligned_to && right_aligned_to)
1315 *aligned_to = size_binop (MIN_EXPR, left_aligned_to,
1316 right_aligned_to);
1317 else
1318 *aligned_to = left_aligned_to ?
1319 left_aligned_to : right_aligned_to;
1321 else
1322 *misalign = NULL_TREE;
1325 /* Step calculation. */
1326 /* Multiply the step by the right operand. */
1327 *step = size_binop (MULT_EXPR, left_step, right_offset);
1328 break;
1330 case PLUS_EXPR:
1331 case MINUS_EXPR:
1332 /* Combine the recursive calculations for step and misalignment. */
1333 *step = size_binop (code, left_step, right_step);
1335 /* Unknown alignment. */
1336 if ((!left_misalign && !left_aligned_to)
1337 || (!right_misalign && !right_aligned_to))
1339 *misalign = NULL_TREE;
1340 *aligned_to = NULL_TREE;
1341 break;
1344 if (left_misalign && right_misalign)
1345 *misalign = size_binop (code, left_misalign, right_misalign);
1346 else
1347 *misalign = left_misalign ? left_misalign : right_misalign;
1349 if (left_aligned_to && right_aligned_to)
1350 *aligned_to = size_binop (MIN_EXPR, left_aligned_to, right_aligned_to);
1351 else
1352 *aligned_to = left_aligned_to ? left_aligned_to : right_aligned_to;
1354 break;
1356 default:
1357 gcc_unreachable ();
1360 /* Compute offset. */
1361 *initial_offset = fold_convert (ssizetype,
1362 fold_build2 (code, TREE_TYPE (left_offset),
1363 left_offset,
1364 right_offset));
1365 return true;
1368 /* Function address_analysis
1370 Return the BASE of the address expression EXPR.
1371 Also compute the OFFSET from BASE, MISALIGN and STEP.
1373 Input:
1374 EXPR - the address expression that is being analyzed
1375 STMT - the statement that contains EXPR or its original memory reference
1376 IS_READ - TRUE if STMT reads from EXPR, FALSE if writes to EXPR
1377 DR - data_reference struct for the original memory reference
1379 Output:
1380 BASE (returned value) - the base of the data reference EXPR.
1381 INITIAL_OFFSET - initial offset of EXPR from BASE (an expression)
1382 MISALIGN - offset of EXPR from BASE in bytes (a constant) or NULL_TREE if the
1383 computation is impossible
1384 ALIGNED_TO - maximum alignment of EXPR or NULL_TREE if MISALIGN can be
1385 calculated (doesn't depend on variables)
1386 STEP - evolution of EXPR in the loop
1388 If something unexpected is encountered (an unsupported form of data-ref),
1389 then NULL_TREE is returned.
1392 static tree
1393 address_analysis (tree expr, tree stmt, bool is_read, struct data_reference *dr,
1394 tree *offset, tree *misalign, tree *aligned_to, tree *step)
1396 tree oprnd0, oprnd1, base_address, offset_expr, base_addr0, base_addr1;
1397 tree address_offset = ssize_int (0), address_misalign = ssize_int (0);
1398 tree dummy, address_aligned_to = NULL_TREE;
1399 struct ptr_info_def *dummy1;
1400 subvar_t dummy2;
1402 switch (TREE_CODE (expr))
1404 case PLUS_EXPR:
1405 case MINUS_EXPR:
1406 /* EXPR is of form {base +/- offset} (or {offset +/- base}). */
1407 oprnd0 = TREE_OPERAND (expr, 0);
1408 oprnd1 = TREE_OPERAND (expr, 1);
1410 STRIP_NOPS (oprnd0);
1411 STRIP_NOPS (oprnd1);
1413 /* Recursively try to find the base of the address contained in EXPR.
1414 For offset, the returned base will be NULL. */
1415 base_addr0 = address_analysis (oprnd0, stmt, is_read, dr, &address_offset,
1416 &address_misalign, &address_aligned_to,
1417 step);
1419 base_addr1 = address_analysis (oprnd1, stmt, is_read, dr, &address_offset,
1420 &address_misalign, &address_aligned_to,
1421 step);
1423 /* We support cases where only one of the operands contains an
1424 address. */
1425 if ((base_addr0 && base_addr1) || (!base_addr0 && !base_addr1))
1427 if (dump_file && (dump_flags & TDF_DETAILS))
1429 fprintf (dump_file,
1430 "\neither more than one address or no addresses in expr ");
1431 print_generic_expr (dump_file, expr, TDF_SLIM);
1432 fprintf (dump_file, "\n");
1434 return NULL_TREE;
1437 /* To revert STRIP_NOPS. */
1438 oprnd0 = TREE_OPERAND (expr, 0);
1439 oprnd1 = TREE_OPERAND (expr, 1);
1441 offset_expr = base_addr0 ?
1442 fold_convert (ssizetype, oprnd1) : fold_convert (ssizetype, oprnd0);
1444 /* EXPR is of form {base +/- offset} (or {offset +/- base}). If offset is
1445 a number, we can add it to the misalignment value calculated for base,
1446 otherwise, misalignment is NULL. */
1447 if (TREE_CODE (offset_expr) == INTEGER_CST && address_misalign)
1449 *misalign = size_binop (TREE_CODE (expr), address_misalign,
1450 offset_expr);
1451 *aligned_to = address_aligned_to;
1453 else
1455 *misalign = NULL_TREE;
1456 *aligned_to = NULL_TREE;
1459 /* Combine offset (from EXPR {base + offset}) with the offset calculated
1460 for base. */
1461 *offset = size_binop (TREE_CODE (expr), address_offset, offset_expr);
1462 return base_addr0 ? base_addr0 : base_addr1;
1464 case ADDR_EXPR:
1465 base_address = object_analysis (TREE_OPERAND (expr, 0), stmt, is_read,
1466 &dr, offset, misalign, aligned_to, step,
1467 &dummy, &dummy1, &dummy2);
1468 return base_address;
1470 case SSA_NAME:
1471 if (!POINTER_TYPE_P (TREE_TYPE (expr)))
1473 if (dump_file && (dump_flags & TDF_DETAILS))
1475 fprintf (dump_file, "\nnot pointer SSA_NAME ");
1476 print_generic_expr (dump_file, expr, TDF_SLIM);
1477 fprintf (dump_file, "\n");
1479 return NULL_TREE;
1481 *aligned_to = ssize_int (TYPE_ALIGN_UNIT (TREE_TYPE (TREE_TYPE (expr))));
1482 *misalign = ssize_int (0);
1483 *offset = ssize_int (0);
1484 *step = ssize_int (0);
1485 return expr;
1487 default:
1488 return NULL_TREE;
1493 /* Function object_analysis
1495 Create a data-reference structure DR for MEMREF.
1496 Return the BASE of the data reference MEMREF if the analysis is possible.
1497 Also compute the INITIAL_OFFSET from BASE, MISALIGN and STEP.
1498 E.g., for EXPR a.b[i] + 4B, BASE is a, and OFFSET is the overall offset
1499 'a.b[i] + 4B' from a (can be an expression), MISALIGN is an OFFSET
1500 instantiated with initial_conditions of access_functions of variables,
1501 and STEP is the evolution of the DR_REF in this loop.
1503 Function get_inner_reference is used for the above in case of ARRAY_REF and
1504 COMPONENT_REF.
1506 The structure of the function is as follows:
1507 Part 1:
1508 Case 1. For handled_component_p refs
1509 1.1 build data-reference structure for MEMREF
1510 1.2 call get_inner_reference
1511 1.2.1 analyze offset expr received from get_inner_reference
1512 (fall through with BASE)
1513 Case 2. For declarations
1514 2.1 set MEMTAG
1515 Case 3. For INDIRECT_REFs
1516 3.1 build data-reference structure for MEMREF
1517 3.2 analyze evolution and initial condition of MEMREF
1518 3.3 set data-reference structure for MEMREF
1519 3.4 call address_analysis to analyze INIT of the access function
1520 3.5 extract memory tag
1522 Part 2:
1523 Combine the results of object and address analysis to calculate
1524 INITIAL_OFFSET, STEP and misalignment info.
1526 Input:
1527 MEMREF - the memory reference that is being analyzed
1528 STMT - the statement that contains MEMREF
1529 IS_READ - TRUE if STMT reads from MEMREF, FALSE if writes to MEMREF
1531 Output:
1532 BASE_ADDRESS (returned value) - the base address of the data reference MEMREF
1533 E.g, if MEMREF is a.b[k].c[i][j] the returned
1534 base is &a.
1535 DR - data_reference struct for MEMREF
1536 INITIAL_OFFSET - initial offset of MEMREF from BASE (an expression)
1537 MISALIGN - offset of MEMREF from BASE in bytes (a constant) modulo alignment of
1538 ALIGNMENT or NULL_TREE if the computation is impossible
1539 ALIGNED_TO - maximum alignment of EXPR or NULL_TREE if MISALIGN can be
1540 calculated (doesn't depend on variables)
1541 STEP - evolution of the DR_REF in the loop
1542 MEMTAG - memory tag for aliasing purposes
1543 PTR_INFO - NULL or points-to aliasing info from a pointer SSA_NAME
1544 SUBVARS - Sub-variables of the variable
1546 If the analysis of MEMREF evolution in the loop fails, NULL_TREE is returned,
1547 but DR can be created anyway.
1551 static tree
1552 object_analysis (tree memref, tree stmt, bool is_read,
1553 struct data_reference **dr, tree *offset, tree *misalign,
1554 tree *aligned_to, tree *step, tree *memtag,
1555 struct ptr_info_def **ptr_info, subvar_t *subvars)
1557 tree base = NULL_TREE, base_address = NULL_TREE;
1558 tree object_offset = ssize_int (0), object_misalign = ssize_int (0);
1559 tree object_step = ssize_int (0), address_step = ssize_int (0);
1560 tree address_offset = ssize_int (0), address_misalign = ssize_int (0);
1561 HOST_WIDE_INT pbitsize, pbitpos;
1562 tree poffset, bit_pos_in_bytes;
1563 enum machine_mode pmode;
1564 int punsignedp, pvolatilep;
1565 tree ptr_step = ssize_int (0), ptr_init = NULL_TREE;
1566 struct loop *loop = loop_containing_stmt (stmt);
1567 struct data_reference *ptr_dr = NULL;
1568 tree object_aligned_to = NULL_TREE, address_aligned_to = NULL_TREE;
1569 tree comp_ref = NULL_TREE;
1571 *ptr_info = NULL;
1573 /* Part 1: */
1574 /* Case 1. handled_component_p refs. */
1575 if (handled_component_p (memref))
1577 /* 1.1 build data-reference structure for MEMREF. */
1578 if (!(*dr))
1580 if (TREE_CODE (memref) == ARRAY_REF)
1581 *dr = init_array_ref (stmt, memref, is_read);
1582 else if (TREE_CODE (memref) == COMPONENT_REF)
1583 comp_ref = memref;
1584 else
1586 if (dump_file && (dump_flags & TDF_DETAILS))
1588 fprintf (dump_file, "\ndata-ref of unsupported type ");
1589 print_generic_expr (dump_file, memref, TDF_SLIM);
1590 fprintf (dump_file, "\n");
1592 return NULL_TREE;
1596 /* 1.2 call get_inner_reference. */
1597 /* Find the base and the offset from it. */
1598 base = get_inner_reference (memref, &pbitsize, &pbitpos, &poffset,
1599 &pmode, &punsignedp, &pvolatilep, false);
1600 if (!base)
1602 if (dump_file && (dump_flags & TDF_DETAILS))
1604 fprintf (dump_file, "\nfailed to get inner ref for ");
1605 print_generic_expr (dump_file, memref, TDF_SLIM);
1606 fprintf (dump_file, "\n");
1608 return NULL_TREE;
1611 /* 1.2.1 analyze offset expr received from get_inner_reference. */
1612 if (poffset
1613 && !analyze_offset_expr (poffset, loop, &object_offset,
1614 &object_misalign, &object_aligned_to,
1615 &object_step))
1617 if (dump_file && (dump_flags & TDF_DETAILS))
1619 fprintf (dump_file, "\nfailed to compute offset or step for ");
1620 print_generic_expr (dump_file, memref, TDF_SLIM);
1621 fprintf (dump_file, "\n");
1623 return NULL_TREE;
1626 /* Add bit position to OFFSET and MISALIGN. */
1628 bit_pos_in_bytes = ssize_int (pbitpos/BITS_PER_UNIT);
1629 /* Check that there is no remainder in bits. */
1630 if (pbitpos%BITS_PER_UNIT)
1632 if (dump_file && (dump_flags & TDF_DETAILS))
1633 fprintf (dump_file, "\nbit offset alignment.\n");
1634 return NULL_TREE;
1636 object_offset = size_binop (PLUS_EXPR, bit_pos_in_bytes, object_offset);
1637 if (object_misalign)
1638 object_misalign = size_binop (PLUS_EXPR, object_misalign,
1639 bit_pos_in_bytes);
1641 memref = base; /* To continue analysis of BASE. */
1642 /* fall through */
1645 /* Part 1: Case 2. Declarations. */
1646 if (DECL_P (memref))
1648 /* We expect to get a decl only if we already have a DR, or with
1649 COMPONENT_REFs of type 'a[i].b'. */
1650 if (!(*dr))
1652 if (comp_ref && TREE_CODE (TREE_OPERAND (comp_ref, 0)) == ARRAY_REF)
1654 *dr = init_array_ref (stmt, TREE_OPERAND (comp_ref, 0), is_read);
1655 if (DR_NUM_DIMENSIONS (*dr) != 1)
1657 if (dump_file && (dump_flags & TDF_DETAILS))
1659 fprintf (dump_file, "\n multidimensional component ref ");
1660 print_generic_expr (dump_file, comp_ref, TDF_SLIM);
1661 fprintf (dump_file, "\n");
1663 return NULL_TREE;
1666 else
1668 if (dump_file && (dump_flags & TDF_DETAILS))
1670 fprintf (dump_file, "\nunhandled decl ");
1671 print_generic_expr (dump_file, memref, TDF_SLIM);
1672 fprintf (dump_file, "\n");
1674 return NULL_TREE;
1678 /* TODO: if during the analysis of INDIRECT_REF we get to an object, put
1679 the object in BASE_OBJECT field if we can prove that this is O.K.,
1680 i.e., the data-ref access is bounded by the bounds of the BASE_OBJECT.
1681 (e.g., if the object is an array base 'a', where 'a[N]', we must prove
1682 that every access with 'p' (the original INDIRECT_REF based on '&a')
1683 in the loop is within the array boundaries - from a[0] to a[N-1]).
1684 Otherwise, our alias analysis can be incorrect.
1685 Even if an access function based on BASE_OBJECT can't be build, update
1686 BASE_OBJECT field to enable us to prove that two data-refs are
1687 different (without access function, distance analysis is impossible).
1689 if (SSA_VAR_P (memref) && var_can_have_subvars (memref))
1690 *subvars = get_subvars_for_var (memref);
1691 base_address = build_fold_addr_expr (memref);
1692 /* 2.1 set MEMTAG. */
1693 *memtag = memref;
1696 /* Part 1: Case 3. INDIRECT_REFs. */
1697 else if (TREE_CODE (memref) == INDIRECT_REF)
1699 tree ptr_ref = TREE_OPERAND (memref, 0);
1700 if (TREE_CODE (ptr_ref) == SSA_NAME)
1701 *ptr_info = SSA_NAME_PTR_INFO (ptr_ref);
1703 /* 3.1 build data-reference structure for MEMREF. */
1704 ptr_dr = analyze_indirect_ref (stmt, memref, is_read);
1705 if (!ptr_dr)
1707 if (dump_file && (dump_flags & TDF_DETAILS))
1709 fprintf (dump_file, "\nfailed to create dr for ");
1710 print_generic_expr (dump_file, memref, TDF_SLIM);
1711 fprintf (dump_file, "\n");
1713 return NULL_TREE;
1716 /* 3.2 analyze evolution and initial condition of MEMREF. */
1717 ptr_step = DR_STEP (ptr_dr);
1718 ptr_init = DR_BASE_ADDRESS (ptr_dr);
1719 if (!ptr_init || !ptr_step || !POINTER_TYPE_P (TREE_TYPE (ptr_init)))
1721 *dr = (*dr) ? *dr : ptr_dr;
1722 if (dump_file && (dump_flags & TDF_DETAILS))
1724 fprintf (dump_file, "\nbad pointer access ");
1725 print_generic_expr (dump_file, memref, TDF_SLIM);
1726 fprintf (dump_file, "\n");
1728 return NULL_TREE;
1731 if (integer_zerop (ptr_step) && !(*dr))
1733 if (dump_file && (dump_flags & TDF_DETAILS))
1734 fprintf (dump_file, "\nptr is loop invariant.\n");
1735 *dr = ptr_dr;
1736 return NULL_TREE;
1738 /* If there exists DR for MEMREF, we are analyzing the base of
1739 handled component (PTR_INIT), which not necessary has evolution in
1740 the loop. */
1742 object_step = size_binop (PLUS_EXPR, object_step, ptr_step);
1744 /* 3.3 set data-reference structure for MEMREF. */
1745 if (!*dr)
1746 *dr = ptr_dr;
1748 /* 3.4 call address_analysis to analyze INIT of the access
1749 function. */
1750 base_address = address_analysis (ptr_init, stmt, is_read, *dr,
1751 &address_offset, &address_misalign,
1752 &address_aligned_to, &address_step);
1753 if (!base_address)
1755 if (dump_file && (dump_flags & TDF_DETAILS))
1757 fprintf (dump_file, "\nfailed to analyze address ");
1758 print_generic_expr (dump_file, ptr_init, TDF_SLIM);
1759 fprintf (dump_file, "\n");
1761 return NULL_TREE;
1764 /* 3.5 extract memory tag. */
1765 switch (TREE_CODE (base_address))
1767 case SSA_NAME:
1768 *memtag = symbol_mem_tag (SSA_NAME_VAR (base_address));
1769 if (!(*memtag) && TREE_CODE (TREE_OPERAND (memref, 0)) == SSA_NAME)
1770 *memtag = symbol_mem_tag (SSA_NAME_VAR (TREE_OPERAND (memref, 0)));
1771 break;
1772 case ADDR_EXPR:
1773 *memtag = TREE_OPERAND (base_address, 0);
1774 break;
1775 default:
1776 if (dump_file && (dump_flags & TDF_DETAILS))
1778 fprintf (dump_file, "\nno memtag for ");
1779 print_generic_expr (dump_file, memref, TDF_SLIM);
1780 fprintf (dump_file, "\n");
1782 *memtag = NULL_TREE;
1783 break;
1787 if (!base_address)
1789 /* MEMREF cannot be analyzed. */
1790 if (dump_file && (dump_flags & TDF_DETAILS))
1792 fprintf (dump_file, "\ndata-ref of unsupported type ");
1793 print_generic_expr (dump_file, memref, TDF_SLIM);
1794 fprintf (dump_file, "\n");
1796 return NULL_TREE;
1799 if (comp_ref)
1800 DR_REF (*dr) = comp_ref;
1802 if (SSA_VAR_P (*memtag) && var_can_have_subvars (*memtag))
1803 *subvars = get_subvars_for_var (*memtag);
1805 /* Part 2: Combine the results of object and address analysis to calculate
1806 INITIAL_OFFSET, STEP and misalignment info. */
1807 *offset = size_binop (PLUS_EXPR, object_offset, address_offset);
1809 if ((!object_misalign && !object_aligned_to)
1810 || (!address_misalign && !address_aligned_to))
1812 *misalign = NULL_TREE;
1813 *aligned_to = NULL_TREE;
1815 else
1817 if (object_misalign && address_misalign)
1818 *misalign = size_binop (PLUS_EXPR, object_misalign, address_misalign);
1819 else
1820 *misalign = object_misalign ? object_misalign : address_misalign;
1821 if (object_aligned_to && address_aligned_to)
1822 *aligned_to = size_binop (MIN_EXPR, object_aligned_to,
1823 address_aligned_to);
1824 else
1825 *aligned_to = object_aligned_to ?
1826 object_aligned_to : address_aligned_to;
1828 *step = size_binop (PLUS_EXPR, object_step, address_step);
1830 return base_address;
1833 /* Function analyze_offset.
1835 Extract INVARIANT and CONSTANT parts from OFFSET.
1838 static bool
1839 analyze_offset (tree offset, tree *invariant, tree *constant)
1841 tree op0, op1, constant_0, constant_1, invariant_0, invariant_1;
1842 enum tree_code code = TREE_CODE (offset);
1844 *invariant = NULL_TREE;
1845 *constant = NULL_TREE;
1847 /* Not PLUS/MINUS expression - recursion stop condition. */
1848 if (code != PLUS_EXPR && code != MINUS_EXPR)
1850 if (TREE_CODE (offset) == INTEGER_CST)
1851 *constant = offset;
1852 else
1853 *invariant = offset;
1854 return true;
1857 op0 = TREE_OPERAND (offset, 0);
1858 op1 = TREE_OPERAND (offset, 1);
1860 /* Recursive call with the operands. */
1861 if (!analyze_offset (op0, &invariant_0, &constant_0)
1862 || !analyze_offset (op1, &invariant_1, &constant_1))
1863 return false;
1865 /* Combine the results. Add negation to the subtrahend in case of
1866 subtraction. */
1867 if (constant_0 && constant_1)
1868 return false;
1869 *constant = constant_0 ? constant_0 : constant_1;
1870 if (code == MINUS_EXPR && constant_1)
1871 *constant = fold_build1 (NEGATE_EXPR, TREE_TYPE (*constant), *constant);
1873 if (invariant_0 && invariant_1)
1874 *invariant =
1875 fold_build2 (code, TREE_TYPE (invariant_0), invariant_0, invariant_1);
1876 else
1878 *invariant = invariant_0 ? invariant_0 : invariant_1;
1879 if (code == MINUS_EXPR && invariant_1)
1880 *invariant =
1881 fold_build1 (NEGATE_EXPR, TREE_TYPE (*invariant), *invariant);
1883 return true;
1886 /* Free the memory used by the data reference DR. */
1888 static void
1889 free_data_ref (data_reference_p dr)
1891 DR_FREE_ACCESS_FNS (dr);
1892 free (dr);
1895 /* Function create_data_ref.
1897 Create a data-reference structure for MEMREF. Set its DR_BASE_ADDRESS,
1898 DR_OFFSET, DR_INIT, DR_STEP, DR_OFFSET_MISALIGNMENT, DR_ALIGNED_TO,
1899 DR_MEMTAG, and DR_POINTSTO_INFO fields.
1901 Input:
1902 MEMREF - the memory reference that is being analyzed
1903 STMT - the statement that contains MEMREF
1904 IS_READ - TRUE if STMT reads from MEMREF, FALSE if writes to MEMREF
1906 Output:
1907 DR (returned value) - data_reference struct for MEMREF
1910 static struct data_reference *
1911 create_data_ref (tree memref, tree stmt, bool is_read)
1913 struct data_reference *dr = NULL;
1914 tree base_address, offset, step, misalign, memtag;
1915 struct loop *loop = loop_containing_stmt (stmt);
1916 tree invariant = NULL_TREE, constant = NULL_TREE;
1917 tree type_size, init_cond;
1918 struct ptr_info_def *ptr_info;
1919 subvar_t subvars = NULL;
1920 tree aligned_to, type = NULL_TREE, orig_offset;
1922 if (!memref)
1923 return NULL;
1925 base_address = object_analysis (memref, stmt, is_read, &dr, &offset,
1926 &misalign, &aligned_to, &step, &memtag,
1927 &ptr_info, &subvars);
1928 if (!dr || !base_address)
1930 if (dump_file && (dump_flags & TDF_DETAILS))
1932 fprintf (dump_file, "\ncreate_data_ref: failed to create a dr for ");
1933 print_generic_expr (dump_file, memref, TDF_SLIM);
1934 fprintf (dump_file, "\n");
1936 return NULL;
1939 DR_BASE_ADDRESS (dr) = base_address;
1940 DR_OFFSET (dr) = offset;
1941 DR_INIT (dr) = ssize_int (0);
1942 DR_STEP (dr) = step;
1943 DR_OFFSET_MISALIGNMENT (dr) = misalign;
1944 DR_ALIGNED_TO (dr) = aligned_to;
1945 DR_MEMTAG (dr) = memtag;
1946 DR_PTR_INFO (dr) = ptr_info;
1947 DR_SUBVARS (dr) = subvars;
1949 type_size = fold_convert (ssizetype, TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dr))));
1951 /* Extract CONSTANT and INVARIANT from OFFSET. */
1952 /* Remove cast from OFFSET and restore it for INVARIANT part. */
1953 orig_offset = offset;
1954 STRIP_NOPS (offset);
1955 if (offset != orig_offset)
1956 type = TREE_TYPE (orig_offset);
1957 if (!analyze_offset (offset, &invariant, &constant))
1959 if (dump_file && (dump_flags & TDF_DETAILS))
1961 fprintf (dump_file, "\ncreate_data_ref: failed to analyze dr's");
1962 fprintf (dump_file, " offset for ");
1963 print_generic_expr (dump_file, memref, TDF_SLIM);
1964 fprintf (dump_file, "\n");
1966 return NULL;
1968 if (type && invariant)
1969 invariant = fold_convert (type, invariant);
1971 /* Put CONSTANT part of OFFSET in DR_INIT and INVARIANT in DR_OFFSET field
1972 of DR. */
1973 if (constant)
1975 DR_INIT (dr) = fold_convert (ssizetype, constant);
1976 init_cond = fold_build2 (TRUNC_DIV_EXPR, TREE_TYPE (constant),
1977 constant, type_size);
1979 else
1980 DR_INIT (dr) = init_cond = ssize_int (0);
1982 if (invariant)
1983 DR_OFFSET (dr) = invariant;
1984 else
1985 DR_OFFSET (dr) = ssize_int (0);
1987 /* Change the access function for INIDIRECT_REFs, according to
1988 DR_BASE_ADDRESS. Analyze OFFSET calculated in object_analysis. OFFSET is
1989 an expression that can contain loop invariant expressions and constants.
1990 We put the constant part in the initial condition of the access function
1991 (for data dependence tests), and in DR_INIT of the data-ref. The loop
1992 invariant part is put in DR_OFFSET.
1993 The evolution part of the access function is STEP calculated in
1994 object_analysis divided by the size of data type.
1996 if (!DR_BASE_OBJECT (dr)
1997 || (TREE_CODE (memref) == COMPONENT_REF && DR_NUM_DIMENSIONS (dr) == 1))
1999 tree access_fn;
2000 tree new_step;
2002 /* Update access function. */
2003 access_fn = DR_ACCESS_FN (dr, 0);
2004 if (automatically_generated_chrec_p (access_fn))
2006 free_data_ref (dr);
2007 return NULL;
2010 new_step = size_binop (TRUNC_DIV_EXPR,
2011 fold_convert (ssizetype, step), type_size);
2013 init_cond = chrec_convert (chrec_type (access_fn), init_cond, stmt);
2014 new_step = chrec_convert (chrec_type (access_fn), new_step, stmt);
2015 if (automatically_generated_chrec_p (init_cond)
2016 || automatically_generated_chrec_p (new_step))
2018 free_data_ref (dr);
2019 return NULL;
2021 access_fn = chrec_replace_initial_condition (access_fn, init_cond);
2022 access_fn = reset_evolution_in_loop (loop->num, access_fn, new_step);
2024 VEC_replace (tree, DR_ACCESS_FNS (dr), 0, access_fn);
2027 if (dump_file && (dump_flags & TDF_DETAILS))
2029 struct ptr_info_def *pi = DR_PTR_INFO (dr);
2031 fprintf (dump_file, "\nCreated dr for ");
2032 print_generic_expr (dump_file, memref, TDF_SLIM);
2033 fprintf (dump_file, "\n\tbase_address: ");
2034 print_generic_expr (dump_file, DR_BASE_ADDRESS (dr), TDF_SLIM);
2035 fprintf (dump_file, "\n\toffset from base address: ");
2036 print_generic_expr (dump_file, DR_OFFSET (dr), TDF_SLIM);
2037 fprintf (dump_file, "\n\tconstant offset from base address: ");
2038 print_generic_expr (dump_file, DR_INIT (dr), TDF_SLIM);
2039 fprintf (dump_file, "\n\tbase_object: ");
2040 print_generic_expr (dump_file, DR_BASE_OBJECT (dr), TDF_SLIM);
2041 fprintf (dump_file, "\n\tstep: ");
2042 print_generic_expr (dump_file, DR_STEP (dr), TDF_SLIM);
2043 fprintf (dump_file, "B\n\tmisalignment from base: ");
2044 print_generic_expr (dump_file, DR_OFFSET_MISALIGNMENT (dr), TDF_SLIM);
2045 if (DR_OFFSET_MISALIGNMENT (dr))
2046 fprintf (dump_file, "B");
2047 if (DR_ALIGNED_TO (dr))
2049 fprintf (dump_file, "\n\taligned to: ");
2050 print_generic_expr (dump_file, DR_ALIGNED_TO (dr), TDF_SLIM);
2052 fprintf (dump_file, "\n\tmemtag: ");
2053 print_generic_expr (dump_file, DR_MEMTAG (dr), TDF_SLIM);
2054 fprintf (dump_file, "\n");
2055 if (pi && pi->name_mem_tag)
2057 fprintf (dump_file, "\n\tnametag: ");
2058 print_generic_expr (dump_file, pi->name_mem_tag, TDF_SLIM);
2059 fprintf (dump_file, "\n");
2062 return dr;
2065 /* Returns true if FNA == FNB. */
2067 static bool
2068 affine_function_equal_p (affine_fn fna, affine_fn fnb)
2070 unsigned i, n = VEC_length (tree, fna);
2072 if (n != VEC_length (tree, fnb))
2073 return false;
2075 for (i = 0; i < n; i++)
2076 if (!operand_equal_p (VEC_index (tree, fna, i),
2077 VEC_index (tree, fnb, i), 0))
2078 return false;
2080 return true;
2083 /* If all the functions in CF are the same, returns one of them,
2084 otherwise returns NULL. */
2086 static affine_fn
2087 common_affine_function (conflict_function *cf)
2089 unsigned i;
2090 affine_fn comm;
2092 if (!CF_NONTRIVIAL_P (cf))
2093 return NULL;
2095 comm = cf->fns[0];
2097 for (i = 1; i < cf->n; i++)
2098 if (!affine_function_equal_p (comm, cf->fns[i]))
2099 return NULL;
2101 return comm;
2104 /* Returns the base of the affine function FN. */
2106 static tree
2107 affine_function_base (affine_fn fn)
2109 return VEC_index (tree, fn, 0);
2112 /* Returns true if FN is a constant. */
2114 static bool
2115 affine_function_constant_p (affine_fn fn)
2117 unsigned i;
2118 tree coef;
2120 for (i = 1; VEC_iterate (tree, fn, i, coef); i++)
2121 if (!integer_zerop (coef))
2122 return false;
2124 return true;
2127 /* Returns true if FN is the zero constant function. */
2129 static bool
2130 affine_function_zero_p (affine_fn fn)
2132 return (integer_zerop (affine_function_base (fn))
2133 && affine_function_constant_p (fn));
2136 /* Applies operation OP on affine functions FNA and FNB, and returns the
2137 result. */
2139 static affine_fn
2140 affine_fn_op (enum tree_code op, affine_fn fna, affine_fn fnb)
2142 unsigned i, n, m;
2143 affine_fn ret;
2144 tree coef;
2146 if (VEC_length (tree, fnb) > VEC_length (tree, fna))
2148 n = VEC_length (tree, fna);
2149 m = VEC_length (tree, fnb);
2151 else
2153 n = VEC_length (tree, fnb);
2154 m = VEC_length (tree, fna);
2157 ret = VEC_alloc (tree, heap, m);
2158 for (i = 0; i < n; i++)
2159 VEC_quick_push (tree, ret,
2160 fold_build2 (op, integer_type_node,
2161 VEC_index (tree, fna, i),
2162 VEC_index (tree, fnb, i)));
2164 for (; VEC_iterate (tree, fna, i, coef); i++)
2165 VEC_quick_push (tree, ret,
2166 fold_build2 (op, integer_type_node,
2167 coef, integer_zero_node));
2168 for (; VEC_iterate (tree, fnb, i, coef); i++)
2169 VEC_quick_push (tree, ret,
2170 fold_build2 (op, integer_type_node,
2171 integer_zero_node, coef));
2173 return ret;
2176 /* Returns the sum of affine functions FNA and FNB. */
2178 static affine_fn
2179 affine_fn_plus (affine_fn fna, affine_fn fnb)
2181 return affine_fn_op (PLUS_EXPR, fna, fnb);
2184 /* Returns the difference of affine functions FNA and FNB. */
2186 static affine_fn
2187 affine_fn_minus (affine_fn fna, affine_fn fnb)
2189 return affine_fn_op (MINUS_EXPR, fna, fnb);
2192 /* Frees affine function FN. */
2194 static void
2195 affine_fn_free (affine_fn fn)
2197 VEC_free (tree, heap, fn);
2200 /* Determine for each subscript in the data dependence relation DDR
2201 the distance. */
2203 static void
2204 compute_subscript_distance (struct data_dependence_relation *ddr)
2206 conflict_function *cf_a, *cf_b;
2207 affine_fn fn_a, fn_b, diff;
2209 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
2211 unsigned int i;
2213 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
2215 struct subscript *subscript;
2217 subscript = DDR_SUBSCRIPT (ddr, i);
2218 cf_a = SUB_CONFLICTS_IN_A (subscript);
2219 cf_b = SUB_CONFLICTS_IN_B (subscript);
2221 fn_a = common_affine_function (cf_a);
2222 fn_b = common_affine_function (cf_b);
2223 if (!fn_a || !fn_b)
2225 SUB_DISTANCE (subscript) = chrec_dont_know;
2226 return;
2228 diff = affine_fn_minus (fn_a, fn_b);
2230 if (affine_function_constant_p (diff))
2231 SUB_DISTANCE (subscript) = affine_function_base (diff);
2232 else
2233 SUB_DISTANCE (subscript) = chrec_dont_know;
2235 affine_fn_free (diff);
2240 /* Returns the conflict function for "unknown". */
2242 static conflict_function *
2243 conflict_fn_not_known (void)
2245 conflict_function *fn = XCNEW (conflict_function);
2246 fn->n = NOT_KNOWN;
2248 return fn;
2251 /* Returns the conflict function for "independent". */
2253 static conflict_function *
2254 conflict_fn_no_dependence (void)
2256 conflict_function *fn = XCNEW (conflict_function);
2257 fn->n = NO_DEPENDENCE;
2259 return fn;
2262 /* Initialize a data dependence relation between data accesses A and
2263 B. NB_LOOPS is the number of loops surrounding the references: the
2264 size of the classic distance/direction vectors. */
2266 static struct data_dependence_relation *
2267 initialize_data_dependence_relation (struct data_reference *a,
2268 struct data_reference *b,
2269 VEC (loop_p, heap) *loop_nest)
2271 struct data_dependence_relation *res;
2272 bool differ_p, known_dependence;
2273 unsigned int i;
2275 res = XNEW (struct data_dependence_relation);
2276 DDR_A (res) = a;
2277 DDR_B (res) = b;
2278 DDR_LOOP_NEST (res) = NULL;
2280 if (a == NULL || b == NULL)
2282 DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2283 return res;
2286 /* When A and B are arrays and their dimensions differ, we directly
2287 initialize the relation to "there is no dependence": chrec_known. */
2288 if (DR_BASE_OBJECT (a) && DR_BASE_OBJECT (b)
2289 && DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b))
2291 DDR_ARE_DEPENDENT (res) = chrec_known;
2292 return res;
2295 if (DR_BASE_ADDRESS (a) && DR_BASE_ADDRESS (b))
2296 known_dependence = base_addr_differ_p (a, b, &differ_p);
2297 else
2298 known_dependence = base_object_differ_p (a, b, &differ_p);
2300 if (!known_dependence)
2302 /* Can't determine whether the data-refs access the same memory
2303 region. */
2304 DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2305 return res;
2308 if (differ_p)
2310 DDR_ARE_DEPENDENT (res) = chrec_known;
2311 return res;
2314 DDR_AFFINE_P (res) = true;
2315 DDR_ARE_DEPENDENT (res) = NULL_TREE;
2316 DDR_SUBSCRIPTS (res) = VEC_alloc (subscript_p, heap, DR_NUM_DIMENSIONS (a));
2317 DDR_LOOP_NEST (res) = loop_nest;
2318 DDR_INNER_LOOP (res) = 0;
2319 DDR_DIR_VECTS (res) = NULL;
2320 DDR_DIST_VECTS (res) = NULL;
2322 for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)
2324 struct subscript *subscript;
2326 subscript = XNEW (struct subscript);
2327 SUB_CONFLICTS_IN_A (subscript) = conflict_fn_not_known ();
2328 SUB_CONFLICTS_IN_B (subscript) = conflict_fn_not_known ();
2329 SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
2330 SUB_DISTANCE (subscript) = chrec_dont_know;
2331 VEC_safe_push (subscript_p, heap, DDR_SUBSCRIPTS (res), subscript);
2334 return res;
2337 /* Frees memory used by the conflict function F. */
2339 static void
2340 free_conflict_function (conflict_function *f)
2342 unsigned i;
2344 if (CF_NONTRIVIAL_P (f))
2346 for (i = 0; i < f->n; i++)
2347 affine_fn_free (f->fns[i]);
2349 free (f);
2352 /* Frees memory used by SUBSCRIPTS. */
2354 static void
2355 free_subscripts (VEC (subscript_p, heap) *subscripts)
2357 unsigned i;
2358 subscript_p s;
2360 for (i = 0; VEC_iterate (subscript_p, subscripts, i, s); i++)
2362 free_conflict_function (s->conflicting_iterations_in_a);
2363 free_conflict_function (s->conflicting_iterations_in_b);
2365 VEC_free (subscript_p, heap, subscripts);
2368 /* Set DDR_ARE_DEPENDENT to CHREC and finalize the subscript overlap
2369 description. */
2371 static inline void
2372 finalize_ddr_dependent (struct data_dependence_relation *ddr,
2373 tree chrec)
2375 if (dump_file && (dump_flags & TDF_DETAILS))
2377 fprintf (dump_file, "(dependence classified: ");
2378 print_generic_expr (dump_file, chrec, 0);
2379 fprintf (dump_file, ")\n");
2382 DDR_ARE_DEPENDENT (ddr) = chrec;
2383 free_subscripts (DDR_SUBSCRIPTS (ddr));
2386 /* The dependence relation DDR cannot be represented by a distance
2387 vector. */
2389 static inline void
2390 non_affine_dependence_relation (struct data_dependence_relation *ddr)
2392 if (dump_file && (dump_flags & TDF_DETAILS))
2393 fprintf (dump_file, "(Dependence relation cannot be represented by distance vector.) \n");
2395 DDR_AFFINE_P (ddr) = false;
2400 /* This section contains the classic Banerjee tests. */
2402 /* Returns true iff CHREC_A and CHREC_B are not dependent on any index
2403 variables, i.e., if the ZIV (Zero Index Variable) test is true. */
2405 static inline bool
2406 ziv_subscript_p (tree chrec_a,
2407 tree chrec_b)
2409 return (evolution_function_is_constant_p (chrec_a)
2410 && evolution_function_is_constant_p (chrec_b));
2413 /* Returns true iff CHREC_A and CHREC_B are dependent on an index
2414 variable, i.e., if the SIV (Single Index Variable) test is true. */
2416 static bool
2417 siv_subscript_p (tree chrec_a,
2418 tree chrec_b)
2420 if ((evolution_function_is_constant_p (chrec_a)
2421 && evolution_function_is_univariate_p (chrec_b))
2422 || (evolution_function_is_constant_p (chrec_b)
2423 && evolution_function_is_univariate_p (chrec_a)))
2424 return true;
2426 if (evolution_function_is_univariate_p (chrec_a)
2427 && evolution_function_is_univariate_p (chrec_b))
2429 switch (TREE_CODE (chrec_a))
2431 case POLYNOMIAL_CHREC:
2432 switch (TREE_CODE (chrec_b))
2434 case POLYNOMIAL_CHREC:
2435 if (CHREC_VARIABLE (chrec_a) != CHREC_VARIABLE (chrec_b))
2436 return false;
2438 default:
2439 return true;
2442 default:
2443 return true;
2447 return false;
2450 /* Creates a conflict function with N dimensions. The affine functions
2451 in each dimension follow. */
2453 static conflict_function *
2454 conflict_fn (unsigned n, ...)
2456 unsigned i;
2457 conflict_function *ret = XCNEW (conflict_function);
2458 va_list ap;
2460 gcc_assert (0 < n && n <= MAX_DIM);
2461 va_start(ap, n);
2463 ret->n = n;
2464 for (i = 0; i < n; i++)
2465 ret->fns[i] = va_arg (ap, affine_fn);
2466 va_end(ap);
2468 return ret;
2471 /* Returns constant affine function with value CST. */
2473 static affine_fn
2474 affine_fn_cst (tree cst)
2476 affine_fn fn = VEC_alloc (tree, heap, 1);
2477 VEC_quick_push (tree, fn, cst);
2478 return fn;
2481 /* Returns affine function with single variable, CST + COEF * x_DIM. */
2483 static affine_fn
2484 affine_fn_univar (tree cst, unsigned dim, tree coef)
2486 affine_fn fn = VEC_alloc (tree, heap, dim + 1);
2487 unsigned i;
2489 gcc_assert (dim > 0);
2490 VEC_quick_push (tree, fn, cst);
2491 for (i = 1; i < dim; i++)
2492 VEC_quick_push (tree, fn, integer_zero_node);
2493 VEC_quick_push (tree, fn, coef);
2494 return fn;
2497 /* Analyze a ZIV (Zero Index Variable) subscript. *OVERLAPS_A and
2498 *OVERLAPS_B are initialized to the functions that describe the
2499 relation between the elements accessed twice by CHREC_A and
2500 CHREC_B. For k >= 0, the following property is verified:
2502 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
2504 static void
2505 analyze_ziv_subscript (tree chrec_a,
2506 tree chrec_b,
2507 conflict_function **overlaps_a,
2508 conflict_function **overlaps_b,
2509 tree *last_conflicts)
2511 tree difference;
2512 dependence_stats.num_ziv++;
2514 if (dump_file && (dump_flags & TDF_DETAILS))
2515 fprintf (dump_file, "(analyze_ziv_subscript \n");
2517 chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
2518 chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
2519 difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
2521 switch (TREE_CODE (difference))
2523 case INTEGER_CST:
2524 if (integer_zerop (difference))
2526 /* The difference is equal to zero: the accessed index
2527 overlaps for each iteration in the loop. */
2528 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2529 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
2530 *last_conflicts = chrec_dont_know;
2531 dependence_stats.num_ziv_dependent++;
2533 else
2535 /* The accesses do not overlap. */
2536 *overlaps_a = conflict_fn_no_dependence ();
2537 *overlaps_b = conflict_fn_no_dependence ();
2538 *last_conflicts = integer_zero_node;
2539 dependence_stats.num_ziv_independent++;
2541 break;
2543 default:
2544 /* We're not sure whether the indexes overlap. For the moment,
2545 conservatively answer "don't know". */
2546 if (dump_file && (dump_flags & TDF_DETAILS))
2547 fprintf (dump_file, "ziv test failed: difference is non-integer.\n");
2549 *overlaps_a = conflict_fn_not_known ();
2550 *overlaps_b = conflict_fn_not_known ();
2551 *last_conflicts = chrec_dont_know;
2552 dependence_stats.num_ziv_unimplemented++;
2553 break;
2556 if (dump_file && (dump_flags & TDF_DETAILS))
2557 fprintf (dump_file, ")\n");
2560 /* Sets NIT to the estimated number of executions of the statements in
2561 LOOP. If CONSERVATIVE is true, we must be sure that NIT is at least as
2562 large as the number of iterations. If we have no reliable estimate,
2563 the function returns false, otherwise returns true. */
2565 bool
2566 estimated_loop_iterations (struct loop *loop, bool conservative,
2567 double_int *nit)
2569 estimate_numbers_of_iterations_loop (loop);
2570 if (conservative)
2572 if (!loop->any_upper_bound)
2573 return false;
2575 *nit = loop->nb_iterations_upper_bound;
2577 else
2579 if (!loop->any_estimate)
2580 return false;
2582 *nit = loop->nb_iterations_estimate;
2585 return true;
2588 /* Similar to estimated_loop_iterations, but returns the estimate only
2589 if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
2590 on the number of iterations of LOOP could not be derived, returns -1. */
2592 HOST_WIDE_INT
2593 estimated_loop_iterations_int (struct loop *loop, bool conservative)
2595 double_int nit;
2596 HOST_WIDE_INT hwi_nit;
2598 if (!estimated_loop_iterations (loop, conservative, &nit))
2599 return -1;
2601 if (!double_int_fits_in_shwi_p (nit))
2602 return -1;
2603 hwi_nit = double_int_to_shwi (nit);
2605 return hwi_nit < 0 ? -1 : hwi_nit;
2608 /* Similar to estimated_loop_iterations, but returns the estimate as a tree,
2609 and only if it fits to the int type. If this is not the case, or the
2610 estimate on the number of iterations of LOOP could not be derived, returns
2611 chrec_dont_know. */
2613 static tree
2614 estimated_loop_iterations_tree (struct loop *loop, bool conservative)
2616 double_int nit;
2617 tree type;
2619 if (!estimated_loop_iterations (loop, conservative, &nit))
2620 return chrec_dont_know;
2622 type = lang_hooks.types.type_for_size (INT_TYPE_SIZE, true);
2623 if (!double_int_fits_to_tree_p (type, nit))
2624 return chrec_dont_know;
2626 return double_int_to_tree (type, nit);
2629 /* Analyze a SIV (Single Index Variable) subscript where CHREC_A is a
2630 constant, and CHREC_B is an affine function. *OVERLAPS_A and
2631 *OVERLAPS_B are initialized to the functions that describe the
2632 relation between the elements accessed twice by CHREC_A and
2633 CHREC_B. For k >= 0, the following property is verified:
2635 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
2637 static void
2638 analyze_siv_subscript_cst_affine (tree chrec_a,
2639 tree chrec_b,
2640 conflict_function **overlaps_a,
2641 conflict_function **overlaps_b,
2642 tree *last_conflicts)
2644 bool value0, value1, value2;
2645 tree difference, tmp;
2647 chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
2648 chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
2649 difference = chrec_fold_minus
2650 (integer_type_node, initial_condition (chrec_b), chrec_a);
2652 if (!chrec_is_positive (initial_condition (difference), &value0))
2654 if (dump_file && (dump_flags & TDF_DETAILS))
2655 fprintf (dump_file, "siv test failed: chrec is not positive.\n");
2657 dependence_stats.num_siv_unimplemented++;
2658 *overlaps_a = conflict_fn_not_known ();
2659 *overlaps_b = conflict_fn_not_known ();
2660 *last_conflicts = chrec_dont_know;
2661 return;
2663 else
2665 if (value0 == false)
2667 if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value1))
2669 if (dump_file && (dump_flags & TDF_DETAILS))
2670 fprintf (dump_file, "siv test failed: chrec not positive.\n");
2672 *overlaps_a = conflict_fn_not_known ();
2673 *overlaps_b = conflict_fn_not_known ();
2674 *last_conflicts = chrec_dont_know;
2675 dependence_stats.num_siv_unimplemented++;
2676 return;
2678 else
2680 if (value1 == true)
2682 /* Example:
2683 chrec_a = 12
2684 chrec_b = {10, +, 1}
2687 if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
2689 HOST_WIDE_INT numiter;
2690 struct loop *loop = get_chrec_loop (chrec_b);
2692 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2693 tmp = fold_build2 (EXACT_DIV_EXPR, integer_type_node,
2694 fold_build1 (ABS_EXPR,
2695 integer_type_node,
2696 difference),
2697 CHREC_RIGHT (chrec_b));
2698 *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
2699 *last_conflicts = integer_one_node;
2702 /* Perform weak-zero siv test to see if overlap is
2703 outside the loop bounds. */
2704 numiter = estimated_loop_iterations_int (loop, true);
2706 if (numiter >= 0
2707 && compare_tree_int (tmp, numiter) > 0)
2709 free_conflict_function (*overlaps_a);
2710 free_conflict_function (*overlaps_b);
2711 *overlaps_a = conflict_fn_no_dependence ();
2712 *overlaps_b = conflict_fn_no_dependence ();
2713 *last_conflicts = integer_zero_node;
2714 dependence_stats.num_siv_independent++;
2715 return;
2717 dependence_stats.num_siv_dependent++;
2718 return;
2721 /* When the step does not divide the difference, there are
2722 no overlaps. */
2723 else
2725 *overlaps_a = conflict_fn_no_dependence ();
2726 *overlaps_b = conflict_fn_no_dependence ();
2727 *last_conflicts = integer_zero_node;
2728 dependence_stats.num_siv_independent++;
2729 return;
2733 else
2735 /* Example:
2736 chrec_a = 12
2737 chrec_b = {10, +, -1}
2739 In this case, chrec_a will not overlap with chrec_b. */
2740 *overlaps_a = conflict_fn_no_dependence ();
2741 *overlaps_b = conflict_fn_no_dependence ();
2742 *last_conflicts = integer_zero_node;
2743 dependence_stats.num_siv_independent++;
2744 return;
2748 else
2750 if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value2))
2752 if (dump_file && (dump_flags & TDF_DETAILS))
2753 fprintf (dump_file, "siv test failed: chrec not positive.\n");
2755 *overlaps_a = conflict_fn_not_known ();
2756 *overlaps_b = conflict_fn_not_known ();
2757 *last_conflicts = chrec_dont_know;
2758 dependence_stats.num_siv_unimplemented++;
2759 return;
2761 else
2763 if (value2 == false)
2765 /* Example:
2766 chrec_a = 3
2767 chrec_b = {10, +, -1}
2769 if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
2771 HOST_WIDE_INT numiter;
2772 struct loop *loop = get_chrec_loop (chrec_b);
2774 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2775 tmp = fold_build2 (EXACT_DIV_EXPR,
2776 integer_type_node, difference,
2777 CHREC_RIGHT (chrec_b));
2778 *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
2779 *last_conflicts = integer_one_node;
2781 /* Perform weak-zero siv test to see if overlap is
2782 outside the loop bounds. */
2783 numiter = estimated_loop_iterations_int (loop, true);
2785 if (numiter >= 0
2786 && compare_tree_int (tmp, numiter) > 0)
2788 free_conflict_function (*overlaps_a);
2789 free_conflict_function (*overlaps_b);
2790 *overlaps_a = conflict_fn_no_dependence ();
2791 *overlaps_b = conflict_fn_no_dependence ();
2792 *last_conflicts = integer_zero_node;
2793 dependence_stats.num_siv_independent++;
2794 return;
2796 dependence_stats.num_siv_dependent++;
2797 return;
2800 /* When the step does not divide the difference, there
2801 are no overlaps. */
2802 else
2804 *overlaps_a = conflict_fn_no_dependence ();
2805 *overlaps_b = conflict_fn_no_dependence ();
2806 *last_conflicts = integer_zero_node;
2807 dependence_stats.num_siv_independent++;
2808 return;
2811 else
2813 /* Example:
2814 chrec_a = 3
2815 chrec_b = {4, +, 1}
2817 In this case, chrec_a will not overlap with chrec_b. */
2818 *overlaps_a = conflict_fn_no_dependence ();
2819 *overlaps_b = conflict_fn_no_dependence ();
2820 *last_conflicts = integer_zero_node;
2821 dependence_stats.num_siv_independent++;
2822 return;
2829 /* Helper recursive function for initializing the matrix A. Returns
2830 the initial value of CHREC. */
2832 static int
2833 initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult)
2835 gcc_assert (chrec);
2837 if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
2838 return int_cst_value (chrec);
2840 A[index][0] = mult * int_cst_value (CHREC_RIGHT (chrec));
2841 return initialize_matrix_A (A, CHREC_LEFT (chrec), index + 1, mult);
2844 #define FLOOR_DIV(x,y) ((x) / (y))
2846 /* Solves the special case of the Diophantine equation:
2847 | {0, +, STEP_A}_x (OVERLAPS_A) = {0, +, STEP_B}_y (OVERLAPS_B)
2849 Computes the descriptions OVERLAPS_A and OVERLAPS_B. NITER is the
2850 number of iterations that loops X and Y run. The overlaps will be
2851 constructed as evolutions in dimension DIM. */
2853 static void
2854 compute_overlap_steps_for_affine_univar (int niter, int step_a, int step_b,
2855 affine_fn *overlaps_a,
2856 affine_fn *overlaps_b,
2857 tree *last_conflicts, int dim)
2859 if (((step_a > 0 && step_b > 0)
2860 || (step_a < 0 && step_b < 0)))
2862 int step_overlaps_a, step_overlaps_b;
2863 int gcd_steps_a_b, last_conflict, tau2;
2865 gcd_steps_a_b = gcd (step_a, step_b);
2866 step_overlaps_a = step_b / gcd_steps_a_b;
2867 step_overlaps_b = step_a / gcd_steps_a_b;
2869 tau2 = FLOOR_DIV (niter, step_overlaps_a);
2870 tau2 = MIN (tau2, FLOOR_DIV (niter, step_overlaps_b));
2871 last_conflict = tau2;
2873 *overlaps_a = affine_fn_univar (integer_zero_node, dim,
2874 build_int_cst (NULL_TREE,
2875 step_overlaps_a));
2876 *overlaps_b = affine_fn_univar (integer_zero_node, dim,
2877 build_int_cst (NULL_TREE,
2878 step_overlaps_b));
2879 *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
2882 else
2884 *overlaps_a = affine_fn_cst (integer_zero_node);
2885 *overlaps_b = affine_fn_cst (integer_zero_node);
2886 *last_conflicts = integer_zero_node;
2890 /* Solves the special case of a Diophantine equation where CHREC_A is
2891 an affine bivariate function, and CHREC_B is an affine univariate
2892 function. For example,
2894 | {{0, +, 1}_x, +, 1335}_y = {0, +, 1336}_z
2896 has the following overlapping functions:
2898 | x (t, u, v) = {{0, +, 1336}_t, +, 1}_v
2899 | y (t, u, v) = {{0, +, 1336}_u, +, 1}_v
2900 | z (t, u, v) = {{{0, +, 1}_t, +, 1335}_u, +, 1}_v
2902 FORNOW: This is a specialized implementation for a case occurring in
2903 a common benchmark. Implement the general algorithm. */
2905 static void
2906 compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b,
2907 conflict_function **overlaps_a,
2908 conflict_function **overlaps_b,
2909 tree *last_conflicts)
2911 bool xz_p, yz_p, xyz_p;
2912 int step_x, step_y, step_z;
2913 HOST_WIDE_INT niter_x, niter_y, niter_z, niter;
2914 affine_fn overlaps_a_xz, overlaps_b_xz;
2915 affine_fn overlaps_a_yz, overlaps_b_yz;
2916 affine_fn overlaps_a_xyz, overlaps_b_xyz;
2917 affine_fn ova1, ova2, ovb;
2918 tree last_conflicts_xz, last_conflicts_yz, last_conflicts_xyz;
2920 step_x = int_cst_value (CHREC_RIGHT (CHREC_LEFT (chrec_a)));
2921 step_y = int_cst_value (CHREC_RIGHT (chrec_a));
2922 step_z = int_cst_value (CHREC_RIGHT (chrec_b));
2924 niter_x = estimated_loop_iterations_int
2925 (get_chrec_loop (CHREC_LEFT (chrec_a)), true);
2926 niter_y = estimated_loop_iterations_int (get_chrec_loop (chrec_a), true);
2927 niter_z = estimated_loop_iterations_int (get_chrec_loop (chrec_b), true);
2929 if (niter_x < 0 || niter_y < 0 || niter_z < 0)
2931 if (dump_file && (dump_flags & TDF_DETAILS))
2932 fprintf (dump_file, "overlap steps test failed: no iteration counts.\n");
2934 *overlaps_a = conflict_fn_not_known ();
2935 *overlaps_b = conflict_fn_not_known ();
2936 *last_conflicts = chrec_dont_know;
2937 return;
2940 niter = MIN (niter_x, niter_z);
2941 compute_overlap_steps_for_affine_univar (niter, step_x, step_z,
2942 &overlaps_a_xz,
2943 &overlaps_b_xz,
2944 &last_conflicts_xz, 1);
2945 niter = MIN (niter_y, niter_z);
2946 compute_overlap_steps_for_affine_univar (niter, step_y, step_z,
2947 &overlaps_a_yz,
2948 &overlaps_b_yz,
2949 &last_conflicts_yz, 2);
2950 niter = MIN (niter_x, niter_z);
2951 niter = MIN (niter_y, niter);
2952 compute_overlap_steps_for_affine_univar (niter, step_x + step_y, step_z,
2953 &overlaps_a_xyz,
2954 &overlaps_b_xyz,
2955 &last_conflicts_xyz, 3);
2957 xz_p = !integer_zerop (last_conflicts_xz);
2958 yz_p = !integer_zerop (last_conflicts_yz);
2959 xyz_p = !integer_zerop (last_conflicts_xyz);
2961 if (xz_p || yz_p || xyz_p)
2963 ova1 = affine_fn_cst (integer_zero_node);
2964 ova2 = affine_fn_cst (integer_zero_node);
2965 ovb = affine_fn_cst (integer_zero_node);
2966 if (xz_p)
2968 affine_fn t0 = ova1;
2969 affine_fn t2 = ovb;
2971 ova1 = affine_fn_plus (ova1, overlaps_a_xz);
2972 ovb = affine_fn_plus (ovb, overlaps_b_xz);
2973 affine_fn_free (t0);
2974 affine_fn_free (t2);
2975 *last_conflicts = last_conflicts_xz;
2977 if (yz_p)
2979 affine_fn t0 = ova2;
2980 affine_fn t2 = ovb;
2982 ova2 = affine_fn_plus (ova2, overlaps_a_yz);
2983 ovb = affine_fn_plus (ovb, overlaps_b_yz);
2984 affine_fn_free (t0);
2985 affine_fn_free (t2);
2986 *last_conflicts = last_conflicts_yz;
2988 if (xyz_p)
2990 affine_fn t0 = ova1;
2991 affine_fn t2 = ova2;
2992 affine_fn t4 = ovb;
2994 ova1 = affine_fn_plus (ova1, overlaps_a_xyz);
2995 ova2 = affine_fn_plus (ova2, overlaps_a_xyz);
2996 ovb = affine_fn_plus (ovb, overlaps_b_xyz);
2997 affine_fn_free (t0);
2998 affine_fn_free (t2);
2999 affine_fn_free (t4);
3000 *last_conflicts = last_conflicts_xyz;
3002 *overlaps_a = conflict_fn (2, ova1, ova2);
3003 *overlaps_b = conflict_fn (1, ovb);
3005 else
3007 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3008 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3009 *last_conflicts = integer_zero_node;
3012 affine_fn_free (overlaps_a_xz);
3013 affine_fn_free (overlaps_b_xz);
3014 affine_fn_free (overlaps_a_yz);
3015 affine_fn_free (overlaps_b_yz);
3016 affine_fn_free (overlaps_a_xyz);
3017 affine_fn_free (overlaps_b_xyz);
3020 /* Determines the overlapping elements due to accesses CHREC_A and
3021 CHREC_B, that are affine functions. This function cannot handle
3022 symbolic evolution functions, ie. when initial conditions are
3023 parameters, because it uses lambda matrices of integers. */
3025 static void
3026 analyze_subscript_affine_affine (tree chrec_a,
3027 tree chrec_b,
3028 conflict_function **overlaps_a,
3029 conflict_function **overlaps_b,
3030 tree *last_conflicts)
3032 unsigned nb_vars_a, nb_vars_b, dim;
3033 int init_a, init_b, gamma, gcd_alpha_beta;
3034 int tau1, tau2;
3035 lambda_matrix A, U, S;
3037 if (eq_evolutions_p (chrec_a, chrec_b))
3039 /* The accessed index overlaps for each iteration in the
3040 loop. */
3041 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3042 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3043 *last_conflicts = chrec_dont_know;
3044 return;
3046 if (dump_file && (dump_flags & TDF_DETAILS))
3047 fprintf (dump_file, "(analyze_subscript_affine_affine \n");
3049 /* For determining the initial intersection, we have to solve a
3050 Diophantine equation. This is the most time consuming part.
3052 For answering to the question: "Is there a dependence?" we have
3053 to prove that there exists a solution to the Diophantine
3054 equation, and that the solution is in the iteration domain,
3055 i.e. the solution is positive or zero, and that the solution
3056 happens before the upper bound loop.nb_iterations. Otherwise
3057 there is no dependence. This function outputs a description of
3058 the iterations that hold the intersections. */
3060 nb_vars_a = nb_vars_in_chrec (chrec_a);
3061 nb_vars_b = nb_vars_in_chrec (chrec_b);
3063 dim = nb_vars_a + nb_vars_b;
3064 U = lambda_matrix_new (dim, dim);
3065 A = lambda_matrix_new (dim, 1);
3066 S = lambda_matrix_new (dim, 1);
3068 init_a = initialize_matrix_A (A, chrec_a, 0, 1);
3069 init_b = initialize_matrix_A (A, chrec_b, nb_vars_a, -1);
3070 gamma = init_b - init_a;
3072 /* Don't do all the hard work of solving the Diophantine equation
3073 when we already know the solution: for example,
3074 | {3, +, 1}_1
3075 | {3, +, 4}_2
3076 | gamma = 3 - 3 = 0.
3077 Then the first overlap occurs during the first iterations:
3078 | {3, +, 1}_1 ({0, +, 4}_x) = {3, +, 4}_2 ({0, +, 1}_x)
3080 if (gamma == 0)
3082 if (nb_vars_a == 1 && nb_vars_b == 1)
3084 int step_a, step_b;
3085 HOST_WIDE_INT niter, niter_a, niter_b;
3086 affine_fn ova, ovb;
3088 niter_a = estimated_loop_iterations_int
3089 (get_chrec_loop (chrec_a), true);
3090 niter_b = estimated_loop_iterations_int
3091 (get_chrec_loop (chrec_b), true);
3092 if (niter_a < 0 || niter_b < 0)
3094 if (dump_file && (dump_flags & TDF_DETAILS))
3095 fprintf (dump_file, "affine-affine test failed: missing iteration counts.\n");
3096 *overlaps_a = conflict_fn_not_known ();
3097 *overlaps_b = conflict_fn_not_known ();
3098 *last_conflicts = chrec_dont_know;
3099 goto end_analyze_subs_aa;
3102 niter = MIN (niter_a, niter_b);
3104 step_a = int_cst_value (CHREC_RIGHT (chrec_a));
3105 step_b = int_cst_value (CHREC_RIGHT (chrec_b));
3107 compute_overlap_steps_for_affine_univar (niter, step_a, step_b,
3108 &ova, &ovb,
3109 last_conflicts, 1);
3110 *overlaps_a = conflict_fn (1, ova);
3111 *overlaps_b = conflict_fn (1, ovb);
3114 else if (nb_vars_a == 2 && nb_vars_b == 1)
3115 compute_overlap_steps_for_affine_1_2
3116 (chrec_a, chrec_b, overlaps_a, overlaps_b, last_conflicts);
3118 else if (nb_vars_a == 1 && nb_vars_b == 2)
3119 compute_overlap_steps_for_affine_1_2
3120 (chrec_b, chrec_a, overlaps_b, overlaps_a, last_conflicts);
3122 else
3124 if (dump_file && (dump_flags & TDF_DETAILS))
3125 fprintf (dump_file, "affine-affine test failed: too many variables.\n");
3126 *overlaps_a = conflict_fn_not_known ();
3127 *overlaps_b = conflict_fn_not_known ();
3128 *last_conflicts = chrec_dont_know;
3130 goto end_analyze_subs_aa;
3133 /* U.A = S */
3134 lambda_matrix_right_hermite (A, dim, 1, S, U);
3136 if (S[0][0] < 0)
3138 S[0][0] *= -1;
3139 lambda_matrix_row_negate (U, dim, 0);
3141 gcd_alpha_beta = S[0][0];
3143 /* Something went wrong: for example in {1, +, 0}_5 vs. {0, +, 0}_5,
3144 but that is a quite strange case. Instead of ICEing, answer
3145 don't know. */
3146 if (gcd_alpha_beta == 0)
3148 *overlaps_a = conflict_fn_not_known ();
3149 *overlaps_b = conflict_fn_not_known ();
3150 *last_conflicts = chrec_dont_know;
3151 goto end_analyze_subs_aa;
3154 /* The classic "gcd-test". */
3155 if (!int_divides_p (gcd_alpha_beta, gamma))
3157 /* The "gcd-test" has determined that there is no integer
3158 solution, i.e. there is no dependence. */
3159 *overlaps_a = conflict_fn_no_dependence ();
3160 *overlaps_b = conflict_fn_no_dependence ();
3161 *last_conflicts = integer_zero_node;
3164 /* Both access functions are univariate. This includes SIV and MIV cases. */
3165 else if (nb_vars_a == 1 && nb_vars_b == 1)
3167 /* Both functions should have the same evolution sign. */
3168 if (((A[0][0] > 0 && -A[1][0] > 0)
3169 || (A[0][0] < 0 && -A[1][0] < 0)))
3171 /* The solutions are given by:
3173 | [GAMMA/GCD_ALPHA_BETA t].[u11 u12] = [x0]
3174 | [u21 u22] [y0]
3176 For a given integer t. Using the following variables,
3178 | i0 = u11 * gamma / gcd_alpha_beta
3179 | j0 = u12 * gamma / gcd_alpha_beta
3180 | i1 = u21
3181 | j1 = u22
3183 the solutions are:
3185 | x0 = i0 + i1 * t,
3186 | y0 = j0 + j1 * t. */
3188 int i0, j0, i1, j1;
3190 /* X0 and Y0 are the first iterations for which there is a
3191 dependence. X0, Y0 are two solutions of the Diophantine
3192 equation: chrec_a (X0) = chrec_b (Y0). */
3193 int x0, y0;
3194 int niter, niter_a, niter_b;
3196 niter_a = estimated_loop_iterations_int
3197 (get_chrec_loop (chrec_a), true);
3198 niter_b = estimated_loop_iterations_int
3199 (get_chrec_loop (chrec_b), true);
3201 if (niter_a < 0 || niter_b < 0)
3203 if (dump_file && (dump_flags & TDF_DETAILS))
3204 fprintf (dump_file, "affine-affine test failed: missing iteration counts.\n");
3205 *overlaps_a = conflict_fn_not_known ();
3206 *overlaps_b = conflict_fn_not_known ();
3207 *last_conflicts = chrec_dont_know;
3208 goto end_analyze_subs_aa;
3211 niter = MIN (niter_a, niter_b);
3213 i0 = U[0][0] * gamma / gcd_alpha_beta;
3214 j0 = U[0][1] * gamma / gcd_alpha_beta;
3215 i1 = U[1][0];
3216 j1 = U[1][1];
3218 if ((i1 == 0 && i0 < 0)
3219 || (j1 == 0 && j0 < 0))
3221 /* There is no solution.
3222 FIXME: The case "i0 > nb_iterations, j0 > nb_iterations"
3223 falls in here, but for the moment we don't look at the
3224 upper bound of the iteration domain. */
3225 *overlaps_a = conflict_fn_no_dependence ();
3226 *overlaps_b = conflict_fn_no_dependence ();
3227 *last_conflicts = integer_zero_node;
3230 else
3232 if (i1 > 0)
3234 tau1 = CEIL (-i0, i1);
3235 tau2 = FLOOR_DIV (niter - i0, i1);
3237 if (j1 > 0)
3239 int last_conflict, min_multiple;
3240 tau1 = MAX (tau1, CEIL (-j0, j1));
3241 tau2 = MIN (tau2, FLOOR_DIV (niter - j0, j1));
3243 x0 = i1 * tau1 + i0;
3244 y0 = j1 * tau1 + j0;
3246 /* At this point (x0, y0) is one of the
3247 solutions to the Diophantine equation. The
3248 next step has to compute the smallest
3249 positive solution: the first conflicts. */
3250 min_multiple = MIN (x0 / i1, y0 / j1);
3251 x0 -= i1 * min_multiple;
3252 y0 -= j1 * min_multiple;
3254 tau1 = (x0 - i0)/i1;
3255 last_conflict = tau2 - tau1;
3257 /* If the overlap occurs outside of the bounds of the
3258 loop, there is no dependence. */
3259 if (x0 > niter || y0 > niter)
3261 *overlaps_a = conflict_fn_no_dependence ();
3262 *overlaps_b = conflict_fn_no_dependence ();
3263 *last_conflicts = integer_zero_node;
3265 else
3267 *overlaps_a
3268 = conflict_fn (1,
3269 affine_fn_univar (build_int_cst (NULL_TREE, x0),
3271 build_int_cst (NULL_TREE, i1)));
3272 *overlaps_b
3273 = conflict_fn (1,
3274 affine_fn_univar (build_int_cst (NULL_TREE, y0),
3276 build_int_cst (NULL_TREE, j1)));
3277 *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
3280 else
3282 /* FIXME: For the moment, the upper bound of the
3283 iteration domain for j is not checked. */
3284 if (dump_file && (dump_flags & TDF_DETAILS))
3285 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3286 *overlaps_a = conflict_fn_not_known ();
3287 *overlaps_b = conflict_fn_not_known ();
3288 *last_conflicts = chrec_dont_know;
3292 else
3294 /* FIXME: For the moment, the upper bound of the
3295 iteration domain for i is not checked. */
3296 if (dump_file && (dump_flags & TDF_DETAILS))
3297 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3298 *overlaps_a = conflict_fn_not_known ();
3299 *overlaps_b = conflict_fn_not_known ();
3300 *last_conflicts = chrec_dont_know;
3304 else
3306 if (dump_file && (dump_flags & TDF_DETAILS))
3307 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3308 *overlaps_a = conflict_fn_not_known ();
3309 *overlaps_b = conflict_fn_not_known ();
3310 *last_conflicts = chrec_dont_know;
3314 else
3316 if (dump_file && (dump_flags & TDF_DETAILS))
3317 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3318 *overlaps_a = conflict_fn_not_known ();
3319 *overlaps_b = conflict_fn_not_known ();
3320 *last_conflicts = chrec_dont_know;
3323 end_analyze_subs_aa:
3324 if (dump_file && (dump_flags & TDF_DETAILS))
3326 fprintf (dump_file, " (overlaps_a = ");
3327 dump_conflict_function (dump_file, *overlaps_a);
3328 fprintf (dump_file, ")\n (overlaps_b = ");
3329 dump_conflict_function (dump_file, *overlaps_b);
3330 fprintf (dump_file, ")\n");
3331 fprintf (dump_file, ")\n");
3335 /* Returns true when analyze_subscript_affine_affine can be used for
3336 determining the dependence relation between chrec_a and chrec_b,
3337 that contain symbols. This function modifies chrec_a and chrec_b
3338 such that the analysis result is the same, and such that they don't
3339 contain symbols, and then can safely be passed to the analyzer.
3341 Example: The analysis of the following tuples of evolutions produce
3342 the same results: {x+1, +, 1}_1 vs. {x+3, +, 1}_1, and {-2, +, 1}_1
3343 vs. {0, +, 1}_1
3345 {x+1, +, 1}_1 ({2, +, 1}_1) = {x+3, +, 1}_1 ({0, +, 1}_1)
3346 {-2, +, 1}_1 ({2, +, 1}_1) = {0, +, 1}_1 ({0, +, 1}_1)
3349 static bool
3350 can_use_analyze_subscript_affine_affine (tree *chrec_a, tree *chrec_b)
3352 tree diff, type, left_a, left_b, right_b;
3354 if (chrec_contains_symbols (CHREC_RIGHT (*chrec_a))
3355 || chrec_contains_symbols (CHREC_RIGHT (*chrec_b)))
3356 /* FIXME: For the moment not handled. Might be refined later. */
3357 return false;
3359 type = chrec_type (*chrec_a);
3360 left_a = CHREC_LEFT (*chrec_a);
3361 left_b = chrec_convert (type, CHREC_LEFT (*chrec_b), NULL_TREE);
3362 diff = chrec_fold_minus (type, left_a, left_b);
3364 if (!evolution_function_is_constant_p (diff))
3365 return false;
3367 if (dump_file && (dump_flags & TDF_DETAILS))
3368 fprintf (dump_file, "can_use_subscript_aff_aff_for_symbolic \n");
3370 *chrec_a = build_polynomial_chrec (CHREC_VARIABLE (*chrec_a),
3371 diff, CHREC_RIGHT (*chrec_a));
3372 right_b = chrec_convert (type, CHREC_RIGHT (*chrec_b), NULL_TREE);
3373 *chrec_b = build_polynomial_chrec (CHREC_VARIABLE (*chrec_b),
3374 build_int_cst (type, 0),
3375 right_b);
3376 return true;
3379 /* Analyze a SIV (Single Index Variable) subscript. *OVERLAPS_A and
3380 *OVERLAPS_B are initialized to the functions that describe the
3381 relation between the elements accessed twice by CHREC_A and
3382 CHREC_B. For k >= 0, the following property is verified:
3384 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
3386 static void
3387 analyze_siv_subscript (tree chrec_a,
3388 tree chrec_b,
3389 conflict_function **overlaps_a,
3390 conflict_function **overlaps_b,
3391 tree *last_conflicts)
3393 dependence_stats.num_siv++;
3395 if (dump_file && (dump_flags & TDF_DETAILS))
3396 fprintf (dump_file, "(analyze_siv_subscript \n");
3398 if (evolution_function_is_constant_p (chrec_a)
3399 && evolution_function_is_affine_p (chrec_b))
3400 analyze_siv_subscript_cst_affine (chrec_a, chrec_b,
3401 overlaps_a, overlaps_b, last_conflicts);
3403 else if (evolution_function_is_affine_p (chrec_a)
3404 && evolution_function_is_constant_p (chrec_b))
3405 analyze_siv_subscript_cst_affine (chrec_b, chrec_a,
3406 overlaps_b, overlaps_a, last_conflicts);
3408 else if (evolution_function_is_affine_p (chrec_a)
3409 && evolution_function_is_affine_p (chrec_b))
3411 if (!chrec_contains_symbols (chrec_a)
3412 && !chrec_contains_symbols (chrec_b))
3414 analyze_subscript_affine_affine (chrec_a, chrec_b,
3415 overlaps_a, overlaps_b,
3416 last_conflicts);
3418 if (CF_NOT_KNOWN_P (*overlaps_a)
3419 || CF_NOT_KNOWN_P (*overlaps_b))
3420 dependence_stats.num_siv_unimplemented++;
3421 else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3422 || CF_NO_DEPENDENCE_P (*overlaps_b))
3423 dependence_stats.num_siv_independent++;
3424 else
3425 dependence_stats.num_siv_dependent++;
3427 else if (can_use_analyze_subscript_affine_affine (&chrec_a,
3428 &chrec_b))
3430 analyze_subscript_affine_affine (chrec_a, chrec_b,
3431 overlaps_a, overlaps_b,
3432 last_conflicts);
3433 /* FIXME: The number of iterations is a symbolic expression.
3434 Compute it properly. */
3435 *last_conflicts = chrec_dont_know;
3437 if (CF_NOT_KNOWN_P (*overlaps_a)
3438 || CF_NOT_KNOWN_P (*overlaps_b))
3439 dependence_stats.num_siv_unimplemented++;
3440 else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3441 || CF_NO_DEPENDENCE_P (*overlaps_b))
3442 dependence_stats.num_siv_independent++;
3443 else
3444 dependence_stats.num_siv_dependent++;
3446 else
3447 goto siv_subscript_dontknow;
3450 else
3452 siv_subscript_dontknow:;
3453 if (dump_file && (dump_flags & TDF_DETAILS))
3454 fprintf (dump_file, "siv test failed: unimplemented.\n");
3455 *overlaps_a = conflict_fn_not_known ();
3456 *overlaps_b = conflict_fn_not_known ();
3457 *last_conflicts = chrec_dont_know;
3458 dependence_stats.num_siv_unimplemented++;
3461 if (dump_file && (dump_flags & TDF_DETAILS))
3462 fprintf (dump_file, ")\n");
3465 /* Returns false if we can prove that the greatest common divisor of the steps
3466 of CHREC does not divide CST, false otherwise. */
3468 static bool
3469 gcd_of_steps_may_divide_p (tree chrec, tree cst)
3471 HOST_WIDE_INT cd = 0, val;
3472 tree step;
3474 if (!host_integerp (cst, 0))
3475 return true;
3476 val = tree_low_cst (cst, 0);
3478 while (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
3480 step = CHREC_RIGHT (chrec);
3481 if (!host_integerp (step, 0))
3482 return true;
3483 cd = gcd (cd, tree_low_cst (step, 0));
3484 chrec = CHREC_LEFT (chrec);
3487 return val % cd == 0;
3490 /* Analyze a MIV (Multiple Index Variable) subscript. *OVERLAPS_A and
3491 *OVERLAPS_B are initialized to the functions that describe the
3492 relation between the elements accessed twice by CHREC_A and
3493 CHREC_B. For k >= 0, the following property is verified:
3495 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
3497 static void
3498 analyze_miv_subscript (tree chrec_a,
3499 tree chrec_b,
3500 conflict_function **overlaps_a,
3501 conflict_function **overlaps_b,
3502 tree *last_conflicts)
3504 /* FIXME: This is a MIV subscript, not yet handled.
3505 Example: (A[{1, +, 1}_1] vs. A[{1, +, 1}_2]) that comes from
3506 (A[i] vs. A[j]).
3508 In the SIV test we had to solve a Diophantine equation with two
3509 variables. In the MIV case we have to solve a Diophantine
3510 equation with 2*n variables (if the subscript uses n IVs).
3512 tree difference;
3513 dependence_stats.num_miv++;
3514 if (dump_file && (dump_flags & TDF_DETAILS))
3515 fprintf (dump_file, "(analyze_miv_subscript \n");
3517 chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
3518 chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
3519 difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
3521 if (eq_evolutions_p (chrec_a, chrec_b))
3523 /* Access functions are the same: all the elements are accessed
3524 in the same order. */
3525 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3526 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3527 *last_conflicts = estimated_loop_iterations_tree
3528 (get_chrec_loop (chrec_a), true);
3529 dependence_stats.num_miv_dependent++;
3532 else if (evolution_function_is_constant_p (difference)
3533 /* For the moment, the following is verified:
3534 evolution_function_is_affine_multivariate_p (chrec_a) */
3535 && !gcd_of_steps_may_divide_p (chrec_a, difference))
3537 /* testsuite/.../ssa-chrec-33.c
3538 {{21, +, 2}_1, +, -2}_2 vs. {{20, +, 2}_1, +, -2}_2
3540 The difference is 1, and all the evolution steps are multiples
3541 of 2, consequently there are no overlapping elements. */
3542 *overlaps_a = conflict_fn_no_dependence ();
3543 *overlaps_b = conflict_fn_no_dependence ();
3544 *last_conflicts = integer_zero_node;
3545 dependence_stats.num_miv_independent++;
3548 else if (evolution_function_is_affine_multivariate_p (chrec_a)
3549 && !chrec_contains_symbols (chrec_a)
3550 && evolution_function_is_affine_multivariate_p (chrec_b)
3551 && !chrec_contains_symbols (chrec_b))
3553 /* testsuite/.../ssa-chrec-35.c
3554 {0, +, 1}_2 vs. {0, +, 1}_3
3555 the overlapping elements are respectively located at iterations:
3556 {0, +, 1}_x and {0, +, 1}_x,
3557 in other words, we have the equality:
3558 {0, +, 1}_2 ({0, +, 1}_x) = {0, +, 1}_3 ({0, +, 1}_x)
3560 Other examples:
3561 {{0, +, 1}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y) =
3562 {0, +, 1}_1 ({{0, +, 1}_x, +, 2}_y)
3564 {{0, +, 2}_1, +, 3}_2 ({0, +, 1}_y, {0, +, 1}_x) =
3565 {{0, +, 3}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y)
3567 analyze_subscript_affine_affine (chrec_a, chrec_b,
3568 overlaps_a, overlaps_b, last_conflicts);
3570 if (CF_NOT_KNOWN_P (*overlaps_a)
3571 || CF_NOT_KNOWN_P (*overlaps_b))
3572 dependence_stats.num_miv_unimplemented++;
3573 else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3574 || CF_NO_DEPENDENCE_P (*overlaps_b))
3575 dependence_stats.num_miv_independent++;
3576 else
3577 dependence_stats.num_miv_dependent++;
3580 else
3582 /* When the analysis is too difficult, answer "don't know". */
3583 if (dump_file && (dump_flags & TDF_DETAILS))
3584 fprintf (dump_file, "analyze_miv_subscript test failed: unimplemented.\n");
3586 *overlaps_a = conflict_fn_not_known ();
3587 *overlaps_b = conflict_fn_not_known ();
3588 *last_conflicts = chrec_dont_know;
3589 dependence_stats.num_miv_unimplemented++;
3592 if (dump_file && (dump_flags & TDF_DETAILS))
3593 fprintf (dump_file, ")\n");
3596 /* Determines the iterations for which CHREC_A is equal to CHREC_B.
3597 OVERLAP_ITERATIONS_A and OVERLAP_ITERATIONS_B are initialized with
3598 two functions that describe the iterations that contain conflicting
3599 elements.
3601 Remark: For an integer k >= 0, the following equality is true:
3603 CHREC_A (OVERLAP_ITERATIONS_A (k)) == CHREC_B (OVERLAP_ITERATIONS_B (k)).
3606 static void
3607 analyze_overlapping_iterations (tree chrec_a,
3608 tree chrec_b,
3609 conflict_function **overlap_iterations_a,
3610 conflict_function **overlap_iterations_b,
3611 tree *last_conflicts)
3613 dependence_stats.num_subscript_tests++;
3615 if (dump_file && (dump_flags & TDF_DETAILS))
3617 fprintf (dump_file, "(analyze_overlapping_iterations \n");
3618 fprintf (dump_file, " (chrec_a = ");
3619 print_generic_expr (dump_file, chrec_a, 0);
3620 fprintf (dump_file, ")\n (chrec_b = ");
3621 print_generic_expr (dump_file, chrec_b, 0);
3622 fprintf (dump_file, ")\n");
3625 if (chrec_a == NULL_TREE
3626 || chrec_b == NULL_TREE
3627 || chrec_contains_undetermined (chrec_a)
3628 || chrec_contains_undetermined (chrec_b))
3630 dependence_stats.num_subscript_undetermined++;
3632 *overlap_iterations_a = conflict_fn_not_known ();
3633 *overlap_iterations_b = conflict_fn_not_known ();
3636 /* If they are the same chrec, and are affine, they overlap
3637 on every iteration. */
3638 else if (eq_evolutions_p (chrec_a, chrec_b)
3639 && evolution_function_is_affine_multivariate_p (chrec_a))
3641 dependence_stats.num_same_subscript_function++;
3642 *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3643 *overlap_iterations_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3644 *last_conflicts = chrec_dont_know;
3647 /* If they aren't the same, and aren't affine, we can't do anything
3648 yet. */
3649 else if ((chrec_contains_symbols (chrec_a)
3650 || chrec_contains_symbols (chrec_b))
3651 && (!evolution_function_is_affine_multivariate_p (chrec_a)
3652 || !evolution_function_is_affine_multivariate_p (chrec_b)))
3654 dependence_stats.num_subscript_undetermined++;
3655 *overlap_iterations_a = conflict_fn_not_known ();
3656 *overlap_iterations_b = conflict_fn_not_known ();
3659 else if (ziv_subscript_p (chrec_a, chrec_b))
3660 analyze_ziv_subscript (chrec_a, chrec_b,
3661 overlap_iterations_a, overlap_iterations_b,
3662 last_conflicts);
3664 else if (siv_subscript_p (chrec_a, chrec_b))
3665 analyze_siv_subscript (chrec_a, chrec_b,
3666 overlap_iterations_a, overlap_iterations_b,
3667 last_conflicts);
3669 else
3670 analyze_miv_subscript (chrec_a, chrec_b,
3671 overlap_iterations_a, overlap_iterations_b,
3672 last_conflicts);
3674 if (dump_file && (dump_flags & TDF_DETAILS))
3676 fprintf (dump_file, " (overlap_iterations_a = ");
3677 dump_conflict_function (dump_file, *overlap_iterations_a);
3678 fprintf (dump_file, ")\n (overlap_iterations_b = ");
3679 dump_conflict_function (dump_file, *overlap_iterations_b);
3680 fprintf (dump_file, ")\n");
3681 fprintf (dump_file, ")\n");
3685 /* Helper function for uniquely inserting distance vectors. */
3687 static void
3688 save_dist_v (struct data_dependence_relation *ddr, lambda_vector dist_v)
3690 unsigned i;
3691 lambda_vector v;
3693 for (i = 0; VEC_iterate (lambda_vector, DDR_DIST_VECTS (ddr), i, v); i++)
3694 if (lambda_vector_equal (v, dist_v, DDR_NB_LOOPS (ddr)))
3695 return;
3697 VEC_safe_push (lambda_vector, heap, DDR_DIST_VECTS (ddr), dist_v);
3700 /* Helper function for uniquely inserting direction vectors. */
3702 static void
3703 save_dir_v (struct data_dependence_relation *ddr, lambda_vector dir_v)
3705 unsigned i;
3706 lambda_vector v;
3708 for (i = 0; VEC_iterate (lambda_vector, DDR_DIR_VECTS (ddr), i, v); i++)
3709 if (lambda_vector_equal (v, dir_v, DDR_NB_LOOPS (ddr)))
3710 return;
3712 VEC_safe_push (lambda_vector, heap, DDR_DIR_VECTS (ddr), dir_v);
3715 /* Add a distance of 1 on all the loops outer than INDEX. If we
3716 haven't yet determined a distance for this outer loop, push a new
3717 distance vector composed of the previous distance, and a distance
3718 of 1 for this outer loop. Example:
3720 | loop_1
3721 | loop_2
3722 | A[10]
3723 | endloop_2
3724 | endloop_1
3726 Saved vectors are of the form (dist_in_1, dist_in_2). First, we
3727 save (0, 1), then we have to save (1, 0). */
3729 static void
3730 add_outer_distances (struct data_dependence_relation *ddr,
3731 lambda_vector dist_v, int index)
3733 /* For each outer loop where init_v is not set, the accesses are
3734 in dependence of distance 1 in the loop. */
3735 while (--index >= 0)
3737 lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3738 lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
3739 save_v[index] = 1;
3740 save_dist_v (ddr, save_v);
3744 /* Return false when fail to represent the data dependence as a
3745 distance vector. INIT_B is set to true when a component has been
3746 added to the distance vector DIST_V. INDEX_CARRY is then set to
3747 the index in DIST_V that carries the dependence. */
3749 static bool
3750 build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
3751 struct data_reference *ddr_a,
3752 struct data_reference *ddr_b,
3753 lambda_vector dist_v, bool *init_b,
3754 int *index_carry)
3756 unsigned i;
3757 lambda_vector init_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3759 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3761 tree access_fn_a, access_fn_b;
3762 struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
3764 if (chrec_contains_undetermined (SUB_DISTANCE (subscript)))
3766 non_affine_dependence_relation (ddr);
3767 return false;
3770 access_fn_a = DR_ACCESS_FN (ddr_a, i);
3771 access_fn_b = DR_ACCESS_FN (ddr_b, i);
3773 if (TREE_CODE (access_fn_a) == POLYNOMIAL_CHREC
3774 && TREE_CODE (access_fn_b) == POLYNOMIAL_CHREC)
3776 int dist, index;
3777 int index_a = index_in_loop_nest (CHREC_VARIABLE (access_fn_a),
3778 DDR_LOOP_NEST (ddr));
3779 int index_b = index_in_loop_nest (CHREC_VARIABLE (access_fn_b),
3780 DDR_LOOP_NEST (ddr));
3782 /* The dependence is carried by the outermost loop. Example:
3783 | loop_1
3784 | A[{4, +, 1}_1]
3785 | loop_2
3786 | A[{5, +, 1}_2]
3787 | endloop_2
3788 | endloop_1
3789 In this case, the dependence is carried by loop_1. */
3790 index = index_a < index_b ? index_a : index_b;
3791 *index_carry = MIN (index, *index_carry);
3793 if (chrec_contains_undetermined (SUB_DISTANCE (subscript)))
3795 non_affine_dependence_relation (ddr);
3796 return false;
3799 dist = int_cst_value (SUB_DISTANCE (subscript));
3801 /* This is the subscript coupling test. If we have already
3802 recorded a distance for this loop (a distance coming from
3803 another subscript), it should be the same. For example,
3804 in the following code, there is no dependence:
3806 | loop i = 0, N, 1
3807 | T[i+1][i] = ...
3808 | ... = T[i][i]
3809 | endloop
3811 if (init_v[index] != 0 && dist_v[index] != dist)
3813 finalize_ddr_dependent (ddr, chrec_known);
3814 return false;
3817 dist_v[index] = dist;
3818 init_v[index] = 1;
3819 *init_b = true;
3821 else
3823 /* This can be for example an affine vs. constant dependence
3824 (T[i] vs. T[3]) that is not an affine dependence and is
3825 not representable as a distance vector. */
3826 non_affine_dependence_relation (ddr);
3827 return false;
3831 return true;
3834 /* Return true when the DDR contains two data references that have the
3835 same access functions. */
3837 static bool
3838 same_access_functions (struct data_dependence_relation *ddr)
3840 unsigned i;
3842 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3843 if (!eq_evolutions_p (DR_ACCESS_FN (DDR_A (ddr), i),
3844 DR_ACCESS_FN (DDR_B (ddr), i)))
3845 return false;
3847 return true;
3850 /* Return true when the DDR contains only constant access functions. */
3852 static bool
3853 constant_access_functions (struct data_dependence_relation *ddr)
3855 unsigned i;
3857 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3858 if (!evolution_function_is_constant_p (DR_ACCESS_FN (DDR_A (ddr), i))
3859 || !evolution_function_is_constant_p (DR_ACCESS_FN (DDR_B (ddr), i)))
3860 return false;
3862 return true;
3866 /* Helper function for the case where DDR_A and DDR_B are the same
3867 multivariate access function. */
3869 static void
3870 add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
3872 int x_1, x_2;
3873 tree c_1 = CHREC_LEFT (c_2);
3874 tree c_0 = CHREC_LEFT (c_1);
3875 lambda_vector dist_v;
3876 int v1, v2, cd;
3878 /* Polynomials with more than 2 variables are not handled yet. */
3879 if (TREE_CODE (c_0) != INTEGER_CST)
3881 DDR_ARE_DEPENDENT (ddr) = chrec_dont_know;
3882 return;
3885 x_2 = index_in_loop_nest (CHREC_VARIABLE (c_2), DDR_LOOP_NEST (ddr));
3886 x_1 = index_in_loop_nest (CHREC_VARIABLE (c_1), DDR_LOOP_NEST (ddr));
3888 /* For "{{0, +, 2}_1, +, 3}_2" the distance vector is (3, -2). */
3889 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3890 v1 = int_cst_value (CHREC_RIGHT (c_1));
3891 v2 = int_cst_value (CHREC_RIGHT (c_2));
3892 cd = gcd (v1, v2);
3893 v1 /= cd;
3894 v2 /= cd;
3896 if (v2 < 0)
3898 v2 = -v2;
3899 v1 = -v1;
3902 dist_v[x_1] = v2;
3903 dist_v[x_2] = -v1;
3904 save_dist_v (ddr, dist_v);
3906 add_outer_distances (ddr, dist_v, x_1);
3909 /* Helper function for the case where DDR_A and DDR_B are the same
3910 access functions. */
3912 static void
3913 add_other_self_distances (struct data_dependence_relation *ddr)
3915 lambda_vector dist_v;
3916 unsigned i;
3917 int index_carry = DDR_NB_LOOPS (ddr);
3919 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3921 tree access_fun = DR_ACCESS_FN (DDR_A (ddr), i);
3923 if (TREE_CODE (access_fun) == POLYNOMIAL_CHREC)
3925 if (!evolution_function_is_univariate_p (access_fun))
3927 if (DDR_NUM_SUBSCRIPTS (ddr) != 1)
3929 DDR_ARE_DEPENDENT (ddr) = chrec_dont_know;
3930 return;
3933 add_multivariate_self_dist (ddr, DR_ACCESS_FN (DDR_A (ddr), 0));
3934 return;
3937 index_carry = MIN (index_carry,
3938 index_in_loop_nest (CHREC_VARIABLE (access_fun),
3939 DDR_LOOP_NEST (ddr)));
3943 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3944 add_outer_distances (ddr, dist_v, index_carry);
3947 static void
3948 insert_innermost_unit_dist_vector (struct data_dependence_relation *ddr)
3950 lambda_vector dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3952 dist_v[DDR_INNER_LOOP (ddr)] = 1;
3953 save_dist_v (ddr, dist_v);
3956 /* Adds a unit distance vector to DDR when there is a 0 overlap. This
3957 is the case for example when access functions are the same and
3958 equal to a constant, as in:
3960 | loop_1
3961 | A[3] = ...
3962 | ... = A[3]
3963 | endloop_1
3965 in which case the distance vectors are (0) and (1). */
3967 static void
3968 add_distance_for_zero_overlaps (struct data_dependence_relation *ddr)
3970 unsigned i, j;
3972 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3974 subscript_p sub = DDR_SUBSCRIPT (ddr, i);
3975 conflict_function *ca = SUB_CONFLICTS_IN_A (sub);
3976 conflict_function *cb = SUB_CONFLICTS_IN_B (sub);
3978 for (j = 0; j < ca->n; j++)
3979 if (affine_function_zero_p (ca->fns[j]))
3981 insert_innermost_unit_dist_vector (ddr);
3982 return;
3985 for (j = 0; j < cb->n; j++)
3986 if (affine_function_zero_p (cb->fns[j]))
3988 insert_innermost_unit_dist_vector (ddr);
3989 return;
3994 /* Compute the classic per loop distance vector. DDR is the data
3995 dependence relation to build a vector from. Return false when fail
3996 to represent the data dependence as a distance vector. */
3998 static bool
3999 build_classic_dist_vector (struct data_dependence_relation *ddr)
4001 bool init_b = false;
4002 int index_carry = DDR_NB_LOOPS (ddr);
4003 lambda_vector dist_v;
4005 if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
4006 return true;
4008 if (same_access_functions (ddr))
4010 /* Save the 0 vector. */
4011 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4012 save_dist_v (ddr, dist_v);
4014 if (constant_access_functions (ddr))
4015 add_distance_for_zero_overlaps (ddr);
4017 if (DDR_NB_LOOPS (ddr) > 1)
4018 add_other_self_distances (ddr);
4020 return true;
4023 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4024 if (!build_classic_dist_vector_1 (ddr, DDR_A (ddr), DDR_B (ddr),
4025 dist_v, &init_b, &index_carry))
4026 return false;
4028 /* Save the distance vector if we initialized one. */
4029 if (init_b)
4031 /* Verify a basic constraint: classic distance vectors should
4032 always be lexicographically positive.
4034 Data references are collected in the order of execution of
4035 the program, thus for the following loop
4037 | for (i = 1; i < 100; i++)
4038 | for (j = 1; j < 100; j++)
4040 | t = T[j+1][i-1]; // A
4041 | T[j][i] = t + 2; // B
4044 references are collected following the direction of the wind:
4045 A then B. The data dependence tests are performed also
4046 following this order, such that we're looking at the distance
4047 separating the elements accessed by A from the elements later
4048 accessed by B. But in this example, the distance returned by
4049 test_dep (A, B) is lexicographically negative (-1, 1), that
4050 means that the access A occurs later than B with respect to
4051 the outer loop, ie. we're actually looking upwind. In this
4052 case we solve test_dep (B, A) looking downwind to the
4053 lexicographically positive solution, that returns the
4054 distance vector (1, -1). */
4055 if (!lambda_vector_lexico_pos (dist_v, DDR_NB_LOOPS (ddr)))
4057 lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4058 subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr));
4059 compute_subscript_distance (ddr);
4060 build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
4061 save_v, &init_b, &index_carry);
4062 save_dist_v (ddr, save_v);
4064 /* In this case there is a dependence forward for all the
4065 outer loops:
4067 | for (k = 1; k < 100; k++)
4068 | for (i = 1; i < 100; i++)
4069 | for (j = 1; j < 100; j++)
4071 | t = T[j+1][i-1]; // A
4072 | T[j][i] = t + 2; // B
4075 the vectors are:
4076 (0, 1, -1)
4077 (1, 1, -1)
4078 (1, -1, 1)
4080 if (DDR_NB_LOOPS (ddr) > 1)
4082 add_outer_distances (ddr, save_v, index_carry);
4083 add_outer_distances (ddr, dist_v, index_carry);
4086 else
4088 lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4089 lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
4090 save_dist_v (ddr, save_v);
4092 if (DDR_NB_LOOPS (ddr) > 1)
4094 lambda_vector opposite_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4096 subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr));
4097 compute_subscript_distance (ddr);
4098 build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
4099 opposite_v, &init_b, &index_carry);
4101 add_outer_distances (ddr, dist_v, index_carry);
4102 add_outer_distances (ddr, opposite_v, index_carry);
4106 else
4108 /* There is a distance of 1 on all the outer loops: Example:
4109 there is a dependence of distance 1 on loop_1 for the array A.
4111 | loop_1
4112 | A[5] = ...
4113 | endloop
4115 add_outer_distances (ddr, dist_v,
4116 lambda_vector_first_nz (dist_v,
4117 DDR_NB_LOOPS (ddr), 0));
4120 if (dump_file && (dump_flags & TDF_DETAILS))
4122 unsigned i;
4124 fprintf (dump_file, "(build_classic_dist_vector\n");
4125 for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
4127 fprintf (dump_file, " dist_vector = (");
4128 print_lambda_vector (dump_file, DDR_DIST_VECT (ddr, i),
4129 DDR_NB_LOOPS (ddr));
4130 fprintf (dump_file, " )\n");
4132 fprintf (dump_file, ")\n");
4135 return true;
4138 /* Return the direction for a given distance.
4139 FIXME: Computing dir this way is suboptimal, since dir can catch
4140 cases that dist is unable to represent. */
4142 static inline enum data_dependence_direction
4143 dir_from_dist (int dist)
4145 if (dist > 0)
4146 return dir_positive;
4147 else if (dist < 0)
4148 return dir_negative;
4149 else
4150 return dir_equal;
4153 /* Compute the classic per loop direction vector. DDR is the data
4154 dependence relation to build a vector from. */
4156 static void
4157 build_classic_dir_vector (struct data_dependence_relation *ddr)
4159 unsigned i, j;
4160 lambda_vector dist_v;
4162 for (i = 0; VEC_iterate (lambda_vector, DDR_DIST_VECTS (ddr), i, dist_v); i++)
4164 lambda_vector dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4166 for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
4167 dir_v[j] = dir_from_dist (dist_v[j]);
4169 save_dir_v (ddr, dir_v);
4173 /* Helper function. Returns true when there is a dependence between
4174 data references DRA and DRB. */
4176 static bool
4177 subscript_dependence_tester_1 (struct data_dependence_relation *ddr,
4178 struct data_reference *dra,
4179 struct data_reference *drb)
4181 unsigned int i;
4182 tree last_conflicts;
4183 struct subscript *subscript;
4185 for (i = 0; VEC_iterate (subscript_p, DDR_SUBSCRIPTS (ddr), i, subscript);
4186 i++)
4188 conflict_function *overlaps_a, *overlaps_b;
4190 analyze_overlapping_iterations (DR_ACCESS_FN (dra, i),
4191 DR_ACCESS_FN (drb, i),
4192 &overlaps_a, &overlaps_b,
4193 &last_conflicts);
4195 if (CF_NOT_KNOWN_P (overlaps_a)
4196 || CF_NOT_KNOWN_P (overlaps_b))
4198 finalize_ddr_dependent (ddr, chrec_dont_know);
4199 dependence_stats.num_dependence_undetermined++;
4200 free_conflict_function (overlaps_a);
4201 free_conflict_function (overlaps_b);
4202 return false;
4205 else if (CF_NO_DEPENDENCE_P (overlaps_a)
4206 || CF_NO_DEPENDENCE_P (overlaps_b))
4208 finalize_ddr_dependent (ddr, chrec_known);
4209 dependence_stats.num_dependence_independent++;
4210 free_conflict_function (overlaps_a);
4211 free_conflict_function (overlaps_b);
4212 return false;
4215 else
4217 SUB_CONFLICTS_IN_A (subscript) = overlaps_a;
4218 SUB_CONFLICTS_IN_B (subscript) = overlaps_b;
4219 SUB_LAST_CONFLICT (subscript) = last_conflicts;
4223 return true;
4226 /* Computes the conflicting iterations, and initialize DDR. */
4228 static void
4229 subscript_dependence_tester (struct data_dependence_relation *ddr)
4232 if (dump_file && (dump_flags & TDF_DETAILS))
4233 fprintf (dump_file, "(subscript_dependence_tester \n");
4235 if (subscript_dependence_tester_1 (ddr, DDR_A (ddr), DDR_B (ddr)))
4236 dependence_stats.num_dependence_dependent++;
4238 compute_subscript_distance (ddr);
4239 if (build_classic_dist_vector (ddr))
4240 build_classic_dir_vector (ddr);
4242 if (dump_file && (dump_flags & TDF_DETAILS))
4243 fprintf (dump_file, ")\n");
4246 /* Returns true when all the access functions of A are affine or
4247 constant. */
4249 static bool
4250 access_functions_are_affine_or_constant_p (struct data_reference *a)
4252 unsigned int i;
4253 VEC(tree,heap) *fns = DR_ACCESS_FNS (a);
4254 tree t;
4256 for (i = 0; VEC_iterate (tree, fns, i, t); i++)
4257 if (!evolution_function_is_constant_p (t)
4258 && !evolution_function_is_affine_multivariate_p (t))
4259 return false;
4261 return true;
4264 /* Initializes an equation for an OMEGA problem using the information
4265 contained in the ACCESS_FUN. Returns true when the operation
4266 succeeded.
4268 PB is the omega constraint system.
4269 EQ is the number of the equation to be initialized.
4270 OFFSET is used for shifting the variables names in the constraints:
4271 a constrain is composed of 2 * the number of variables surrounding
4272 dependence accesses. OFFSET is set either to 0 for the first n variables,
4273 then it is set to n.
4274 ACCESS_FUN is expected to be an affine chrec. */
4276 static bool
4277 init_omega_eq_with_af (omega_pb pb, unsigned eq,
4278 unsigned int offset, tree access_fun,
4279 struct data_dependence_relation *ddr)
4281 switch (TREE_CODE (access_fun))
4283 case POLYNOMIAL_CHREC:
4285 tree left = CHREC_LEFT (access_fun);
4286 tree right = CHREC_RIGHT (access_fun);
4287 int var = CHREC_VARIABLE (access_fun);
4288 unsigned var_idx;
4290 if (TREE_CODE (right) != INTEGER_CST)
4291 return false;
4293 var_idx = index_in_loop_nest (var, DDR_LOOP_NEST (ddr));
4294 pb->eqs[eq].coef[offset + var_idx + 1] = int_cst_value (right);
4296 /* Compute the innermost loop index. */
4297 DDR_INNER_LOOP (ddr) = MAX (DDR_INNER_LOOP (ddr), var_idx);
4299 if (offset == 0)
4300 pb->eqs[eq].coef[var_idx + DDR_NB_LOOPS (ddr) + 1]
4301 += int_cst_value (right);
4303 switch (TREE_CODE (left))
4305 case POLYNOMIAL_CHREC:
4306 return init_omega_eq_with_af (pb, eq, offset, left, ddr);
4308 case INTEGER_CST:
4309 pb->eqs[eq].coef[0] += int_cst_value (left);
4310 return true;
4312 default:
4313 return false;
4317 case INTEGER_CST:
4318 pb->eqs[eq].coef[0] += int_cst_value (access_fun);
4319 return true;
4321 default:
4322 return false;
4326 /* As explained in the comments preceding init_omega_for_ddr, we have
4327 to set up a system for each loop level, setting outer loops
4328 variation to zero, and current loop variation to positive or zero.
4329 Save each lexico positive distance vector. */
4331 static void
4332 omega_extract_distance_vectors (omega_pb pb,
4333 struct data_dependence_relation *ddr)
4335 int eq, geq;
4336 unsigned i, j;
4337 struct loop *loopi, *loopj;
4338 enum omega_result res;
4340 /* Set a new problem for each loop in the nest. The basis is the
4341 problem that we have initialized until now. On top of this we
4342 add new constraints. */
4343 for (i = 0; i <= DDR_INNER_LOOP (ddr)
4344 && VEC_iterate (loop_p, DDR_LOOP_NEST (ddr), i, loopi); i++)
4346 int dist = 0;
4347 omega_pb copy = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr),
4348 DDR_NB_LOOPS (ddr));
4350 omega_copy_problem (copy, pb);
4352 /* For all the outer loops "loop_j", add "dj = 0". */
4353 for (j = 0;
4354 j < i && VEC_iterate (loop_p, DDR_LOOP_NEST (ddr), j, loopj); j++)
4356 eq = omega_add_zero_eq (copy, omega_black);
4357 copy->eqs[eq].coef[j + 1] = 1;
4360 /* For "loop_i", add "0 <= di". */
4361 geq = omega_add_zero_geq (copy, omega_black);
4362 copy->geqs[geq].coef[i + 1] = 1;
4364 /* Reduce the constraint system, and test that the current
4365 problem is feasible. */
4366 res = omega_simplify_problem (copy);
4367 if (res == omega_false
4368 || res == omega_unknown
4369 || copy->num_geqs > (int) DDR_NB_LOOPS (ddr))
4370 goto next_problem;
4372 for (eq = 0; eq < copy->num_subs; eq++)
4373 if (copy->subs[eq].key == (int) i + 1)
4375 dist = copy->subs[eq].coef[0];
4376 goto found_dist;
4379 if (dist == 0)
4381 /* Reinitialize problem... */
4382 omega_copy_problem (copy, pb);
4383 for (j = 0;
4384 j < i && VEC_iterate (loop_p, DDR_LOOP_NEST (ddr), j, loopj); j++)
4386 eq = omega_add_zero_eq (copy, omega_black);
4387 copy->eqs[eq].coef[j + 1] = 1;
4390 /* ..., but this time "di = 1". */
4391 eq = omega_add_zero_eq (copy, omega_black);
4392 copy->eqs[eq].coef[i + 1] = 1;
4393 copy->eqs[eq].coef[0] = -1;
4395 res = omega_simplify_problem (copy);
4396 if (res == omega_false
4397 || res == omega_unknown
4398 || copy->num_geqs > (int) DDR_NB_LOOPS (ddr))
4399 goto next_problem;
4401 for (eq = 0; eq < copy->num_subs; eq++)
4402 if (copy->subs[eq].key == (int) i + 1)
4404 dist = copy->subs[eq].coef[0];
4405 goto found_dist;
4409 found_dist:;
4410 /* Save the lexicographically positive distance vector. */
4411 if (dist >= 0)
4413 lambda_vector dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4414 lambda_vector dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4416 dist_v[i] = dist;
4418 for (eq = 0; eq < copy->num_subs; eq++)
4419 if (copy->subs[eq].key > 0)
4421 dist = copy->subs[eq].coef[0];
4422 dist_v[copy->subs[eq].key - 1] = dist;
4425 for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
4426 dir_v[j] = dir_from_dist (dist_v[j]);
4428 save_dist_v (ddr, dist_v);
4429 save_dir_v (ddr, dir_v);
4432 next_problem:;
4433 omega_free_problem (copy);
4437 /* This is called for each subscript of a tuple of data references:
4438 insert an equality for representing the conflicts. */
4440 static bool
4441 omega_setup_subscript (tree access_fun_a, tree access_fun_b,
4442 struct data_dependence_relation *ddr,
4443 omega_pb pb, bool *maybe_dependent)
4445 int eq;
4446 tree fun_a = chrec_convert (integer_type_node, access_fun_a, NULL_TREE);
4447 tree fun_b = chrec_convert (integer_type_node, access_fun_b, NULL_TREE);
4448 tree difference = chrec_fold_minus (integer_type_node, fun_a, fun_b);
4450 /* When the fun_a - fun_b is not constant, the dependence is not
4451 captured by the classic distance vector representation. */
4452 if (TREE_CODE (difference) != INTEGER_CST)
4453 return false;
4455 /* ZIV test. */
4456 if (ziv_subscript_p (fun_a, fun_b) && !integer_zerop (difference))
4458 /* There is no dependence. */
4459 *maybe_dependent = false;
4460 return true;
4463 fun_b = chrec_fold_multiply (integer_type_node, fun_b,
4464 integer_minus_one_node);
4466 eq = omega_add_zero_eq (pb, omega_black);
4467 if (!init_omega_eq_with_af (pb, eq, DDR_NB_LOOPS (ddr), fun_a, ddr)
4468 || !init_omega_eq_with_af (pb, eq, 0, fun_b, ddr))
4469 /* There is probably a dependence, but the system of
4470 constraints cannot be built: answer "don't know". */
4471 return false;
4473 /* GCD test. */
4474 if (DDR_NB_LOOPS (ddr) != 0 && pb->eqs[eq].coef[0]
4475 && !int_divides_p (lambda_vector_gcd
4476 ((lambda_vector) &(pb->eqs[eq].coef[1]),
4477 2 * DDR_NB_LOOPS (ddr)),
4478 pb->eqs[eq].coef[0]))
4480 /* There is no dependence. */
4481 *maybe_dependent = false;
4482 return true;
4485 return true;
4488 /* Helper function, same as init_omega_for_ddr but specialized for
4489 data references A and B. */
4491 static bool
4492 init_omega_for_ddr_1 (struct data_reference *dra, struct data_reference *drb,
4493 struct data_dependence_relation *ddr,
4494 omega_pb pb, bool *maybe_dependent)
4496 unsigned i;
4497 int ineq;
4498 struct loop *loopi;
4499 unsigned nb_loops = DDR_NB_LOOPS (ddr);
4501 /* Insert an equality per subscript. */
4502 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
4504 if (!omega_setup_subscript (DR_ACCESS_FN (dra, i), DR_ACCESS_FN (drb, i),
4505 ddr, pb, maybe_dependent))
4506 return false;
4507 else if (*maybe_dependent == false)
4509 /* There is no dependence. */
4510 DDR_ARE_DEPENDENT (ddr) = chrec_known;
4511 return true;
4515 /* Insert inequalities: constraints corresponding to the iteration
4516 domain, i.e. the loops surrounding the references "loop_x" and
4517 the distance variables "dx". The layout of the OMEGA
4518 representation is as follows:
4519 - coef[0] is the constant
4520 - coef[1..nb_loops] are the protected variables that will not be
4521 removed by the solver: the "dx"
4522 - coef[nb_loops + 1, 2*nb_loops] are the loop variables: "loop_x".
4524 for (i = 0; i <= DDR_INNER_LOOP (ddr)
4525 && VEC_iterate (loop_p, DDR_LOOP_NEST (ddr), i, loopi); i++)
4527 HOST_WIDE_INT nbi = estimated_loop_iterations_int (loopi, true);
4529 /* 0 <= loop_x */
4530 ineq = omega_add_zero_geq (pb, omega_black);
4531 pb->geqs[ineq].coef[i + nb_loops + 1] = 1;
4533 /* 0 <= loop_x + dx */
4534 ineq = omega_add_zero_geq (pb, omega_black);
4535 pb->geqs[ineq].coef[i + nb_loops + 1] = 1;
4536 pb->geqs[ineq].coef[i + 1] = 1;
4538 if (nbi != -1)
4540 /* loop_x <= nb_iters */
4541 ineq = omega_add_zero_geq (pb, omega_black);
4542 pb->geqs[ineq].coef[i + nb_loops + 1] = -1;
4543 pb->geqs[ineq].coef[0] = nbi;
4545 /* loop_x + dx <= nb_iters */
4546 ineq = omega_add_zero_geq (pb, omega_black);
4547 pb->geqs[ineq].coef[i + nb_loops + 1] = -1;
4548 pb->geqs[ineq].coef[i + 1] = -1;
4549 pb->geqs[ineq].coef[0] = nbi;
4551 /* A step "dx" bigger than nb_iters is not feasible, so
4552 add "0 <= nb_iters + dx", */
4553 ineq = omega_add_zero_geq (pb, omega_black);
4554 pb->geqs[ineq].coef[i + 1] = 1;
4555 pb->geqs[ineq].coef[0] = nbi;
4556 /* and "dx <= nb_iters". */
4557 ineq = omega_add_zero_geq (pb, omega_black);
4558 pb->geqs[ineq].coef[i + 1] = -1;
4559 pb->geqs[ineq].coef[0] = nbi;
4563 omega_extract_distance_vectors (pb, ddr);
4565 return true;
4568 /* Sets up the Omega dependence problem for the data dependence
4569 relation DDR. Returns false when the constraint system cannot be
4570 built, ie. when the test answers "don't know". Returns true
4571 otherwise, and when independence has been proved (using one of the
4572 trivial dependence test), set MAYBE_DEPENDENT to false, otherwise
4573 set MAYBE_DEPENDENT to true.
4575 Example: for setting up the dependence system corresponding to the
4576 conflicting accesses
4578 | loop_i
4579 | loop_j
4580 | A[i, i+1] = ...
4581 | ... A[2*j, 2*(i + j)]
4582 | endloop_j
4583 | endloop_i
4585 the following constraints come from the iteration domain:
4587 0 <= i <= Ni
4588 0 <= i + di <= Ni
4589 0 <= j <= Nj
4590 0 <= j + dj <= Nj
4592 where di, dj are the distance variables. The constraints
4593 representing the conflicting elements are:
4595 i = 2 * (j + dj)
4596 i + 1 = 2 * (i + di + j + dj)
4598 For asking that the resulting distance vector (di, dj) be
4599 lexicographically positive, we insert the constraint "di >= 0". If
4600 "di = 0" in the solution, we fix that component to zero, and we
4601 look at the inner loops: we set a new problem where all the outer
4602 loop distances are zero, and fix this inner component to be
4603 positive. When one of the components is positive, we save that
4604 distance, and set a new problem where the distance on this loop is
4605 zero, searching for other distances in the inner loops. Here is
4606 the classic example that illustrates that we have to set for each
4607 inner loop a new problem:
4609 | loop_1
4610 | loop_2
4611 | A[10]
4612 | endloop_2
4613 | endloop_1
4615 we have to save two distances (1, 0) and (0, 1).
4617 Given two array references, refA and refB, we have to set the
4618 dependence problem twice, refA vs. refB and refB vs. refA, and we
4619 cannot do a single test, as refB might occur before refA in the
4620 inner loops, and the contrary when considering outer loops: ex.
4622 | loop_0
4623 | loop_1
4624 | loop_2
4625 | T[{1,+,1}_2][{1,+,1}_1] // refA
4626 | T[{2,+,1}_2][{0,+,1}_1] // refB
4627 | endloop_2
4628 | endloop_1
4629 | endloop_0
4631 refB touches the elements in T before refA, and thus for the same
4632 loop_0 refB precedes refA: ie. the distance vector (0, 1, -1)
4633 but for successive loop_0 iterations, we have (1, -1, 1)
4635 The Omega solver expects the distance variables ("di" in the
4636 previous example) to come first in the constraint system (as
4637 variables to be protected, or "safe" variables), the constraint
4638 system is built using the following layout:
4640 "cst | distance vars | index vars".
4643 static bool
4644 init_omega_for_ddr (struct data_dependence_relation *ddr,
4645 bool *maybe_dependent)
4647 omega_pb pb;
4648 bool res = false;
4650 *maybe_dependent = true;
4652 if (same_access_functions (ddr))
4654 unsigned j;
4655 lambda_vector dir_v;
4657 /* Save the 0 vector. */
4658 save_dist_v (ddr, lambda_vector_new (DDR_NB_LOOPS (ddr)));
4659 dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4660 for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
4661 dir_v[j] = dir_equal;
4662 save_dir_v (ddr, dir_v);
4664 /* Save the dependences carried by outer loops. */
4665 pb = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr), DDR_NB_LOOPS (ddr));
4666 res = init_omega_for_ddr_1 (DDR_A (ddr), DDR_B (ddr), ddr, pb,
4667 maybe_dependent);
4668 omega_free_problem (pb);
4669 return res;
4672 /* Omega expects the protected variables (those that have to be kept
4673 after elimination) to appear first in the constraint system.
4674 These variables are the distance variables. In the following
4675 initialization we declare NB_LOOPS safe variables, and the total
4676 number of variables for the constraint system is 2*NB_LOOPS. */
4677 pb = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr), DDR_NB_LOOPS (ddr));
4678 res = init_omega_for_ddr_1 (DDR_A (ddr), DDR_B (ddr), ddr, pb,
4679 maybe_dependent);
4680 omega_free_problem (pb);
4682 /* Stop computation if not decidable, or no dependence. */
4683 if (res == false || *maybe_dependent == false)
4684 return res;
4686 pb = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr), DDR_NB_LOOPS (ddr));
4687 res = init_omega_for_ddr_1 (DDR_B (ddr), DDR_A (ddr), ddr, pb,
4688 maybe_dependent);
4689 omega_free_problem (pb);
4691 return res;
4694 /* Return true when DDR contains the same information as that stored
4695 in DIR_VECTS and in DIST_VECTS, return false otherwise. */
4697 static bool
4698 ddr_consistent_p (FILE *file,
4699 struct data_dependence_relation *ddr,
4700 VEC (lambda_vector, heap) *dist_vects,
4701 VEC (lambda_vector, heap) *dir_vects)
4703 unsigned int i, j;
4705 /* If dump_file is set, output there. */
4706 if (dump_file && (dump_flags & TDF_DETAILS))
4707 file = dump_file;
4709 if (VEC_length (lambda_vector, dist_vects) != DDR_NUM_DIST_VECTS (ddr))
4711 lambda_vector b_dist_v;
4712 fprintf (file, "\n(Number of distance vectors differ: Banerjee has %d, Omega has %d.\n",
4713 VEC_length (lambda_vector, dist_vects),
4714 DDR_NUM_DIST_VECTS (ddr));
4716 fprintf (file, "Banerjee dist vectors:\n");
4717 for (i = 0; VEC_iterate (lambda_vector, dist_vects, i, b_dist_v); i++)
4718 print_lambda_vector (file, b_dist_v, DDR_NB_LOOPS (ddr));
4720 fprintf (file, "Omega dist vectors:\n");
4721 for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
4722 print_lambda_vector (file, DDR_DIST_VECT (ddr, i), DDR_NB_LOOPS (ddr));
4724 fprintf (file, "data dependence relation:\n");
4725 dump_data_dependence_relation (file, ddr);
4727 fprintf (file, ")\n");
4728 return false;
4731 if (VEC_length (lambda_vector, dir_vects) != DDR_NUM_DIR_VECTS (ddr))
4733 fprintf (file, "\n(Number of direction vectors differ: Banerjee has %d, Omega has %d.)\n",
4734 VEC_length (lambda_vector, dir_vects),
4735 DDR_NUM_DIR_VECTS (ddr));
4736 return false;
4739 for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
4741 lambda_vector a_dist_v;
4742 lambda_vector b_dist_v = DDR_DIST_VECT (ddr, i);
4744 /* Distance vectors are not ordered in the same way in the DDR
4745 and in the DIST_VECTS: search for a matching vector. */
4746 for (j = 0; VEC_iterate (lambda_vector, dist_vects, j, a_dist_v); j++)
4747 if (lambda_vector_equal (a_dist_v, b_dist_v, DDR_NB_LOOPS (ddr)))
4748 break;
4750 if (j == VEC_length (lambda_vector, dist_vects))
4752 fprintf (file, "\n(Dist vectors from the first dependence analyzer:\n");
4753 print_dist_vectors (file, dist_vects, DDR_NB_LOOPS (ddr));
4754 fprintf (file, "not found in Omega dist vectors:\n");
4755 print_dist_vectors (file, DDR_DIST_VECTS (ddr), DDR_NB_LOOPS (ddr));
4756 fprintf (file, "data dependence relation:\n");
4757 dump_data_dependence_relation (file, ddr);
4758 fprintf (file, ")\n");
4762 for (i = 0; i < DDR_NUM_DIR_VECTS (ddr); i++)
4764 lambda_vector a_dir_v;
4765 lambda_vector b_dir_v = DDR_DIR_VECT (ddr, i);
4767 /* Direction vectors are not ordered in the same way in the DDR
4768 and in the DIR_VECTS: search for a matching vector. */
4769 for (j = 0; VEC_iterate (lambda_vector, dir_vects, j, a_dir_v); j++)
4770 if (lambda_vector_equal (a_dir_v, b_dir_v, DDR_NB_LOOPS (ddr)))
4771 break;
4773 if (j == VEC_length (lambda_vector, dist_vects))
4775 fprintf (file, "\n(Dir vectors from the first dependence analyzer:\n");
4776 print_dir_vectors (file, dir_vects, DDR_NB_LOOPS (ddr));
4777 fprintf (file, "not found in Omega dir vectors:\n");
4778 print_dir_vectors (file, DDR_DIR_VECTS (ddr), DDR_NB_LOOPS (ddr));
4779 fprintf (file, "data dependence relation:\n");
4780 dump_data_dependence_relation (file, ddr);
4781 fprintf (file, ")\n");
4785 return true;
4788 /* This computes the affine dependence relation between A and B.
4789 CHREC_KNOWN is used for representing the independence between two
4790 accesses, while CHREC_DONT_KNOW is used for representing the unknown
4791 relation.
4793 Note that it is possible to stop the computation of the dependence
4794 relation the first time we detect a CHREC_KNOWN element for a given
4795 subscript. */
4797 static void
4798 compute_affine_dependence (struct data_dependence_relation *ddr)
4800 struct data_reference *dra = DDR_A (ddr);
4801 struct data_reference *drb = DDR_B (ddr);
4803 if (dump_file && (dump_flags & TDF_DETAILS))
4805 fprintf (dump_file, "(compute_affine_dependence\n");
4806 fprintf (dump_file, " (stmt_a = \n");
4807 print_generic_expr (dump_file, DR_STMT (dra), 0);
4808 fprintf (dump_file, ")\n (stmt_b = \n");
4809 print_generic_expr (dump_file, DR_STMT (drb), 0);
4810 fprintf (dump_file, ")\n");
4813 /* Analyze only when the dependence relation is not yet known. */
4814 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
4816 dependence_stats.num_dependence_tests++;
4818 if (access_functions_are_affine_or_constant_p (dra)
4819 && access_functions_are_affine_or_constant_p (drb))
4821 if (flag_check_data_deps)
4823 /* Compute the dependences using the first algorithm. */
4824 subscript_dependence_tester (ddr);
4826 if (dump_file && (dump_flags & TDF_DETAILS))
4828 fprintf (dump_file, "\n\nBanerjee Analyzer\n");
4829 dump_data_dependence_relation (dump_file, ddr);
4832 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
4834 bool maybe_dependent;
4835 VEC (lambda_vector, heap) *dir_vects, *dist_vects;
4837 /* Save the result of the first DD analyzer. */
4838 dist_vects = DDR_DIST_VECTS (ddr);
4839 dir_vects = DDR_DIR_VECTS (ddr);
4841 /* Reset the information. */
4842 DDR_DIST_VECTS (ddr) = NULL;
4843 DDR_DIR_VECTS (ddr) = NULL;
4845 /* Compute the same information using Omega. */
4846 if (!init_omega_for_ddr (ddr, &maybe_dependent))
4847 goto csys_dont_know;
4849 if (dump_file && (dump_flags & TDF_DETAILS))
4851 fprintf (dump_file, "Omega Analyzer\n");
4852 dump_data_dependence_relation (dump_file, ddr);
4855 /* Check that we get the same information. */
4856 if (maybe_dependent)
4857 gcc_assert (ddr_consistent_p (stderr, ddr, dist_vects,
4858 dir_vects));
4861 else
4862 subscript_dependence_tester (ddr);
4865 /* As a last case, if the dependence cannot be determined, or if
4866 the dependence is considered too difficult to determine, answer
4867 "don't know". */
4868 else
4870 csys_dont_know:;
4871 dependence_stats.num_dependence_undetermined++;
4873 if (dump_file && (dump_flags & TDF_DETAILS))
4875 fprintf (dump_file, "Data ref a:\n");
4876 dump_data_reference (dump_file, dra);
4877 fprintf (dump_file, "Data ref b:\n");
4878 dump_data_reference (dump_file, drb);
4879 fprintf (dump_file, "affine dependence test not usable: access function not affine or constant.\n");
4881 finalize_ddr_dependent (ddr, chrec_dont_know);
4885 if (dump_file && (dump_flags & TDF_DETAILS))
4886 fprintf (dump_file, ")\n");
4889 /* This computes the dependence relation for the same data
4890 reference into DDR. */
4892 static void
4893 compute_self_dependence (struct data_dependence_relation *ddr)
4895 unsigned int i;
4896 struct subscript *subscript;
4898 for (i = 0; VEC_iterate (subscript_p, DDR_SUBSCRIPTS (ddr), i, subscript);
4899 i++)
4901 /* The accessed index overlaps for each iteration. */
4902 SUB_CONFLICTS_IN_A (subscript)
4903 = conflict_fn (1, affine_fn_cst (integer_zero_node));
4904 SUB_CONFLICTS_IN_B (subscript)
4905 = conflict_fn (1, affine_fn_cst (integer_zero_node));
4906 SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
4909 /* The distance vector is the zero vector. */
4910 save_dist_v (ddr, lambda_vector_new (DDR_NB_LOOPS (ddr)));
4911 save_dir_v (ddr, lambda_vector_new (DDR_NB_LOOPS (ddr)));
4914 /* Compute in DEPENDENCE_RELATIONS the data dependence graph for all
4915 the data references in DATAREFS, in the LOOP_NEST. When
4916 COMPUTE_SELF_AND_RR is FALSE, don't compute read-read and self
4917 relations. */
4919 static void
4920 compute_all_dependences (VEC (data_reference_p, heap) *datarefs,
4921 VEC (ddr_p, heap) **dependence_relations,
4922 VEC (loop_p, heap) *loop_nest,
4923 bool compute_self_and_rr)
4925 struct data_dependence_relation *ddr;
4926 struct data_reference *a, *b;
4927 unsigned int i, j;
4929 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, a); i++)
4930 for (j = i + 1; VEC_iterate (data_reference_p, datarefs, j, b); j++)
4931 if (!DR_IS_READ (a) || !DR_IS_READ (b) || compute_self_and_rr)
4933 ddr = initialize_data_dependence_relation (a, b, loop_nest);
4934 VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
4935 compute_affine_dependence (ddr);
4938 if (compute_self_and_rr)
4939 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, a); i++)
4941 ddr = initialize_data_dependence_relation (a, a, loop_nest);
4942 VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
4943 compute_self_dependence (ddr);
4947 /* Stores the locations of memory references in STMT to REFERENCES. Returns
4948 true if STMT clobbers memory, false otherwise. */
4950 bool
4951 get_references_in_stmt (tree stmt, VEC (data_ref_loc, heap) **references)
4953 bool clobbers_memory = false;
4954 data_ref_loc *ref;
4955 tree *op0, *op1, call;
4957 *references = NULL;
4959 /* ASM_EXPR and CALL_EXPR may embed arbitrary side effects.
4960 Calls have side-effects, except those to const or pure
4961 functions. */
4962 call = get_call_expr_in (stmt);
4963 if ((call
4964 && !(call_expr_flags (call) & (ECF_CONST | ECF_PURE)))
4965 || (TREE_CODE (stmt) == ASM_EXPR
4966 && ASM_VOLATILE_P (stmt)))
4967 clobbers_memory = true;
4969 if (ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
4970 return clobbers_memory;
4972 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
4974 op0 = &GIMPLE_STMT_OPERAND (stmt, 0);
4975 op1 = &GIMPLE_STMT_OPERAND (stmt, 1);
4977 if (DECL_P (*op1)
4978 || REFERENCE_CLASS_P (*op1))
4980 ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
4981 ref->pos = op1;
4982 ref->is_read = true;
4985 if (DECL_P (*op0)
4986 || REFERENCE_CLASS_P (*op0))
4988 ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
4989 ref->pos = op0;
4990 ref->is_read = false;
4994 if (call)
4996 unsigned i, n = call_expr_nargs (call);
4998 for (i = 0; i < n; i++)
5000 op0 = &CALL_EXPR_ARG (call, i);
5002 if (DECL_P (*op0)
5003 || REFERENCE_CLASS_P (*op0))
5005 ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
5006 ref->pos = op0;
5007 ref->is_read = true;
5012 return clobbers_memory;
5015 /* Stores the data references in STMT to DATAREFS. If there is an unanalyzable
5016 reference, returns false, otherwise returns true. */
5018 static bool
5019 find_data_references_in_stmt (tree stmt,
5020 VEC (data_reference_p, heap) **datarefs)
5022 unsigned i;
5023 VEC (data_ref_loc, heap) *references;
5024 data_ref_loc *ref;
5025 bool ret = true;
5026 data_reference_p dr;
5028 if (get_references_in_stmt (stmt, &references))
5030 VEC_free (data_ref_loc, heap, references);
5031 return false;
5034 for (i = 0; VEC_iterate (data_ref_loc, references, i, ref); i++)
5036 dr = create_data_ref (*ref->pos, stmt, ref->is_read);
5037 if (dr)
5038 VEC_safe_push (data_reference_p, heap, *datarefs, dr);
5039 else
5041 ret = false;
5042 break;
5045 VEC_free (data_ref_loc, heap, references);
5046 return ret;
5049 /* Search the data references in LOOP, and record the information into
5050 DATAREFS. Returns chrec_dont_know when failing to analyze a
5051 difficult case, returns NULL_TREE otherwise.
5053 TODO: This function should be made smarter so that it can handle address
5054 arithmetic as if they were array accesses, etc. */
5056 tree
5057 find_data_references_in_loop (struct loop *loop,
5058 VEC (data_reference_p, heap) **datarefs)
5060 basic_block bb, *bbs;
5061 unsigned int i;
5062 block_stmt_iterator bsi;
5064 bbs = get_loop_body (loop);
5066 for (i = 0; i < loop->num_nodes; i++)
5068 bb = bbs[i];
5070 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
5072 tree stmt = bsi_stmt (bsi);
5074 if (!find_data_references_in_stmt (stmt, datarefs))
5076 struct data_reference *res;
5077 res = XNEW (struct data_reference);
5078 DR_STMT (res) = NULL_TREE;
5079 DR_REF (res) = NULL_TREE;
5080 DR_BASE_OBJECT (res) = NULL;
5081 DR_TYPE (res) = ARRAY_REF_TYPE;
5082 DR_SET_ACCESS_FNS (res, NULL);
5083 DR_BASE_OBJECT (res) = NULL;
5084 DR_IS_READ (res) = false;
5085 DR_BASE_ADDRESS (res) = NULL_TREE;
5086 DR_OFFSET (res) = NULL_TREE;
5087 DR_INIT (res) = NULL_TREE;
5088 DR_STEP (res) = NULL_TREE;
5089 DR_OFFSET_MISALIGNMENT (res) = NULL_TREE;
5090 DR_MEMTAG (res) = NULL_TREE;
5091 DR_PTR_INFO (res) = NULL;
5092 VEC_safe_push (data_reference_p, heap, *datarefs, res);
5094 free (bbs);
5095 return chrec_dont_know;
5099 free (bbs);
5101 return NULL_TREE;
5104 /* Recursive helper function. */
5106 static bool
5107 find_loop_nest_1 (struct loop *loop, VEC (loop_p, heap) **loop_nest)
5109 /* Inner loops of the nest should not contain siblings. Example:
5110 when there are two consecutive loops,
5112 | loop_0
5113 | loop_1
5114 | A[{0, +, 1}_1]
5115 | endloop_1
5116 | loop_2
5117 | A[{0, +, 1}_2]
5118 | endloop_2
5119 | endloop_0
5121 the dependence relation cannot be captured by the distance
5122 abstraction. */
5123 if (loop->next)
5124 return false;
5126 VEC_safe_push (loop_p, heap, *loop_nest, loop);
5127 if (loop->inner)
5128 return find_loop_nest_1 (loop->inner, loop_nest);
5129 return true;
5132 /* Return false when the LOOP is not well nested. Otherwise return
5133 true and insert in LOOP_NEST the loops of the nest. LOOP_NEST will
5134 contain the loops from the outermost to the innermost, as they will
5135 appear in the classic distance vector. */
5137 static bool
5138 find_loop_nest (struct loop *loop, VEC (loop_p, heap) **loop_nest)
5140 VEC_safe_push (loop_p, heap, *loop_nest, loop);
5141 if (loop->inner)
5142 return find_loop_nest_1 (loop->inner, loop_nest);
5143 return true;
5146 /* Given a loop nest LOOP, the following vectors are returned:
5147 DATAREFS is initialized to all the array elements contained in this loop,
5148 DEPENDENCE_RELATIONS contains the relations between the data references.
5149 Compute read-read and self relations if
5150 COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE. */
5152 void
5153 compute_data_dependences_for_loop (struct loop *loop,
5154 bool compute_self_and_read_read_dependences,
5155 VEC (data_reference_p, heap) **datarefs,
5156 VEC (ddr_p, heap) **dependence_relations)
5158 struct loop *loop_nest = loop;
5159 VEC (loop_p, heap) *vloops = VEC_alloc (loop_p, heap, 3);
5161 memset (&dependence_stats, 0, sizeof (dependence_stats));
5163 /* If the loop nest is not well formed, or one of the data references
5164 is not computable, give up without spending time to compute other
5165 dependences. */
5166 if (!loop_nest
5167 || !find_loop_nest (loop_nest, &vloops)
5168 || find_data_references_in_loop (loop, datarefs) == chrec_dont_know)
5170 struct data_dependence_relation *ddr;
5172 /* Insert a single relation into dependence_relations:
5173 chrec_dont_know. */
5174 ddr = initialize_data_dependence_relation (NULL, NULL, vloops);
5175 VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
5177 else
5178 compute_all_dependences (*datarefs, dependence_relations, vloops,
5179 compute_self_and_read_read_dependences);
5181 if (dump_file && (dump_flags & TDF_STATS))
5183 fprintf (dump_file, "Dependence tester statistics:\n");
5185 fprintf (dump_file, "Number of dependence tests: %d\n",
5186 dependence_stats.num_dependence_tests);
5187 fprintf (dump_file, "Number of dependence tests classified dependent: %d\n",
5188 dependence_stats.num_dependence_dependent);
5189 fprintf (dump_file, "Number of dependence tests classified independent: %d\n",
5190 dependence_stats.num_dependence_independent);
5191 fprintf (dump_file, "Number of undetermined dependence tests: %d\n",
5192 dependence_stats.num_dependence_undetermined);
5194 fprintf (dump_file, "Number of subscript tests: %d\n",
5195 dependence_stats.num_subscript_tests);
5196 fprintf (dump_file, "Number of undetermined subscript tests: %d\n",
5197 dependence_stats.num_subscript_undetermined);
5198 fprintf (dump_file, "Number of same subscript function: %d\n",
5199 dependence_stats.num_same_subscript_function);
5201 fprintf (dump_file, "Number of ziv tests: %d\n",
5202 dependence_stats.num_ziv);
5203 fprintf (dump_file, "Number of ziv tests returning dependent: %d\n",
5204 dependence_stats.num_ziv_dependent);
5205 fprintf (dump_file, "Number of ziv tests returning independent: %d\n",
5206 dependence_stats.num_ziv_independent);
5207 fprintf (dump_file, "Number of ziv tests unimplemented: %d\n",
5208 dependence_stats.num_ziv_unimplemented);
5210 fprintf (dump_file, "Number of siv tests: %d\n",
5211 dependence_stats.num_siv);
5212 fprintf (dump_file, "Number of siv tests returning dependent: %d\n",
5213 dependence_stats.num_siv_dependent);
5214 fprintf (dump_file, "Number of siv tests returning independent: %d\n",
5215 dependence_stats.num_siv_independent);
5216 fprintf (dump_file, "Number of siv tests unimplemented: %d\n",
5217 dependence_stats.num_siv_unimplemented);
5219 fprintf (dump_file, "Number of miv tests: %d\n",
5220 dependence_stats.num_miv);
5221 fprintf (dump_file, "Number of miv tests returning dependent: %d\n",
5222 dependence_stats.num_miv_dependent);
5223 fprintf (dump_file, "Number of miv tests returning independent: %d\n",
5224 dependence_stats.num_miv_independent);
5225 fprintf (dump_file, "Number of miv tests unimplemented: %d\n",
5226 dependence_stats.num_miv_unimplemented);
5230 /* Entry point (for testing only). Analyze all the data references
5231 and the dependence relations in LOOP.
5233 The data references are computed first.
5235 A relation on these nodes is represented by a complete graph. Some
5236 of the relations could be of no interest, thus the relations can be
5237 computed on demand.
5239 In the following function we compute all the relations. This is
5240 just a first implementation that is here for:
5241 - for showing how to ask for the dependence relations,
5242 - for the debugging the whole dependence graph,
5243 - for the dejagnu testcases and maintenance.
5245 It is possible to ask only for a part of the graph, avoiding to
5246 compute the whole dependence graph. The computed dependences are
5247 stored in a knowledge base (KB) such that later queries don't
5248 recompute the same information. The implementation of this KB is
5249 transparent to the optimizer, and thus the KB can be changed with a
5250 more efficient implementation, or the KB could be disabled. */
5251 static void
5252 analyze_all_data_dependences (struct loop *loop)
5254 unsigned int i;
5255 int nb_data_refs = 10;
5256 VEC (data_reference_p, heap) *datarefs =
5257 VEC_alloc (data_reference_p, heap, nb_data_refs);
5258 VEC (ddr_p, heap) *dependence_relations =
5259 VEC_alloc (ddr_p, heap, nb_data_refs * nb_data_refs);
5261 /* Compute DDs on the whole function. */
5262 compute_data_dependences_for_loop (loop, false, &datarefs,
5263 &dependence_relations);
5265 if (dump_file)
5267 dump_data_dependence_relations (dump_file, dependence_relations);
5268 fprintf (dump_file, "\n\n");
5270 if (dump_flags & TDF_DETAILS)
5271 dump_dist_dir_vectors (dump_file, dependence_relations);
5273 if (dump_flags & TDF_STATS)
5275 unsigned nb_top_relations = 0;
5276 unsigned nb_bot_relations = 0;
5277 unsigned nb_basename_differ = 0;
5278 unsigned nb_chrec_relations = 0;
5279 struct data_dependence_relation *ddr;
5281 for (i = 0; VEC_iterate (ddr_p, dependence_relations, i, ddr); i++)
5283 if (chrec_contains_undetermined (DDR_ARE_DEPENDENT (ddr)))
5284 nb_top_relations++;
5286 else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
5288 struct data_reference *a = DDR_A (ddr);
5289 struct data_reference *b = DDR_B (ddr);
5290 bool differ_p;
5292 if ((DR_BASE_OBJECT (a) && DR_BASE_OBJECT (b)
5293 && DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b))
5294 || (base_object_differ_p (a, b, &differ_p)
5295 && differ_p))
5296 nb_basename_differ++;
5297 else
5298 nb_bot_relations++;
5301 else
5302 nb_chrec_relations++;
5305 gather_stats_on_scev_database ();
5309 free_dependence_relations (dependence_relations);
5310 free_data_refs (datarefs);
5313 /* Computes all the data dependences and check that the results of
5314 several analyzers are the same. */
5316 void
5317 tree_check_data_deps (void)
5319 loop_iterator li;
5320 struct loop *loop_nest;
5322 FOR_EACH_LOOP (li, loop_nest, 0)
5323 analyze_all_data_dependences (loop_nest);
5326 /* Free the memory used by a data dependence relation DDR. */
5328 void
5329 free_dependence_relation (struct data_dependence_relation *ddr)
5331 if (ddr == NULL)
5332 return;
5334 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_SUBSCRIPTS (ddr))
5335 free_subscripts (DDR_SUBSCRIPTS (ddr));
5337 free (ddr);
5340 /* Free the memory used by the data dependence relations from
5341 DEPENDENCE_RELATIONS. */
5343 void
5344 free_dependence_relations (VEC (ddr_p, heap) *dependence_relations)
5346 unsigned int i;
5347 struct data_dependence_relation *ddr;
5348 VEC (loop_p, heap) *loop_nest = NULL;
5350 for (i = 0; VEC_iterate (ddr_p, dependence_relations, i, ddr); i++)
5352 if (ddr == NULL)
5353 continue;
5354 if (loop_nest == NULL)
5355 loop_nest = DDR_LOOP_NEST (ddr);
5356 else
5357 gcc_assert (DDR_LOOP_NEST (ddr) == NULL
5358 || DDR_LOOP_NEST (ddr) == loop_nest);
5359 free_dependence_relation (ddr);
5362 if (loop_nest)
5363 VEC_free (loop_p, heap, loop_nest);
5364 VEC_free (ddr_p, heap, dependence_relations);
5367 /* Free the memory used by the data references from DATAREFS. */
5369 void
5370 free_data_refs (VEC (data_reference_p, heap) *datarefs)
5372 unsigned int i;
5373 struct data_reference *dr;
5375 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
5376 free_data_ref (dr);
5377 VEC_free (data_reference_p, heap, datarefs);