errors.h (warning, [...]): Mark as cold.
[gcc.git] / gcc / tree-data-ref.c
1 /* Data references and dependences detectors.
2 Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <pop@cri.ensmp.fr>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
21
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.
25
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).
31
32 The goals of this analysis are:
33
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),
37
38 - when two data references access the same data, to qualify the
39 dependence relation with classic dependence representations:
40
41 - distance vectors
42 - direction vectors
43 - loop carried level dependence
44 - polyhedron dependence
45 or with the chains of recurrences based representation,
46
47 - to define a knowledge base for storing the data dependence
48 information,
49
50 - to define an interface to access this data.
51
52
53 Definitions:
54
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).
59
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.
64
65 References:
66
67 - "Advanced Compilation for High Performance Computing" by Randy
68 Allen and Ken Kennedy.
69 http://citeseer.ist.psu.edu/goff91practical.html
70
71 - "Loop Transformations for Restructuring Compilers - The Foundations"
72 by Utpal Banerjee.
73
74
75 */
76
77 #include "config.h"
78 #include "system.h"
79 #include "coretypes.h"
80 #include "tm.h"
81 #include "ggc.h"
82 #include "tree.h"
83
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"
97
98 static struct datadep_stats
99 {
100 int num_dependence_tests;
101 int num_dependence_dependent;
102 int num_dependence_independent;
103 int num_dependence_undetermined;
104
105 int num_subscript_tests;
106 int num_subscript_undetermined;
107 int num_same_subscript_function;
108
109 int num_ziv;
110 int num_ziv_independent;
111 int num_ziv_dependent;
112 int num_ziv_unimplemented;
113
114 int num_siv;
115 int num_siv_independent;
116 int num_siv_dependent;
117 int num_siv_unimplemented;
118
119 int num_miv;
120 int num_miv_independent;
121 int num_miv_dependent;
122 int num_miv_unimplemented;
123 } dependence_stats;
124
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 struct data_reference * init_data_ref (tree, tree, tree, tree, bool,
129 tree, tree, tree, tree, tree,
130 struct ptr_info_def *,
131 enum data_ref_type);
132 static bool subscript_dependence_tester_1 (struct data_dependence_relation *,
133 struct data_reference *,
134 struct data_reference *);
135
136 /* Determine if PTR and DECL may alias, the result is put in ALIASED.
137 Return FALSE if there is no symbol memory tag for PTR. */
138
139 static bool
140 ptr_decl_may_alias_p (tree ptr, tree decl,
141 struct data_reference *ptr_dr,
142 bool *aliased)
143 {
144 tree tag = NULL_TREE;
145 struct ptr_info_def *pi = DR_PTR_INFO (ptr_dr);
146
147 gcc_assert (TREE_CODE (ptr) == SSA_NAME && DECL_P (decl));
148
149 if (pi)
150 tag = pi->name_mem_tag;
151 if (!tag)
152 tag = symbol_mem_tag (SSA_NAME_VAR (ptr));
153 if (!tag)
154 tag = DR_MEMTAG (ptr_dr);
155 if (!tag)
156 return false;
157
158 *aliased = is_aliased_with (tag, decl);
159 return true;
160 }
161
162
163 /* Determine if two pointers may alias, the result is put in ALIASED.
164 Return FALSE if there is no symbol memory tag for one of the pointers. */
165
166 static bool
167 ptr_ptr_may_alias_p (tree ptr_a, tree ptr_b,
168 struct data_reference *dra,
169 struct data_reference *drb,
170 bool *aliased)
171 {
172 tree tag_a = NULL_TREE, tag_b = NULL_TREE;
173 struct ptr_info_def *pi_a = DR_PTR_INFO (dra);
174 struct ptr_info_def *pi_b = DR_PTR_INFO (drb);
175 bitmap bal1, bal2;
176
177 if (pi_a && pi_a->name_mem_tag && pi_b && pi_b->name_mem_tag)
178 {
179 tag_a = pi_a->name_mem_tag;
180 tag_b = pi_b->name_mem_tag;
181 }
182 else
183 {
184 tag_a = symbol_mem_tag (SSA_NAME_VAR (ptr_a));
185 if (!tag_a)
186 tag_a = DR_MEMTAG (dra);
187 if (!tag_a)
188 return false;
189
190 tag_b = symbol_mem_tag (SSA_NAME_VAR (ptr_b));
191 if (!tag_b)
192 tag_b = DR_MEMTAG (drb);
193 if (!tag_b)
194 return false;
195 }
196 bal1 = BITMAP_ALLOC (NULL);
197 bitmap_set_bit (bal1, DECL_UID (tag_a));
198 if (MTAG_P (tag_a) && MTAG_ALIASES (tag_a))
199 bitmap_ior_into (bal1, MTAG_ALIASES (tag_a));
200
201 bal2 = BITMAP_ALLOC (NULL);
202 bitmap_set_bit (bal2, DECL_UID (tag_b));
203 if (MTAG_P (tag_b) && MTAG_ALIASES (tag_b))
204 bitmap_ior_into (bal2, MTAG_ALIASES (tag_b));
205 *aliased = bitmap_intersect_p (bal1, bal2);
206
207 BITMAP_FREE (bal1);
208 BITMAP_FREE (bal2);
209 return true;
210 }
211
212
213 /* Determine if BASE_A and BASE_B may alias, the result is put in ALIASED.
214 Return FALSE if there is no symbol memory tag for one of the symbols. */
215
216 static bool
217 may_alias_p (tree base_a, tree base_b,
218 struct data_reference *dra,
219 struct data_reference *drb,
220 bool *aliased)
221 {
222 if (TREE_CODE (base_a) == ADDR_EXPR || TREE_CODE (base_b) == ADDR_EXPR)
223 {
224 if (TREE_CODE (base_a) == ADDR_EXPR && TREE_CODE (base_b) == ADDR_EXPR)
225 {
226 *aliased = (TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0));
227 return true;
228 }
229 if (TREE_CODE (base_a) == ADDR_EXPR)
230 return ptr_decl_may_alias_p (base_b, TREE_OPERAND (base_a, 0), drb,
231 aliased);
232 else
233 return ptr_decl_may_alias_p (base_a, TREE_OPERAND (base_b, 0), dra,
234 aliased);
235 }
236
237 return ptr_ptr_may_alias_p (base_a, base_b, dra, drb, aliased);
238 }
239
240
241 /* Determine if a pointer (BASE_A) and a record/union access (BASE_B)
242 are not aliased. Return TRUE if they differ. */
243 static bool
244 record_ptr_differ_p (struct data_reference *dra,
245 struct data_reference *drb)
246 {
247 bool aliased;
248 tree base_a = DR_BASE_OBJECT (dra);
249 tree base_b = DR_BASE_OBJECT (drb);
250
251 if (TREE_CODE (base_b) != COMPONENT_REF)
252 return false;
253
254 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
255 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
256 Probably will be unnecessary with struct alias analysis. */
257 while (TREE_CODE (base_b) == COMPONENT_REF)
258 base_b = TREE_OPERAND (base_b, 0);
259 /* Compare a record/union access (b.c[i] or p->c[i]) and a pointer
260 ((*q)[i]). */
261 if (TREE_CODE (base_a) == INDIRECT_REF
262 && ((TREE_CODE (base_b) == VAR_DECL
263 && (ptr_decl_may_alias_p (TREE_OPERAND (base_a, 0), base_b, dra,
264 &aliased)
265 && !aliased))
266 || (TREE_CODE (base_b) == INDIRECT_REF
267 && (ptr_ptr_may_alias_p (TREE_OPERAND (base_a, 0),
268 TREE_OPERAND (base_b, 0), dra, drb,
269 &aliased)
270 && !aliased))))
271 return true;
272 else
273 return false;
274 }
275
276 /* Determine if two record/union accesses are aliased. Return TRUE if they
277 differ. */
278 static bool
279 record_record_differ_p (struct data_reference *dra,
280 struct data_reference *drb)
281 {
282 bool aliased;
283 tree base_a = DR_BASE_OBJECT (dra);
284 tree base_b = DR_BASE_OBJECT (drb);
285
286 if (TREE_CODE (base_b) != COMPONENT_REF
287 || TREE_CODE (base_a) != COMPONENT_REF)
288 return false;
289
290 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
291 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
292 Probably will be unnecessary with struct alias analysis. */
293 while (TREE_CODE (base_b) == COMPONENT_REF)
294 base_b = TREE_OPERAND (base_b, 0);
295 while (TREE_CODE (base_a) == COMPONENT_REF)
296 base_a = TREE_OPERAND (base_a, 0);
297
298 if (TREE_CODE (base_a) == INDIRECT_REF
299 && TREE_CODE (base_b) == INDIRECT_REF
300 && ptr_ptr_may_alias_p (TREE_OPERAND (base_a, 0),
301 TREE_OPERAND (base_b, 0),
302 dra, drb, &aliased)
303 && !aliased)
304 return true;
305 else
306 return false;
307 }
308
309 /* Determine if an array access (BASE_A) and a record/union access (BASE_B)
310 are not aliased. Return TRUE if they differ. */
311 static bool
312 record_array_differ_p (struct data_reference *dra,
313 struct data_reference *drb)
314 {
315 bool aliased;
316 tree base_a = DR_BASE_OBJECT (dra);
317 tree base_b = DR_BASE_OBJECT (drb);
318
319 if (TREE_CODE (base_b) != COMPONENT_REF)
320 return false;
321
322 /* Peel COMPONENT_REFs to get to the base. Do not peel INDIRECT_REFs.
323 For a.b.c.d[i] we will get a, and for a.b->c.d[i] we will get a.b.
324 Probably will be unnecessary with struct alias analysis. */
325 while (TREE_CODE (base_b) == COMPONENT_REF)
326 base_b = TREE_OPERAND (base_b, 0);
327
328 /* Compare a record/union access (b.c[i] or p->c[i]) and an array access
329 (a[i]). In case of p->c[i] use alias analysis to verify that p is not
330 pointing to a. */
331 if (TREE_CODE (base_a) == VAR_DECL
332 && (TREE_CODE (base_b) == VAR_DECL
333 || (TREE_CODE (base_b) == INDIRECT_REF
334 && (ptr_decl_may_alias_p (TREE_OPERAND (base_b, 0), base_a, drb,
335 &aliased)
336 && !aliased))))
337 return true;
338 else
339 return false;
340 }
341
342
343 /* Determine if an array access (BASE_A) and a pointer (BASE_B)
344 are not aliased. Return TRUE if they differ. */
345 static bool
346 array_ptr_differ_p (tree base_a, tree base_b,
347 struct data_reference *drb)
348 {
349 bool aliased;
350
351 /* In case one of the bases is a pointer (a[i] and (*p)[i]), we check with the
352 help of alias analysis that p is not pointing to a. */
353 if (TREE_CODE (base_a) == VAR_DECL && TREE_CODE (base_b) == INDIRECT_REF
354 && (ptr_decl_may_alias_p (TREE_OPERAND (base_b, 0), base_a, drb, &aliased)
355 && !aliased))
356 return true;
357 else
358 return false;
359 }
360
361
362 /* This is the simplest data dependence test: determines whether the
363 data references A and B access the same array/region. Returns
364 false when the property is not computable at compile time.
365 Otherwise return true, and DIFFER_P will record the result. This
366 utility will not be necessary when alias_sets_conflict_p will be
367 less conservative. */
368
369 static bool
370 base_object_differ_p (struct data_reference *a,
371 struct data_reference *b,
372 bool *differ_p)
373 {
374 tree base_a = DR_BASE_OBJECT (a);
375 tree base_b = DR_BASE_OBJECT (b);
376 bool aliased;
377
378 if (!base_a || !base_b)
379 return false;
380
381 /* Determine if same base. Example: for the array accesses
382 a[i], b[i] or pointer accesses *a, *b, bases are a, b. */
383 if (base_a == base_b)
384 {
385 *differ_p = false;
386 return true;
387 }
388
389 /* For pointer based accesses, (*p)[i], (*q)[j], the bases are (*p)
390 and (*q) */
391 if (TREE_CODE (base_a) == INDIRECT_REF && TREE_CODE (base_b) == INDIRECT_REF
392 && TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0))
393 {
394 *differ_p = false;
395 return true;
396 }
397
398 /* Record/union based accesses - s.a[i], t.b[j]. bases are s.a,t.b. */
399 if (TREE_CODE (base_a) == COMPONENT_REF && TREE_CODE (base_b) == COMPONENT_REF
400 && TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0)
401 && TREE_OPERAND (base_a, 1) == TREE_OPERAND (base_b, 1))
402 {
403 *differ_p = false;
404 return true;
405 }
406
407
408 /* Determine if different bases. */
409
410 /* At this point we know that base_a != base_b. However, pointer
411 accesses of the form x=(*p) and y=(*q), whose bases are p and q,
412 may still be pointing to the same base. In SSAed GIMPLE p and q will
413 be SSA_NAMES in this case. Therefore, here we check if they are
414 really two different declarations. */
415 if (TREE_CODE (base_a) == VAR_DECL && TREE_CODE (base_b) == VAR_DECL)
416 {
417 *differ_p = true;
418 return true;
419 }
420
421 /* In case one of the bases is a pointer (a[i] and (*p)[i]), we check with the
422 help of alias analysis that p is not pointing to a. */
423 if (array_ptr_differ_p (base_a, base_b, b)
424 || array_ptr_differ_p (base_b, base_a, a))
425 {
426 *differ_p = true;
427 return true;
428 }
429
430 /* If the bases are pointers ((*q)[i] and (*p)[i]), we check with the
431 help of alias analysis they don't point to the same bases. */
432 if (TREE_CODE (base_a) == INDIRECT_REF && TREE_CODE (base_b) == INDIRECT_REF
433 && (may_alias_p (TREE_OPERAND (base_a, 0), TREE_OPERAND (base_b, 0), a, b,
434 &aliased)
435 && !aliased))
436 {
437 *differ_p = true;
438 return true;
439 }
440
441 /* Compare two record/union bases s.a and t.b: s != t or (a != b and
442 s and t are not unions). */
443 if (TREE_CODE (base_a) == COMPONENT_REF && TREE_CODE (base_b) == COMPONENT_REF
444 && ((TREE_CODE (TREE_OPERAND (base_a, 0)) == VAR_DECL
445 && TREE_CODE (TREE_OPERAND (base_b, 0)) == VAR_DECL
446 && TREE_OPERAND (base_a, 0) != TREE_OPERAND (base_b, 0))
447 || (TREE_CODE (TREE_TYPE (TREE_OPERAND (base_a, 0))) == RECORD_TYPE
448 && TREE_CODE (TREE_TYPE (TREE_OPERAND (base_b, 0))) == RECORD_TYPE
449 && TREE_OPERAND (base_a, 1) != TREE_OPERAND (base_b, 1))))
450 {
451 *differ_p = true;
452 return true;
453 }
454
455 /* Compare a record/union access (b.c[i] or p->c[i]) and a pointer
456 ((*q)[i]). */
457 if (record_ptr_differ_p (a, b) || record_ptr_differ_p (b, a))
458 {
459 *differ_p = true;
460 return true;
461 }
462
463 /* Compare a record/union access (b.c[i] or p->c[i]) and an array access
464 (a[i]). In case of p->c[i] use alias analysis to verify that p is not
465 pointing to a. */
466 if (record_array_differ_p (a, b) || record_array_differ_p (b, a))
467 {
468 *differ_p = true;
469 return true;
470 }
471
472 /* Compare two record/union accesses (b.c[i] or p->c[i]). */
473 if (record_record_differ_p (a, b))
474 {
475 *differ_p = true;
476 return true;
477 }
478
479 return false;
480 }
481
482 /* Function base_addr_differ_p.
483
484 This is the simplest data dependence test: determines whether the
485 data references DRA and DRB access the same array/region. Returns
486 false when the property is not computable at compile time.
487 Otherwise return true, and DIFFER_P will record the result.
488
489 The algorithm:
490 1. if (both DRA and DRB are represented as arrays)
491 compare DRA.BASE_OBJECT and DRB.BASE_OBJECT
492 2. else if (both DRA and DRB are represented as pointers)
493 try to prove that DRA.FIRST_LOCATION == DRB.FIRST_LOCATION
494 3. else if (DRA and DRB are represented differently or 2. fails)
495 only try to prove that the bases are surely different
496 */
497
498 static bool
499 base_addr_differ_p (struct data_reference *dra,
500 struct data_reference *drb,
501 bool *differ_p)
502 {
503 tree addr_a = DR_BASE_ADDRESS (dra);
504 tree addr_b = DR_BASE_ADDRESS (drb);
505 tree type_a, type_b;
506 tree decl_a, decl_b;
507 bool aliased;
508
509 if (!addr_a || !addr_b)
510 return false;
511
512 type_a = TREE_TYPE (addr_a);
513 type_b = TREE_TYPE (addr_b);
514
515 gcc_assert (POINTER_TYPE_P (type_a) && POINTER_TYPE_P (type_b));
516
517 /* 1. if (both DRA and DRB are represented as arrays)
518 compare DRA.BASE_OBJECT and DRB.BASE_OBJECT. */
519 if (DR_TYPE (dra) == ARRAY_REF_TYPE && DR_TYPE (drb) == ARRAY_REF_TYPE)
520 return base_object_differ_p (dra, drb, differ_p);
521
522 /* 2. else if (both DRA and DRB are represented as pointers)
523 try to prove that DRA.FIRST_LOCATION == DRB.FIRST_LOCATION. */
524 /* If base addresses are the same, we check the offsets, since the access of
525 the data-ref is described by {base addr + offset} and its access function,
526 i.e., in order to decide whether the bases of data-refs are the same we
527 compare both base addresses and offsets. */
528 if (DR_TYPE (dra) == POINTER_REF_TYPE && DR_TYPE (drb) == POINTER_REF_TYPE
529 && (addr_a == addr_b
530 || (TREE_CODE (addr_a) == ADDR_EXPR && TREE_CODE (addr_b) == ADDR_EXPR
531 && TREE_OPERAND (addr_a, 0) == TREE_OPERAND (addr_b, 0))))
532 {
533 /* Compare offsets. */
534 tree offset_a = DR_OFFSET (dra);
535 tree offset_b = DR_OFFSET (drb);
536
537 STRIP_NOPS (offset_a);
538 STRIP_NOPS (offset_b);
539
540 /* FORNOW: we only compare offsets that are MULT_EXPR, i.e., we don't handle
541 PLUS_EXPR. */
542 if (offset_a == offset_b
543 || (TREE_CODE (offset_a) == MULT_EXPR
544 && TREE_CODE (offset_b) == MULT_EXPR
545 && TREE_OPERAND (offset_a, 0) == TREE_OPERAND (offset_b, 0)
546 && TREE_OPERAND (offset_a, 1) == TREE_OPERAND (offset_b, 1)))
547 {
548 *differ_p = false;
549 return true;
550 }
551 }
552
553 /* 3. else if (DRA and DRB are represented differently or 2. fails)
554 only try to prove that the bases are surely different. */
555
556 /* Apply alias analysis. */
557 if (may_alias_p (addr_a, addr_b, dra, drb, &aliased) && !aliased)
558 {
559 *differ_p = true;
560 return true;
561 }
562
563 /* An instruction writing through a restricted pointer is "independent" of any
564 instruction reading or writing through a different restricted pointer,
565 in the same block/scope. */
566 else if (TYPE_RESTRICT (type_a)
567 && TYPE_RESTRICT (type_b)
568 && (!DR_IS_READ (drb) || !DR_IS_READ (dra))
569 && TREE_CODE (DR_BASE_ADDRESS (dra)) == SSA_NAME
570 && (decl_a = SSA_NAME_VAR (DR_BASE_ADDRESS (dra)))
571 && TREE_CODE (decl_a) == PARM_DECL
572 && TREE_CODE (DECL_CONTEXT (decl_a)) == FUNCTION_DECL
573 && TREE_CODE (DR_BASE_ADDRESS (drb)) == SSA_NAME
574 && (decl_b = SSA_NAME_VAR (DR_BASE_ADDRESS (drb)))
575 && TREE_CODE (decl_b) == PARM_DECL
576 && TREE_CODE (DECL_CONTEXT (decl_b)) == FUNCTION_DECL
577 && DECL_CONTEXT (decl_a) == DECL_CONTEXT (decl_b))
578 {
579 *differ_p = true;
580 return true;
581 }
582
583 return false;
584 }
585
586 /* Returns true iff A divides B. */
587
588 static inline bool
589 tree_fold_divides_p (tree a, tree b)
590 {
591 gcc_assert (TREE_CODE (a) == INTEGER_CST);
592 gcc_assert (TREE_CODE (b) == INTEGER_CST);
593 return integer_zerop (int_const_binop (TRUNC_MOD_EXPR, b, a, 0));
594 }
595
596 /* Returns true iff A divides B. */
597
598 static inline bool
599 int_divides_p (int a, int b)
600 {
601 return ((b % a) == 0);
602 }
603
604 \f
605
606 /* Dump into FILE all the data references from DATAREFS. */
607
608 void
609 dump_data_references (FILE *file, VEC (data_reference_p, heap) *datarefs)
610 {
611 unsigned int i;
612 struct data_reference *dr;
613
614 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
615 dump_data_reference (file, dr);
616 }
617
618 /* Dump into FILE all the dependence relations from DDRS. */
619
620 void
621 dump_data_dependence_relations (FILE *file,
622 VEC (ddr_p, heap) *ddrs)
623 {
624 unsigned int i;
625 struct data_dependence_relation *ddr;
626
627 for (i = 0; VEC_iterate (ddr_p, ddrs, i, ddr); i++)
628 dump_data_dependence_relation (file, ddr);
629 }
630
631 /* Dump function for a DATA_REFERENCE structure. */
632
633 void
634 dump_data_reference (FILE *outf,
635 struct data_reference *dr)
636 {
637 unsigned int i;
638
639 fprintf (outf, "(Data Ref: \n stmt: ");
640 print_generic_stmt (outf, DR_STMT (dr), 0);
641 fprintf (outf, " ref: ");
642 print_generic_stmt (outf, DR_REF (dr), 0);
643 fprintf (outf, " base_object: ");
644 print_generic_stmt (outf, DR_BASE_OBJECT (dr), 0);
645
646 for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
647 {
648 fprintf (outf, " Access function %d: ", i);
649 print_generic_stmt (outf, DR_ACCESS_FN (dr, i), 0);
650 }
651 fprintf (outf, ")\n");
652 }
653
654 /* Dumps the affine function described by FN to the file OUTF. */
655
656 static void
657 dump_affine_function (FILE *outf, affine_fn fn)
658 {
659 unsigned i;
660 tree coef;
661
662 print_generic_expr (outf, VEC_index (tree, fn, 0), TDF_SLIM);
663 for (i = 1; VEC_iterate (tree, fn, i, coef); i++)
664 {
665 fprintf (outf, " + ");
666 print_generic_expr (outf, coef, TDF_SLIM);
667 fprintf (outf, " * x_%u", i);
668 }
669 }
670
671 /* Dumps the conflict function CF to the file OUTF. */
672
673 static void
674 dump_conflict_function (FILE *outf, conflict_function *cf)
675 {
676 unsigned i;
677
678 if (cf->n == NO_DEPENDENCE)
679 fprintf (outf, "no dependence\n");
680 else if (cf->n == NOT_KNOWN)
681 fprintf (outf, "not known\n");
682 else
683 {
684 for (i = 0; i < cf->n; i++)
685 {
686 fprintf (outf, "[");
687 dump_affine_function (outf, cf->fns[i]);
688 fprintf (outf, "]\n");
689 }
690 }
691 }
692
693 /* Dump function for a SUBSCRIPT structure. */
694
695 void
696 dump_subscript (FILE *outf, struct subscript *subscript)
697 {
698 conflict_function *cf = SUB_CONFLICTS_IN_A (subscript);
699
700 fprintf (outf, "\n (subscript \n");
701 fprintf (outf, " iterations_that_access_an_element_twice_in_A: ");
702 dump_conflict_function (outf, cf);
703 if (CF_NONTRIVIAL_P (cf))
704 {
705 tree last_iteration = SUB_LAST_CONFLICT (subscript);
706 fprintf (outf, " last_conflict: ");
707 print_generic_stmt (outf, last_iteration, 0);
708 }
709
710 cf = SUB_CONFLICTS_IN_B (subscript);
711 fprintf (outf, " iterations_that_access_an_element_twice_in_B: ");
712 dump_conflict_function (outf, cf);
713 if (CF_NONTRIVIAL_P (cf))
714 {
715 tree last_iteration = SUB_LAST_CONFLICT (subscript);
716 fprintf (outf, " last_conflict: ");
717 print_generic_stmt (outf, last_iteration, 0);
718 }
719
720 fprintf (outf, " (Subscript distance: ");
721 print_generic_stmt (outf, SUB_DISTANCE (subscript), 0);
722 fprintf (outf, " )\n");
723 fprintf (outf, " )\n");
724 }
725
726 /* Print the classic direction vector DIRV to OUTF. */
727
728 void
729 print_direction_vector (FILE *outf,
730 lambda_vector dirv,
731 int length)
732 {
733 int eq;
734
735 for (eq = 0; eq < length; eq++)
736 {
737 enum data_dependence_direction dir = dirv[eq];
738
739 switch (dir)
740 {
741 case dir_positive:
742 fprintf (outf, " +");
743 break;
744 case dir_negative:
745 fprintf (outf, " -");
746 break;
747 case dir_equal:
748 fprintf (outf, " =");
749 break;
750 case dir_positive_or_equal:
751 fprintf (outf, " +=");
752 break;
753 case dir_positive_or_negative:
754 fprintf (outf, " +-");
755 break;
756 case dir_negative_or_equal:
757 fprintf (outf, " -=");
758 break;
759 case dir_star:
760 fprintf (outf, " *");
761 break;
762 default:
763 fprintf (outf, "indep");
764 break;
765 }
766 }
767 fprintf (outf, "\n");
768 }
769
770 /* Print a vector of direction vectors. */
771
772 void
773 print_dir_vectors (FILE *outf, VEC (lambda_vector, heap) *dir_vects,
774 int length)
775 {
776 unsigned j;
777 lambda_vector v;
778
779 for (j = 0; VEC_iterate (lambda_vector, dir_vects, j, v); j++)
780 print_direction_vector (outf, v, length);
781 }
782
783 /* Print a vector of distance vectors. */
784
785 void
786 print_dist_vectors (FILE *outf, VEC (lambda_vector, heap) *dist_vects,
787 int length)
788 {
789 unsigned j;
790 lambda_vector v;
791
792 for (j = 0; VEC_iterate (lambda_vector, dist_vects, j, v); j++)
793 print_lambda_vector (outf, v, length);
794 }
795
796 /* Debug version. */
797
798 void
799 debug_data_dependence_relation (struct data_dependence_relation *ddr)
800 {
801 dump_data_dependence_relation (stderr, ddr);
802 }
803
804 /* Dump function for a DATA_DEPENDENCE_RELATION structure. */
805
806 void
807 dump_data_dependence_relation (FILE *outf,
808 struct data_dependence_relation *ddr)
809 {
810 struct data_reference *dra, *drb;
811
812 dra = DDR_A (ddr);
813 drb = DDR_B (ddr);
814 fprintf (outf, "(Data Dep: \n");
815 if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
816 fprintf (outf, " (don't know)\n");
817
818 else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
819 fprintf (outf, " (no dependence)\n");
820
821 else if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
822 {
823 unsigned int i;
824 struct loop *loopi;
825
826 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
827 {
828 fprintf (outf, " access_fn_A: ");
829 print_generic_stmt (outf, DR_ACCESS_FN (dra, i), 0);
830 fprintf (outf, " access_fn_B: ");
831 print_generic_stmt (outf, DR_ACCESS_FN (drb, i), 0);
832 dump_subscript (outf, DDR_SUBSCRIPT (ddr, i));
833 }
834
835 fprintf (outf, " loop nest: (");
836 for (i = 0; VEC_iterate (loop_p, DDR_LOOP_NEST (ddr), i, loopi); i++)
837 fprintf (outf, "%d ", loopi->num);
838 fprintf (outf, ")\n");
839
840 for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
841 {
842 fprintf (outf, " distance_vector: ");
843 print_lambda_vector (outf, DDR_DIST_VECT (ddr, i),
844 DDR_NB_LOOPS (ddr));
845 }
846
847 for (i = 0; i < DDR_NUM_DIR_VECTS (ddr); i++)
848 {
849 fprintf (outf, " direction_vector: ");
850 print_direction_vector (outf, DDR_DIR_VECT (ddr, i),
851 DDR_NB_LOOPS (ddr));
852 }
853 }
854
855 fprintf (outf, ")\n");
856 }
857
858 /* Dump function for a DATA_DEPENDENCE_DIRECTION structure. */
859
860 void
861 dump_data_dependence_direction (FILE *file,
862 enum data_dependence_direction dir)
863 {
864 switch (dir)
865 {
866 case dir_positive:
867 fprintf (file, "+");
868 break;
869
870 case dir_negative:
871 fprintf (file, "-");
872 break;
873
874 case dir_equal:
875 fprintf (file, "=");
876 break;
877
878 case dir_positive_or_negative:
879 fprintf (file, "+-");
880 break;
881
882 case dir_positive_or_equal:
883 fprintf (file, "+=");
884 break;
885
886 case dir_negative_or_equal:
887 fprintf (file, "-=");
888 break;
889
890 case dir_star:
891 fprintf (file, "*");
892 break;
893
894 default:
895 break;
896 }
897 }
898
899 /* Dumps the distance and direction vectors in FILE. DDRS contains
900 the dependence relations, and VECT_SIZE is the size of the
901 dependence vectors, or in other words the number of loops in the
902 considered nest. */
903
904 void
905 dump_dist_dir_vectors (FILE *file, VEC (ddr_p, heap) *ddrs)
906 {
907 unsigned int i, j;
908 struct data_dependence_relation *ddr;
909 lambda_vector v;
910
911 for (i = 0; VEC_iterate (ddr_p, ddrs, i, ddr); i++)
912 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_AFFINE_P (ddr))
913 {
914 for (j = 0; VEC_iterate (lambda_vector, DDR_DIST_VECTS (ddr), j, v); j++)
915 {
916 fprintf (file, "DISTANCE_V (");
917 print_lambda_vector (file, v, DDR_NB_LOOPS (ddr));
918 fprintf (file, ")\n");
919 }
920
921 for (j = 0; VEC_iterate (lambda_vector, DDR_DIR_VECTS (ddr), j, v); j++)
922 {
923 fprintf (file, "DIRECTION_V (");
924 print_direction_vector (file, v, DDR_NB_LOOPS (ddr));
925 fprintf (file, ")\n");
926 }
927 }
928
929 fprintf (file, "\n\n");
930 }
931
932 /* Dumps the data dependence relations DDRS in FILE. */
933
934 void
935 dump_ddrs (FILE *file, VEC (ddr_p, heap) *ddrs)
936 {
937 unsigned int i;
938 struct data_dependence_relation *ddr;
939
940 for (i = 0; VEC_iterate (ddr_p, ddrs, i, ddr); i++)
941 dump_data_dependence_relation (file, ddr);
942
943 fprintf (file, "\n\n");
944 }
945
946 \f
947
948 /* Given an ARRAY_REF node REF, records its access functions.
949 Example: given A[i][3], record in ACCESS_FNS the opnd1 function,
950 i.e. the constant "3", then recursively call the function on opnd0,
951 i.e. the ARRAY_REF "A[i]".
952 The function returns the base name: "A". */
953
954 static tree
955 analyze_array_indexes (struct loop *loop,
956 VEC(tree,heap) **access_fns,
957 tree ref, tree stmt)
958 {
959 tree opnd0, opnd1;
960 tree access_fn;
961
962 opnd0 = TREE_OPERAND (ref, 0);
963 opnd1 = TREE_OPERAND (ref, 1);
964
965 /* The detection of the evolution function for this data access is
966 postponed until the dependence test. This lazy strategy avoids
967 the computation of access functions that are of no interest for
968 the optimizers. */
969 access_fn = instantiate_parameters
970 (loop, analyze_scalar_evolution (loop, opnd1));
971
972 VEC_safe_push (tree, heap, *access_fns, access_fn);
973
974 /* Recursively record other array access functions. */
975 if (TREE_CODE (opnd0) == ARRAY_REF)
976 return analyze_array_indexes (loop, access_fns, opnd0, stmt);
977
978 /* Return the base name of the data access. */
979 else
980 return opnd0;
981 }
982
983 /* For a data reference REF contained in the statement STMT, initialize
984 a DATA_REFERENCE structure, and return it. IS_READ flag has to be
985 set to true when REF is in the right hand side of an
986 assignment. */
987
988 struct data_reference *
989 analyze_array (tree stmt, tree ref, bool is_read)
990 {
991 struct data_reference *res;
992 VEC(tree,heap) *acc_fns;
993
994 if (dump_file && (dump_flags & TDF_DETAILS))
995 {
996 fprintf (dump_file, "(analyze_array \n");
997 fprintf (dump_file, " (ref = ");
998 print_generic_stmt (dump_file, ref, 0);
999 fprintf (dump_file, ")\n");
1000 }
1001
1002 res = XNEW (struct data_reference);
1003
1004 DR_STMT (res) = stmt;
1005 DR_REF (res) = ref;
1006 acc_fns = VEC_alloc (tree, heap, 3);
1007 DR_BASE_OBJECT (res) = analyze_array_indexes
1008 (loop_containing_stmt (stmt), &acc_fns, ref, stmt);
1009 DR_TYPE (res) = ARRAY_REF_TYPE;
1010 DR_SET_ACCESS_FNS (res, acc_fns);
1011 DR_IS_READ (res) = is_read;
1012 DR_BASE_ADDRESS (res) = NULL_TREE;
1013 DR_OFFSET (res) = NULL_TREE;
1014 DR_INIT (res) = NULL_TREE;
1015 DR_STEP (res) = NULL_TREE;
1016 DR_OFFSET_MISALIGNMENT (res) = NULL_TREE;
1017 DR_MEMTAG (res) = NULL_TREE;
1018 DR_PTR_INFO (res) = NULL;
1019
1020 if (dump_file && (dump_flags & TDF_DETAILS))
1021 fprintf (dump_file, ")\n");
1022
1023 return res;
1024 }
1025
1026 /* Analyze an indirect memory reference, REF, that comes from STMT.
1027 IS_READ is true if this is an indirect load, and false if it is
1028 an indirect store.
1029 Return a new data reference structure representing the indirect_ref, or
1030 NULL if we cannot describe the access function. */
1031
1032 static struct data_reference *
1033 analyze_indirect_ref (tree stmt, tree ref, bool is_read)
1034 {
1035 struct loop *loop = loop_containing_stmt (stmt);
1036 tree ptr_ref = TREE_OPERAND (ref, 0);
1037 tree access_fn = analyze_scalar_evolution (loop, ptr_ref);
1038 tree init = initial_condition_in_loop_num (access_fn, loop->num);
1039 tree base_address = NULL_TREE, evolution, step = NULL_TREE;
1040 struct ptr_info_def *ptr_info = NULL;
1041
1042 if (TREE_CODE (ptr_ref) == SSA_NAME)
1043 ptr_info = SSA_NAME_PTR_INFO (ptr_ref);
1044
1045 STRIP_NOPS (init);
1046 if (access_fn == chrec_dont_know || !init || init == chrec_dont_know)
1047 {
1048 if (dump_file && (dump_flags & TDF_DETAILS))
1049 {
1050 fprintf (dump_file, "\nBad access function of ptr: ");
1051 print_generic_expr (dump_file, ref, TDF_SLIM);
1052 fprintf (dump_file, "\n");
1053 }
1054 return NULL;
1055 }
1056
1057 if (dump_file && (dump_flags & TDF_DETAILS))
1058 {
1059 fprintf (dump_file, "\nAccess function of ptr: ");
1060 print_generic_expr (dump_file, access_fn, TDF_SLIM);
1061 fprintf (dump_file, "\n");
1062 }
1063
1064 if (!expr_invariant_in_loop_p (loop, init))
1065 {
1066 if (dump_file && (dump_flags & TDF_DETAILS))
1067 fprintf (dump_file, "\ninitial condition is not loop invariant.\n");
1068 }
1069 else
1070 {
1071 base_address = init;
1072 evolution = evolution_part_in_loop_num (access_fn, loop->num);
1073 if (evolution != chrec_dont_know)
1074 {
1075 if (!evolution)
1076 step = ssize_int (0);
1077 else
1078 {
1079 if (TREE_CODE (evolution) == INTEGER_CST)
1080 step = fold_convert (ssizetype, evolution);
1081 else
1082 if (dump_file && (dump_flags & TDF_DETAILS))
1083 fprintf (dump_file, "\nnon constant step for ptr access.\n");
1084 }
1085 }
1086 else
1087 if (dump_file && (dump_flags & TDF_DETAILS))
1088 fprintf (dump_file, "\nunknown evolution of ptr.\n");
1089 }
1090 return init_data_ref (stmt, ref, NULL_TREE, access_fn, is_read, base_address,
1091 NULL_TREE, step, NULL_TREE, NULL_TREE,
1092 ptr_info, POINTER_REF_TYPE);
1093 }
1094
1095 /* For a data reference REF contained in the statement STMT, initialize
1096 a DATA_REFERENCE structure, and return it. */
1097
1098 struct data_reference *
1099 init_data_ref (tree stmt,
1100 tree ref,
1101 tree base,
1102 tree access_fn,
1103 bool is_read,
1104 tree base_address,
1105 tree init_offset,
1106 tree step,
1107 tree misalign,
1108 tree memtag,
1109 struct ptr_info_def *ptr_info,
1110 enum data_ref_type type)
1111 {
1112 struct data_reference *res;
1113 VEC(tree,heap) *acc_fns;
1114
1115 if (dump_file && (dump_flags & TDF_DETAILS))
1116 {
1117 fprintf (dump_file, "(init_data_ref \n");
1118 fprintf (dump_file, " (ref = ");
1119 print_generic_stmt (dump_file, ref, 0);
1120 fprintf (dump_file, ")\n");
1121 }
1122
1123 res = XNEW (struct data_reference);
1124
1125 DR_STMT (res) = stmt;
1126 DR_REF (res) = ref;
1127 DR_BASE_OBJECT (res) = base;
1128 DR_TYPE (res) = type;
1129 acc_fns = VEC_alloc (tree, heap, 3);
1130 DR_SET_ACCESS_FNS (res, acc_fns);
1131 VEC_quick_push (tree, DR_ACCESS_FNS (res), access_fn);
1132 DR_IS_READ (res) = is_read;
1133 DR_BASE_ADDRESS (res) = base_address;
1134 DR_OFFSET (res) = init_offset;
1135 DR_INIT (res) = NULL_TREE;
1136 DR_STEP (res) = step;
1137 DR_OFFSET_MISALIGNMENT (res) = misalign;
1138 DR_MEMTAG (res) = memtag;
1139 DR_PTR_INFO (res) = ptr_info;
1140
1141 if (dump_file && (dump_flags & TDF_DETAILS))
1142 fprintf (dump_file, ")\n");
1143
1144 return res;
1145 }
1146
1147 /* Function strip_conversions
1148
1149 Strip conversions that don't narrow the mode. */
1150
1151 static tree
1152 strip_conversion (tree expr)
1153 {
1154 tree to, ti, oprnd0;
1155
1156 while (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR)
1157 {
1158 to = TREE_TYPE (expr);
1159 oprnd0 = TREE_OPERAND (expr, 0);
1160 ti = TREE_TYPE (oprnd0);
1161
1162 if (!INTEGRAL_TYPE_P (to) || !INTEGRAL_TYPE_P (ti))
1163 return NULL_TREE;
1164 if (GET_MODE_SIZE (TYPE_MODE (to)) < GET_MODE_SIZE (TYPE_MODE (ti)))
1165 return NULL_TREE;
1166
1167 expr = oprnd0;
1168 }
1169 return expr;
1170 }
1171 \f
1172
1173 /* Function analyze_offset_expr
1174
1175 Given an offset expression EXPR received from get_inner_reference, analyze
1176 it and create an expression for INITIAL_OFFSET by substituting the variables
1177 of EXPR with initial_condition of the corresponding access_fn in the loop.
1178 E.g.,
1179 for i
1180 for (j = 3; j < N; j++)
1181 a[j].b[i][j] = 0;
1182
1183 For a[j].b[i][j], EXPR will be 'i * C_i + j * C_j + C'. 'i' cannot be
1184 substituted, since its access_fn in the inner loop is i. 'j' will be
1185 substituted with 3. An INITIAL_OFFSET will be 'i * C_i + C`', where
1186 C` = 3 * C_j + C.
1187
1188 Compute MISALIGN (the misalignment of the data reference initial access from
1189 its base). Misalignment can be calculated only if all the variables can be
1190 substituted with constants, otherwise, we record maximum possible alignment
1191 in ALIGNED_TO. In the above example, since 'i' cannot be substituted, MISALIGN
1192 will be NULL_TREE, and the biggest divider of C_i (a power of 2) will be
1193 recorded in ALIGNED_TO.
1194
1195 STEP is an evolution of the data reference in this loop in bytes.
1196 In the above example, STEP is C_j.
1197
1198 Return FALSE, if the analysis fails, e.g., there is no access_fn for a
1199 variable. In this case, all the outputs (INITIAL_OFFSET, MISALIGN, ALIGNED_TO
1200 and STEP) are NULL_TREEs. Otherwise, return TRUE.
1201
1202 */
1203
1204 static bool
1205 analyze_offset_expr (tree expr,
1206 struct loop *loop,
1207 tree *initial_offset,
1208 tree *misalign,
1209 tree *aligned_to,
1210 tree *step)
1211 {
1212 tree oprnd0;
1213 tree oprnd1;
1214 tree left_offset = ssize_int (0);
1215 tree right_offset = ssize_int (0);
1216 tree left_misalign = ssize_int (0);
1217 tree right_misalign = ssize_int (0);
1218 tree left_step = ssize_int (0);
1219 tree right_step = ssize_int (0);
1220 enum tree_code code;
1221 tree init, evolution;
1222 tree left_aligned_to = NULL_TREE, right_aligned_to = NULL_TREE;
1223
1224 *step = NULL_TREE;
1225 *misalign = NULL_TREE;
1226 *aligned_to = NULL_TREE;
1227 *initial_offset = NULL_TREE;
1228
1229 /* Strip conversions that don't narrow the mode. */
1230 expr = strip_conversion (expr);
1231 if (!expr)
1232 return false;
1233
1234 /* Stop conditions:
1235 1. Constant. */
1236 if (TREE_CODE (expr) == INTEGER_CST)
1237 {
1238 *initial_offset = fold_convert (ssizetype, expr);
1239 *misalign = fold_convert (ssizetype, expr);
1240 *step = ssize_int (0);
1241 return true;
1242 }
1243
1244 /* 2. Variable. Try to substitute with initial_condition of the corresponding
1245 access_fn in the current loop. */
1246 if (SSA_VAR_P (expr))
1247 {
1248 tree access_fn = analyze_scalar_evolution (loop, expr);
1249
1250 if (access_fn == chrec_dont_know)
1251 /* No access_fn. */
1252 return false;
1253
1254 init = initial_condition_in_loop_num (access_fn, loop->num);
1255 if (!expr_invariant_in_loop_p (loop, init))
1256 /* Not enough information: may be not loop invariant.
1257 E.g., for a[b[i]], we get a[D], where D=b[i]. EXPR is D, its
1258 initial_condition is D, but it depends on i - loop's induction
1259 variable. */
1260 return false;
1261
1262 evolution = evolution_part_in_loop_num (access_fn, loop->num);
1263 if (evolution && TREE_CODE (evolution) != INTEGER_CST)
1264 /* Evolution is not constant. */
1265 return false;
1266
1267 if (TREE_CODE (init) == INTEGER_CST)
1268 *misalign = fold_convert (ssizetype, init);
1269 else
1270 /* Not constant, misalignment cannot be calculated. */
1271 *misalign = NULL_TREE;
1272
1273 *initial_offset = fold_convert (ssizetype, init);
1274
1275 *step = evolution ? fold_convert (ssizetype, evolution) : ssize_int (0);
1276 return true;
1277 }
1278
1279 /* Recursive computation. */
1280 if (!BINARY_CLASS_P (expr))
1281 {
1282 /* We expect to get binary expressions (PLUS/MINUS and MULT). */
1283 if (dump_file && (dump_flags & TDF_DETAILS))
1284 {
1285 fprintf (dump_file, "\nNot binary expression ");
1286 print_generic_expr (dump_file, expr, TDF_SLIM);
1287 fprintf (dump_file, "\n");
1288 }
1289 return false;
1290 }
1291 oprnd0 = TREE_OPERAND (expr, 0);
1292 oprnd1 = TREE_OPERAND (expr, 1);
1293
1294 if (!analyze_offset_expr (oprnd0, loop, &left_offset, &left_misalign,
1295 &left_aligned_to, &left_step)
1296 || !analyze_offset_expr (oprnd1, loop, &right_offset, &right_misalign,
1297 &right_aligned_to, &right_step))
1298 return false;
1299
1300 /* The type of the operation: plus, minus or mult. */
1301 code = TREE_CODE (expr);
1302 switch (code)
1303 {
1304 case MULT_EXPR:
1305 if (TREE_CODE (right_offset) != INTEGER_CST)
1306 /* RIGHT_OFFSET can be not constant. For example, for arrays of variable
1307 sized types.
1308 FORNOW: We don't support such cases. */
1309 return false;
1310
1311 /* Strip conversions that don't narrow the mode. */
1312 left_offset = strip_conversion (left_offset);
1313 if (!left_offset)
1314 return false;
1315 /* Misalignment computation. */
1316 if (SSA_VAR_P (left_offset))
1317 {
1318 /* If the left side contains variables that can't be substituted with
1319 constants, the misalignment is unknown. However, if the right side
1320 is a multiple of some alignment, we know that the expression is
1321 aligned to it. Therefore, we record such maximum possible value.
1322 */
1323 *misalign = NULL_TREE;
1324 *aligned_to = ssize_int (highest_pow2_factor (right_offset));
1325 }
1326 else
1327 {
1328 /* The left operand was successfully substituted with constant. */
1329 if (left_misalign)
1330 {
1331 /* In case of EXPR '(i * C1 + j) * C2', LEFT_MISALIGN is
1332 NULL_TREE. */
1333 *misalign = size_binop (code, left_misalign, right_misalign);
1334 if (left_aligned_to && right_aligned_to)
1335 *aligned_to = size_binop (MIN_EXPR, left_aligned_to,
1336 right_aligned_to);
1337 else
1338 *aligned_to = left_aligned_to ?
1339 left_aligned_to : right_aligned_to;
1340 }
1341 else
1342 *misalign = NULL_TREE;
1343 }
1344
1345 /* Step calculation. */
1346 /* Multiply the step by the right operand. */
1347 *step = size_binop (MULT_EXPR, left_step, right_offset);
1348 break;
1349
1350 case PLUS_EXPR:
1351 case MINUS_EXPR:
1352 /* Combine the recursive calculations for step and misalignment. */
1353 *step = size_binop (code, left_step, right_step);
1354
1355 /* Unknown alignment. */
1356 if ((!left_misalign && !left_aligned_to)
1357 || (!right_misalign && !right_aligned_to))
1358 {
1359 *misalign = NULL_TREE;
1360 *aligned_to = NULL_TREE;
1361 break;
1362 }
1363
1364 if (left_misalign && right_misalign)
1365 *misalign = size_binop (code, left_misalign, right_misalign);
1366 else
1367 *misalign = left_misalign ? left_misalign : right_misalign;
1368
1369 if (left_aligned_to && right_aligned_to)
1370 *aligned_to = size_binop (MIN_EXPR, left_aligned_to, right_aligned_to);
1371 else
1372 *aligned_to = left_aligned_to ? left_aligned_to : right_aligned_to;
1373
1374 break;
1375
1376 default:
1377 gcc_unreachable ();
1378 }
1379
1380 /* Compute offset. */
1381 *initial_offset = fold_convert (ssizetype,
1382 fold_build2 (code, TREE_TYPE (left_offset),
1383 left_offset,
1384 right_offset));
1385 return true;
1386 }
1387
1388 /* Function address_analysis
1389
1390 Return the BASE of the address expression EXPR.
1391 Also compute the OFFSET from BASE, MISALIGN and STEP.
1392
1393 Input:
1394 EXPR - the address expression that is being analyzed
1395 STMT - the statement that contains EXPR or its original memory reference
1396 IS_READ - TRUE if STMT reads from EXPR, FALSE if writes to EXPR
1397 DR - data_reference struct for the original memory reference
1398
1399 Output:
1400 BASE (returned value) - the base of the data reference EXPR.
1401 INITIAL_OFFSET - initial offset of EXPR from BASE (an expression)
1402 MISALIGN - offset of EXPR from BASE in bytes (a constant) or NULL_TREE if the
1403 computation is impossible
1404 ALIGNED_TO - maximum alignment of EXPR or NULL_TREE if MISALIGN can be
1405 calculated (doesn't depend on variables)
1406 STEP - evolution of EXPR in the loop
1407
1408 If something unexpected is encountered (an unsupported form of data-ref),
1409 then NULL_TREE is returned.
1410 */
1411
1412 static tree
1413 address_analysis (tree expr, tree stmt, bool is_read, struct data_reference *dr,
1414 tree *offset, tree *misalign, tree *aligned_to, tree *step)
1415 {
1416 tree oprnd0, oprnd1, base_address, offset_expr, base_addr0, base_addr1;
1417 tree address_offset = ssize_int (0), address_misalign = ssize_int (0);
1418 tree dummy, address_aligned_to = NULL_TREE;
1419 struct ptr_info_def *dummy1;
1420 subvar_t dummy2;
1421
1422 switch (TREE_CODE (expr))
1423 {
1424 case PLUS_EXPR:
1425 case MINUS_EXPR:
1426 /* EXPR is of form {base +/- offset} (or {offset +/- base}). */
1427 oprnd0 = TREE_OPERAND (expr, 0);
1428 oprnd1 = TREE_OPERAND (expr, 1);
1429
1430 STRIP_NOPS (oprnd0);
1431 STRIP_NOPS (oprnd1);
1432
1433 /* Recursively try to find the base of the address contained in EXPR.
1434 For offset, the returned base will be NULL. */
1435 base_addr0 = address_analysis (oprnd0, stmt, is_read, dr, &address_offset,
1436 &address_misalign, &address_aligned_to,
1437 step);
1438
1439 base_addr1 = address_analysis (oprnd1, stmt, is_read, dr, &address_offset,
1440 &address_misalign, &address_aligned_to,
1441 step);
1442
1443 /* We support cases where only one of the operands contains an
1444 address. */
1445 if ((base_addr0 && base_addr1) || (!base_addr0 && !base_addr1))
1446 {
1447 if (dump_file && (dump_flags & TDF_DETAILS))
1448 {
1449 fprintf (dump_file,
1450 "\neither more than one address or no addresses in expr ");
1451 print_generic_expr (dump_file, expr, TDF_SLIM);
1452 fprintf (dump_file, "\n");
1453 }
1454 return NULL_TREE;
1455 }
1456
1457 /* To revert STRIP_NOPS. */
1458 oprnd0 = TREE_OPERAND (expr, 0);
1459 oprnd1 = TREE_OPERAND (expr, 1);
1460
1461 offset_expr = base_addr0 ?
1462 fold_convert (ssizetype, oprnd1) : fold_convert (ssizetype, oprnd0);
1463
1464 /* EXPR is of form {base +/- offset} (or {offset +/- base}). If offset is
1465 a number, we can add it to the misalignment value calculated for base,
1466 otherwise, misalignment is NULL. */
1467 if (TREE_CODE (offset_expr) == INTEGER_CST && address_misalign)
1468 {
1469 *misalign = size_binop (TREE_CODE (expr), address_misalign,
1470 offset_expr);
1471 *aligned_to = address_aligned_to;
1472 }
1473 else
1474 {
1475 *misalign = NULL_TREE;
1476 *aligned_to = NULL_TREE;
1477 }
1478
1479 /* Combine offset (from EXPR {base + offset}) with the offset calculated
1480 for base. */
1481 *offset = size_binop (TREE_CODE (expr), address_offset, offset_expr);
1482 return base_addr0 ? base_addr0 : base_addr1;
1483
1484 case ADDR_EXPR:
1485 base_address = object_analysis (TREE_OPERAND (expr, 0), stmt, is_read,
1486 &dr, offset, misalign, aligned_to, step,
1487 &dummy, &dummy1, &dummy2);
1488 return base_address;
1489
1490 case SSA_NAME:
1491 if (!POINTER_TYPE_P (TREE_TYPE (expr)))
1492 {
1493 if (dump_file && (dump_flags & TDF_DETAILS))
1494 {
1495 fprintf (dump_file, "\nnot pointer SSA_NAME ");
1496 print_generic_expr (dump_file, expr, TDF_SLIM);
1497 fprintf (dump_file, "\n");
1498 }
1499 return NULL_TREE;
1500 }
1501 *aligned_to = ssize_int (TYPE_ALIGN_UNIT (TREE_TYPE (TREE_TYPE (expr))));
1502 *misalign = ssize_int (0);
1503 *offset = ssize_int (0);
1504 *step = ssize_int (0);
1505 return expr;
1506
1507 default:
1508 return NULL_TREE;
1509 }
1510 }
1511
1512
1513 /* Function object_analysis
1514
1515 Create a data-reference structure DR for MEMREF.
1516 Return the BASE of the data reference MEMREF if the analysis is possible.
1517 Also compute the INITIAL_OFFSET from BASE, MISALIGN and STEP.
1518 E.g., for EXPR a.b[i] + 4B, BASE is a, and OFFSET is the overall offset
1519 'a.b[i] + 4B' from a (can be an expression), MISALIGN is an OFFSET
1520 instantiated with initial_conditions of access_functions of variables,
1521 and STEP is the evolution of the DR_REF in this loop.
1522
1523 Function get_inner_reference is used for the above in case of ARRAY_REF and
1524 COMPONENT_REF.
1525
1526 The structure of the function is as follows:
1527 Part 1:
1528 Case 1. For handled_component_p refs
1529 1.1 build data-reference structure for MEMREF
1530 1.2 call get_inner_reference
1531 1.2.1 analyze offset expr received from get_inner_reference
1532 (fall through with BASE)
1533 Case 2. For declarations
1534 2.1 set MEMTAG
1535 Case 3. For INDIRECT_REFs
1536 3.1 build data-reference structure for MEMREF
1537 3.2 analyze evolution and initial condition of MEMREF
1538 3.3 set data-reference structure for MEMREF
1539 3.4 call address_analysis to analyze INIT of the access function
1540 3.5 extract memory tag
1541
1542 Part 2:
1543 Combine the results of object and address analysis to calculate
1544 INITIAL_OFFSET, STEP and misalignment info.
1545
1546 Input:
1547 MEMREF - the memory reference that is being analyzed
1548 STMT - the statement that contains MEMREF
1549 IS_READ - TRUE if STMT reads from MEMREF, FALSE if writes to MEMREF
1550
1551 Output:
1552 BASE_ADDRESS (returned value) - the base address of the data reference MEMREF
1553 E.g, if MEMREF is a.b[k].c[i][j] the returned
1554 base is &a.
1555 DR - data_reference struct for MEMREF
1556 INITIAL_OFFSET - initial offset of MEMREF from BASE (an expression)
1557 MISALIGN - offset of MEMREF from BASE in bytes (a constant) modulo alignment of
1558 ALIGNMENT or NULL_TREE if the computation is impossible
1559 ALIGNED_TO - maximum alignment of EXPR or NULL_TREE if MISALIGN can be
1560 calculated (doesn't depend on variables)
1561 STEP - evolution of the DR_REF in the loop
1562 MEMTAG - memory tag for aliasing purposes
1563 PTR_INFO - NULL or points-to aliasing info from a pointer SSA_NAME
1564 SUBVARS - Sub-variables of the variable
1565
1566 If the analysis of MEMREF evolution in the loop fails, NULL_TREE is returned,
1567 but DR can be created anyway.
1568
1569 */
1570
1571 static tree
1572 object_analysis (tree memref, tree stmt, bool is_read,
1573 struct data_reference **dr, tree *offset, tree *misalign,
1574 tree *aligned_to, tree *step, tree *memtag,
1575 struct ptr_info_def **ptr_info, subvar_t *subvars)
1576 {
1577 tree base = NULL_TREE, base_address = NULL_TREE;
1578 tree object_offset = ssize_int (0), object_misalign = ssize_int (0);
1579 tree object_step = ssize_int (0), address_step = ssize_int (0);
1580 tree address_offset = ssize_int (0), address_misalign = ssize_int (0);
1581 HOST_WIDE_INT pbitsize, pbitpos;
1582 tree poffset, bit_pos_in_bytes;
1583 enum machine_mode pmode;
1584 int punsignedp, pvolatilep;
1585 tree ptr_step = ssize_int (0), ptr_init = NULL_TREE;
1586 struct loop *loop = loop_containing_stmt (stmt);
1587 struct data_reference *ptr_dr = NULL;
1588 tree object_aligned_to = NULL_TREE, address_aligned_to = NULL_TREE;
1589 tree comp_ref = NULL_TREE;
1590
1591 *ptr_info = NULL;
1592
1593 /* Part 1: */
1594 /* Case 1. handled_component_p refs. */
1595 if (handled_component_p (memref))
1596 {
1597 /* 1.1 build data-reference structure for MEMREF. */
1598 if (!(*dr))
1599 {
1600 if (TREE_CODE (memref) == ARRAY_REF)
1601 *dr = analyze_array (stmt, memref, is_read);
1602 else if (TREE_CODE (memref) == COMPONENT_REF)
1603 comp_ref = memref;
1604 else
1605 {
1606 if (dump_file && (dump_flags & TDF_DETAILS))
1607 {
1608 fprintf (dump_file, "\ndata-ref of unsupported type ");
1609 print_generic_expr (dump_file, memref, TDF_SLIM);
1610 fprintf (dump_file, "\n");
1611 }
1612 return NULL_TREE;
1613 }
1614 }
1615
1616 /* 1.2 call get_inner_reference. */
1617 /* Find the base and the offset from it. */
1618 base = get_inner_reference (memref, &pbitsize, &pbitpos, &poffset,
1619 &pmode, &punsignedp, &pvolatilep, false);
1620 if (!base)
1621 {
1622 if (dump_file && (dump_flags & TDF_DETAILS))
1623 {
1624 fprintf (dump_file, "\nfailed to get inner ref for ");
1625 print_generic_expr (dump_file, memref, TDF_SLIM);
1626 fprintf (dump_file, "\n");
1627 }
1628 return NULL_TREE;
1629 }
1630
1631 /* 1.2.1 analyze offset expr received from get_inner_reference. */
1632 if (poffset
1633 && !analyze_offset_expr (poffset, loop, &object_offset,
1634 &object_misalign, &object_aligned_to,
1635 &object_step))
1636 {
1637 if (dump_file && (dump_flags & TDF_DETAILS))
1638 {
1639 fprintf (dump_file, "\nfailed to compute offset or step for ");
1640 print_generic_expr (dump_file, memref, TDF_SLIM);
1641 fprintf (dump_file, "\n");
1642 }
1643 return NULL_TREE;
1644 }
1645
1646 /* Add bit position to OFFSET and MISALIGN. */
1647
1648 bit_pos_in_bytes = ssize_int (pbitpos/BITS_PER_UNIT);
1649 /* Check that there is no remainder in bits. */
1650 if (pbitpos%BITS_PER_UNIT)
1651 {
1652 if (dump_file && (dump_flags & TDF_DETAILS))
1653 fprintf (dump_file, "\nbit offset alignment.\n");
1654 return NULL_TREE;
1655 }
1656 object_offset = size_binop (PLUS_EXPR, bit_pos_in_bytes, object_offset);
1657 if (object_misalign)
1658 object_misalign = size_binop (PLUS_EXPR, object_misalign,
1659 bit_pos_in_bytes);
1660
1661 memref = base; /* To continue analysis of BASE. */
1662 /* fall through */
1663 }
1664
1665 /* Part 1: Case 2. Declarations. */
1666 if (DECL_P (memref))
1667 {
1668 /* We expect to get a decl only if we already have a DR, or with
1669 COMPONENT_REFs of type 'a[i].b'. */
1670 if (!(*dr))
1671 {
1672 if (comp_ref && TREE_CODE (TREE_OPERAND (comp_ref, 0)) == ARRAY_REF)
1673 {
1674 *dr = analyze_array (stmt, TREE_OPERAND (comp_ref, 0), is_read);
1675 if (DR_NUM_DIMENSIONS (*dr) != 1)
1676 {
1677 if (dump_file && (dump_flags & TDF_DETAILS))
1678 {
1679 fprintf (dump_file, "\n multidimensional component ref ");
1680 print_generic_expr (dump_file, comp_ref, TDF_SLIM);
1681 fprintf (dump_file, "\n");
1682 }
1683 return NULL_TREE;
1684 }
1685 }
1686 else
1687 {
1688 if (dump_file && (dump_flags & TDF_DETAILS))
1689 {
1690 fprintf (dump_file, "\nunhandled decl ");
1691 print_generic_expr (dump_file, memref, TDF_SLIM);
1692 fprintf (dump_file, "\n");
1693 }
1694 return NULL_TREE;
1695 }
1696 }
1697
1698 /* TODO: if during the analysis of INDIRECT_REF we get to an object, put
1699 the object in BASE_OBJECT field if we can prove that this is O.K.,
1700 i.e., the data-ref access is bounded by the bounds of the BASE_OBJECT.
1701 (e.g., if the object is an array base 'a', where 'a[N]', we must prove
1702 that every access with 'p' (the original INDIRECT_REF based on '&a')
1703 in the loop is within the array boundaries - from a[0] to a[N-1]).
1704 Otherwise, our alias analysis can be incorrect.
1705 Even if an access function based on BASE_OBJECT can't be build, update
1706 BASE_OBJECT field to enable us to prove that two data-refs are
1707 different (without access function, distance analysis is impossible).
1708 */
1709 if (SSA_VAR_P (memref) && var_can_have_subvars (memref))
1710 *subvars = get_subvars_for_var (memref);
1711 base_address = build_fold_addr_expr (memref);
1712 /* 2.1 set MEMTAG. */
1713 *memtag = memref;
1714 }
1715
1716 /* Part 1: Case 3. INDIRECT_REFs. */
1717 else if (TREE_CODE (memref) == INDIRECT_REF)
1718 {
1719 tree ptr_ref = TREE_OPERAND (memref, 0);
1720 if (TREE_CODE (ptr_ref) == SSA_NAME)
1721 *ptr_info = SSA_NAME_PTR_INFO (ptr_ref);
1722
1723 /* 3.1 build data-reference structure for MEMREF. */
1724 ptr_dr = analyze_indirect_ref (stmt, memref, is_read);
1725 if (!ptr_dr)
1726 {
1727 if (dump_file && (dump_flags & TDF_DETAILS))
1728 {
1729 fprintf (dump_file, "\nfailed to create dr for ");
1730 print_generic_expr (dump_file, memref, TDF_SLIM);
1731 fprintf (dump_file, "\n");
1732 }
1733 return NULL_TREE;
1734 }
1735
1736 /* 3.2 analyze evolution and initial condition of MEMREF. */
1737 ptr_step = DR_STEP (ptr_dr);
1738 ptr_init = DR_BASE_ADDRESS (ptr_dr);
1739 if (!ptr_init || !ptr_step || !POINTER_TYPE_P (TREE_TYPE (ptr_init)))
1740 {
1741 *dr = (*dr) ? *dr : ptr_dr;
1742 if (dump_file && (dump_flags & TDF_DETAILS))
1743 {
1744 fprintf (dump_file, "\nbad pointer access ");
1745 print_generic_expr (dump_file, memref, TDF_SLIM);
1746 fprintf (dump_file, "\n");
1747 }
1748 return NULL_TREE;
1749 }
1750
1751 if (integer_zerop (ptr_step) && !(*dr))
1752 {
1753 if (dump_file && (dump_flags & TDF_DETAILS))
1754 fprintf (dump_file, "\nptr is loop invariant.\n");
1755 *dr = ptr_dr;
1756 return NULL_TREE;
1757
1758 /* If there exists DR for MEMREF, we are analyzing the base of
1759 handled component (PTR_INIT), which not necessary has evolution in
1760 the loop. */
1761 }
1762 object_step = size_binop (PLUS_EXPR, object_step, ptr_step);
1763
1764 /* 3.3 set data-reference structure for MEMREF. */
1765 if (!*dr)
1766 *dr = ptr_dr;
1767
1768 /* 3.4 call address_analysis to analyze INIT of the access
1769 function. */
1770 base_address = address_analysis (ptr_init, stmt, is_read, *dr,
1771 &address_offset, &address_misalign,
1772 &address_aligned_to, &address_step);
1773 if (!base_address)
1774 {
1775 if (dump_file && (dump_flags & TDF_DETAILS))
1776 {
1777 fprintf (dump_file, "\nfailed to analyze address ");
1778 print_generic_expr (dump_file, ptr_init, TDF_SLIM);
1779 fprintf (dump_file, "\n");
1780 }
1781 return NULL_TREE;
1782 }
1783
1784 /* 3.5 extract memory tag. */
1785 switch (TREE_CODE (base_address))
1786 {
1787 case SSA_NAME:
1788 *memtag = symbol_mem_tag (SSA_NAME_VAR (base_address));
1789 if (!(*memtag) && TREE_CODE (TREE_OPERAND (memref, 0)) == SSA_NAME)
1790 *memtag = symbol_mem_tag (SSA_NAME_VAR (TREE_OPERAND (memref, 0)));
1791 break;
1792 case ADDR_EXPR:
1793 *memtag = TREE_OPERAND (base_address, 0);
1794 break;
1795 default:
1796 if (dump_file && (dump_flags & TDF_DETAILS))
1797 {
1798 fprintf (dump_file, "\nno memtag for ");
1799 print_generic_expr (dump_file, memref, TDF_SLIM);
1800 fprintf (dump_file, "\n");
1801 }
1802 *memtag = NULL_TREE;
1803 break;
1804 }
1805 }
1806
1807 if (!base_address)
1808 {
1809 /* MEMREF cannot be analyzed. */
1810 if (dump_file && (dump_flags & TDF_DETAILS))
1811 {
1812 fprintf (dump_file, "\ndata-ref of unsupported type ");
1813 print_generic_expr (dump_file, memref, TDF_SLIM);
1814 fprintf (dump_file, "\n");
1815 }
1816 return NULL_TREE;
1817 }
1818
1819 if (comp_ref)
1820 DR_REF (*dr) = comp_ref;
1821
1822 if (SSA_VAR_P (*memtag) && var_can_have_subvars (*memtag))
1823 *subvars = get_subvars_for_var (*memtag);
1824
1825 /* Part 2: Combine the results of object and address analysis to calculate
1826 INITIAL_OFFSET, STEP and misalignment info. */
1827 *offset = size_binop (PLUS_EXPR, object_offset, address_offset);
1828
1829 if ((!object_misalign && !object_aligned_to)
1830 || (!address_misalign && !address_aligned_to))
1831 {
1832 *misalign = NULL_TREE;
1833 *aligned_to = NULL_TREE;
1834 }
1835 else
1836 {
1837 if (object_misalign && address_misalign)
1838 *misalign = size_binop (PLUS_EXPR, object_misalign, address_misalign);
1839 else
1840 *misalign = object_misalign ? object_misalign : address_misalign;
1841 if (object_aligned_to && address_aligned_to)
1842 *aligned_to = size_binop (MIN_EXPR, object_aligned_to,
1843 address_aligned_to);
1844 else
1845 *aligned_to = object_aligned_to ?
1846 object_aligned_to : address_aligned_to;
1847 }
1848 *step = size_binop (PLUS_EXPR, object_step, address_step);
1849
1850 return base_address;
1851 }
1852
1853 /* Function analyze_offset.
1854
1855 Extract INVARIANT and CONSTANT parts from OFFSET.
1856
1857 */
1858 static void
1859 analyze_offset (tree offset, tree *invariant, tree *constant)
1860 {
1861 tree op0, op1, constant_0, constant_1, invariant_0, invariant_1;
1862 enum tree_code code = TREE_CODE (offset);
1863
1864 *invariant = NULL_TREE;
1865 *constant = NULL_TREE;
1866
1867 /* Not PLUS/MINUS expression - recursion stop condition. */
1868 if (code != PLUS_EXPR && code != MINUS_EXPR)
1869 {
1870 if (TREE_CODE (offset) == INTEGER_CST)
1871 *constant = offset;
1872 else
1873 *invariant = offset;
1874 return;
1875 }
1876
1877 op0 = TREE_OPERAND (offset, 0);
1878 op1 = TREE_OPERAND (offset, 1);
1879
1880 /* Recursive call with the operands. */
1881 analyze_offset (op0, &invariant_0, &constant_0);
1882 analyze_offset (op1, &invariant_1, &constant_1);
1883
1884 /* Combine the results. */
1885 *constant = constant_0 ? constant_0 : constant_1;
1886 if (invariant_0 && invariant_1)
1887 *invariant =
1888 fold_build2 (code, TREE_TYPE (invariant_0), invariant_0, invariant_1);
1889 else
1890 *invariant = invariant_0 ? invariant_0 : invariant_1;
1891 }
1892
1893 /* Free the memory used by the data reference DR. */
1894
1895 static void
1896 free_data_ref (data_reference_p dr)
1897 {
1898 DR_FREE_ACCESS_FNS (dr);
1899 free (dr);
1900 }
1901
1902 /* Function create_data_ref.
1903
1904 Create a data-reference structure for MEMREF. Set its DR_BASE_ADDRESS,
1905 DR_OFFSET, DR_INIT, DR_STEP, DR_OFFSET_MISALIGNMENT, DR_ALIGNED_TO,
1906 DR_MEMTAG, and DR_POINTSTO_INFO fields.
1907
1908 Input:
1909 MEMREF - the memory reference that is being analyzed
1910 STMT - the statement that contains MEMREF
1911 IS_READ - TRUE if STMT reads from MEMREF, FALSE if writes to MEMREF
1912
1913 Output:
1914 DR (returned value) - data_reference struct for MEMREF
1915 */
1916
1917 static struct data_reference *
1918 create_data_ref (tree memref, tree stmt, bool is_read)
1919 {
1920 struct data_reference *dr = NULL;
1921 tree base_address, offset, step, misalign, memtag;
1922 struct loop *loop = loop_containing_stmt (stmt);
1923 tree invariant = NULL_TREE, constant = NULL_TREE;
1924 tree type_size, init_cond;
1925 struct ptr_info_def *ptr_info;
1926 subvar_t subvars = NULL;
1927 tree aligned_to, type = NULL_TREE, orig_offset;
1928
1929 if (!memref)
1930 return NULL;
1931
1932 base_address = object_analysis (memref, stmt, is_read, &dr, &offset,
1933 &misalign, &aligned_to, &step, &memtag,
1934 &ptr_info, &subvars);
1935 if (!dr || !base_address)
1936 {
1937 if (dump_file && (dump_flags & TDF_DETAILS))
1938 {
1939 fprintf (dump_file, "\ncreate_data_ref: failed to create a dr for ");
1940 print_generic_expr (dump_file, memref, TDF_SLIM);
1941 fprintf (dump_file, "\n");
1942 }
1943 return NULL;
1944 }
1945
1946 DR_BASE_ADDRESS (dr) = base_address;
1947 DR_OFFSET (dr) = offset;
1948 DR_INIT (dr) = ssize_int (0);
1949 DR_STEP (dr) = step;
1950 DR_OFFSET_MISALIGNMENT (dr) = misalign;
1951 DR_ALIGNED_TO (dr) = aligned_to;
1952 DR_MEMTAG (dr) = memtag;
1953 DR_PTR_INFO (dr) = ptr_info;
1954 DR_SUBVARS (dr) = subvars;
1955
1956 type_size = fold_convert (ssizetype, TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dr))));
1957
1958 /* Extract CONSTANT and INVARIANT from OFFSET. */
1959 /* Remove cast from OFFSET and restore it for INVARIANT part. */
1960 orig_offset = offset;
1961 STRIP_NOPS (offset);
1962 if (offset != orig_offset)
1963 type = TREE_TYPE (orig_offset);
1964 analyze_offset (offset, &invariant, &constant);
1965 if (type && invariant)
1966 invariant = fold_convert (type, invariant);
1967
1968 /* Put CONSTANT part of OFFSET in DR_INIT and INVARIANT in DR_OFFSET field
1969 of DR. */
1970 if (constant)
1971 {
1972 DR_INIT (dr) = fold_convert (ssizetype, constant);
1973 init_cond = fold_build2 (TRUNC_DIV_EXPR, TREE_TYPE (constant),
1974 constant, type_size);
1975 }
1976 else
1977 DR_INIT (dr) = init_cond = ssize_int (0);
1978
1979 if (invariant)
1980 DR_OFFSET (dr) = invariant;
1981 else
1982 DR_OFFSET (dr) = ssize_int (0);
1983
1984 /* Change the access function for INIDIRECT_REFs, according to
1985 DR_BASE_ADDRESS. Analyze OFFSET calculated in object_analysis. OFFSET is
1986 an expression that can contain loop invariant expressions and constants.
1987 We put the constant part in the initial condition of the access function
1988 (for data dependence tests), and in DR_INIT of the data-ref. The loop
1989 invariant part is put in DR_OFFSET.
1990 The evolution part of the access function is STEP calculated in
1991 object_analysis divided by the size of data type.
1992 */
1993 if (!DR_BASE_OBJECT (dr)
1994 || (TREE_CODE (memref) == COMPONENT_REF && DR_NUM_DIMENSIONS (dr) == 1))
1995 {
1996 tree access_fn;
1997 tree new_step;
1998
1999 /* Update access function. */
2000 access_fn = DR_ACCESS_FN (dr, 0);
2001 if (automatically_generated_chrec_p (access_fn))
2002 {
2003 free_data_ref (dr);
2004 return NULL;
2005 }
2006
2007 new_step = size_binop (TRUNC_DIV_EXPR,
2008 fold_convert (ssizetype, step), type_size);
2009
2010 init_cond = chrec_convert (chrec_type (access_fn), init_cond, stmt);
2011 new_step = chrec_convert (chrec_type (access_fn), new_step, stmt);
2012 if (automatically_generated_chrec_p (init_cond)
2013 || automatically_generated_chrec_p (new_step))
2014 {
2015 free_data_ref (dr);
2016 return NULL;
2017 }
2018 access_fn = chrec_replace_initial_condition (access_fn, init_cond);
2019 access_fn = reset_evolution_in_loop (loop->num, access_fn, new_step);
2020
2021 VEC_replace (tree, DR_ACCESS_FNS (dr), 0, access_fn);
2022 }
2023
2024 if (dump_file && (dump_flags & TDF_DETAILS))
2025 {
2026 struct ptr_info_def *pi = DR_PTR_INFO (dr);
2027
2028 fprintf (dump_file, "\nCreated dr for ");
2029 print_generic_expr (dump_file, memref, TDF_SLIM);
2030 fprintf (dump_file, "\n\tbase_address: ");
2031 print_generic_expr (dump_file, DR_BASE_ADDRESS (dr), TDF_SLIM);
2032 fprintf (dump_file, "\n\toffset from base address: ");
2033 print_generic_expr (dump_file, DR_OFFSET (dr), TDF_SLIM);
2034 fprintf (dump_file, "\n\tconstant offset from base address: ");
2035 print_generic_expr (dump_file, DR_INIT (dr), TDF_SLIM);
2036 fprintf (dump_file, "\n\tbase_object: ");
2037 print_generic_expr (dump_file, DR_BASE_OBJECT (dr), TDF_SLIM);
2038 fprintf (dump_file, "\n\tstep: ");
2039 print_generic_expr (dump_file, DR_STEP (dr), TDF_SLIM);
2040 fprintf (dump_file, "B\n\tmisalignment from base: ");
2041 print_generic_expr (dump_file, DR_OFFSET_MISALIGNMENT (dr), TDF_SLIM);
2042 if (DR_OFFSET_MISALIGNMENT (dr))
2043 fprintf (dump_file, "B");
2044 if (DR_ALIGNED_TO (dr))
2045 {
2046 fprintf (dump_file, "\n\taligned to: ");
2047 print_generic_expr (dump_file, DR_ALIGNED_TO (dr), TDF_SLIM);
2048 }
2049 fprintf (dump_file, "\n\tmemtag: ");
2050 print_generic_expr (dump_file, DR_MEMTAG (dr), TDF_SLIM);
2051 fprintf (dump_file, "\n");
2052 if (pi && pi->name_mem_tag)
2053 {
2054 fprintf (dump_file, "\n\tnametag: ");
2055 print_generic_expr (dump_file, pi->name_mem_tag, TDF_SLIM);
2056 fprintf (dump_file, "\n");
2057 }
2058 }
2059 return dr;
2060 }
2061
2062 /* Returns true if FNA == FNB. */
2063
2064 static bool
2065 affine_function_equal_p (affine_fn fna, affine_fn fnb)
2066 {
2067 unsigned i, n = VEC_length (tree, fna);
2068
2069 gcc_assert (n == VEC_length (tree, fnb));
2070
2071 for (i = 0; i < n; i++)
2072 if (!operand_equal_p (VEC_index (tree, fna, i),
2073 VEC_index (tree, fnb, i), 0))
2074 return false;
2075
2076 return true;
2077 }
2078
2079 /* If all the functions in CF are the same, returns one of them,
2080 otherwise returns NULL. */
2081
2082 static affine_fn
2083 common_affine_function (conflict_function *cf)
2084 {
2085 unsigned i;
2086 affine_fn comm;
2087
2088 if (!CF_NONTRIVIAL_P (cf))
2089 return NULL;
2090
2091 comm = cf->fns[0];
2092
2093 for (i = 1; i < cf->n; i++)
2094 if (!affine_function_equal_p (comm, cf->fns[i]))
2095 return NULL;
2096
2097 return comm;
2098 }
2099
2100 /* Returns the base of the affine function FN. */
2101
2102 static tree
2103 affine_function_base (affine_fn fn)
2104 {
2105 return VEC_index (tree, fn, 0);
2106 }
2107
2108 /* Returns true if FN is a constant. */
2109
2110 static bool
2111 affine_function_constant_p (affine_fn fn)
2112 {
2113 unsigned i;
2114 tree coef;
2115
2116 for (i = 1; VEC_iterate (tree, fn, i, coef); i++)
2117 if (!integer_zerop (coef))
2118 return false;
2119
2120 return true;
2121 }
2122
2123 /* Applies operation OP on affine functions FNA and FNB, and returns the
2124 result. */
2125
2126 static affine_fn
2127 affine_fn_op (enum tree_code op, affine_fn fna, affine_fn fnb)
2128 {
2129 unsigned i, n, m;
2130 affine_fn ret;
2131 tree coef;
2132
2133 if (VEC_length (tree, fnb) > VEC_length (tree, fna))
2134 {
2135 n = VEC_length (tree, fna);
2136 m = VEC_length (tree, fnb);
2137 }
2138 else
2139 {
2140 n = VEC_length (tree, fnb);
2141 m = VEC_length (tree, fna);
2142 }
2143
2144 ret = VEC_alloc (tree, heap, m);
2145 for (i = 0; i < n; i++)
2146 VEC_quick_push (tree, ret,
2147 fold_build2 (op, integer_type_node,
2148 VEC_index (tree, fna, i),
2149 VEC_index (tree, fnb, i)));
2150
2151 for (; VEC_iterate (tree, fna, i, coef); i++)
2152 VEC_quick_push (tree, ret,
2153 fold_build2 (op, integer_type_node,
2154 coef, integer_zero_node));
2155 for (; VEC_iterate (tree, fnb, i, coef); i++)
2156 VEC_quick_push (tree, ret,
2157 fold_build2 (op, integer_type_node,
2158 integer_zero_node, coef));
2159
2160 return ret;
2161 }
2162
2163 /* Returns the sum of affine functions FNA and FNB. */
2164
2165 static affine_fn
2166 affine_fn_plus (affine_fn fna, affine_fn fnb)
2167 {
2168 return affine_fn_op (PLUS_EXPR, fna, fnb);
2169 }
2170
2171 /* Returns the difference of affine functions FNA and FNB. */
2172
2173 static affine_fn
2174 affine_fn_minus (affine_fn fna, affine_fn fnb)
2175 {
2176 return affine_fn_op (MINUS_EXPR, fna, fnb);
2177 }
2178
2179 /* Frees affine function FN. */
2180
2181 static void
2182 affine_fn_free (affine_fn fn)
2183 {
2184 VEC_free (tree, heap, fn);
2185 }
2186
2187 /* Determine for each subscript in the data dependence relation DDR
2188 the distance. */
2189
2190 static void
2191 compute_subscript_distance (struct data_dependence_relation *ddr)
2192 {
2193 conflict_function *cf_a, *cf_b;
2194 affine_fn fn_a, fn_b, diff;
2195
2196 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
2197 {
2198 unsigned int i;
2199
2200 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
2201 {
2202 struct subscript *subscript;
2203
2204 subscript = DDR_SUBSCRIPT (ddr, i);
2205 cf_a = SUB_CONFLICTS_IN_A (subscript);
2206 cf_b = SUB_CONFLICTS_IN_B (subscript);
2207
2208 fn_a = common_affine_function (cf_a);
2209 fn_b = common_affine_function (cf_b);
2210 if (!fn_a || !fn_b)
2211 {
2212 SUB_DISTANCE (subscript) = chrec_dont_know;
2213 return;
2214 }
2215 diff = affine_fn_minus (fn_a, fn_b);
2216
2217 if (affine_function_constant_p (diff))
2218 SUB_DISTANCE (subscript) = affine_function_base (diff);
2219 else
2220 SUB_DISTANCE (subscript) = chrec_dont_know;
2221
2222 affine_fn_free (diff);
2223 }
2224 }
2225 }
2226
2227 /* Returns the conflict function for "unknown". */
2228
2229 static conflict_function *
2230 conflict_fn_not_known (void)
2231 {
2232 conflict_function *fn = XCNEW (conflict_function);
2233 fn->n = NOT_KNOWN;
2234
2235 return fn;
2236 }
2237
2238 /* Returns the conflict function for "independent". */
2239
2240 static conflict_function *
2241 conflict_fn_no_dependence (void)
2242 {
2243 conflict_function *fn = XCNEW (conflict_function);
2244 fn->n = NO_DEPENDENCE;
2245
2246 return fn;
2247 }
2248
2249 /* Initialize a data dependence relation between data accesses A and
2250 B. NB_LOOPS is the number of loops surrounding the references: the
2251 size of the classic distance/direction vectors. */
2252
2253 static struct data_dependence_relation *
2254 initialize_data_dependence_relation (struct data_reference *a,
2255 struct data_reference *b,
2256 VEC (loop_p, heap) *loop_nest)
2257 {
2258 struct data_dependence_relation *res;
2259 bool differ_p, known_dependence;
2260 unsigned int i;
2261
2262 res = XNEW (struct data_dependence_relation);
2263 DDR_A (res) = a;
2264 DDR_B (res) = b;
2265 DDR_LOOP_NEST (res) = NULL;
2266
2267 if (a == NULL || b == NULL)
2268 {
2269 DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2270 return res;
2271 }
2272
2273 /* When A and B are arrays and their dimensions differ, we directly
2274 initialize the relation to "there is no dependence": chrec_known. */
2275 if (DR_BASE_OBJECT (a) && DR_BASE_OBJECT (b)
2276 && DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b))
2277 {
2278 DDR_ARE_DEPENDENT (res) = chrec_known;
2279 return res;
2280 }
2281
2282 if (DR_BASE_ADDRESS (a) && DR_BASE_ADDRESS (b))
2283 known_dependence = base_addr_differ_p (a, b, &differ_p);
2284 else
2285 known_dependence = base_object_differ_p (a, b, &differ_p);
2286
2287 if (!known_dependence)
2288 {
2289 /* Can't determine whether the data-refs access the same memory
2290 region. */
2291 DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2292 return res;
2293 }
2294
2295 if (differ_p)
2296 {
2297 DDR_ARE_DEPENDENT (res) = chrec_known;
2298 return res;
2299 }
2300
2301 DDR_AFFINE_P (res) = true;
2302 DDR_ARE_DEPENDENT (res) = NULL_TREE;
2303 DDR_SUBSCRIPTS (res) = VEC_alloc (subscript_p, heap, DR_NUM_DIMENSIONS (a));
2304 DDR_LOOP_NEST (res) = loop_nest;
2305 DDR_DIR_VECTS (res) = NULL;
2306 DDR_DIST_VECTS (res) = NULL;
2307
2308 for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)
2309 {
2310 struct subscript *subscript;
2311
2312 subscript = XNEW (struct subscript);
2313 SUB_CONFLICTS_IN_A (subscript) = conflict_fn_not_known ();
2314 SUB_CONFLICTS_IN_B (subscript) = conflict_fn_not_known ();
2315 SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
2316 SUB_DISTANCE (subscript) = chrec_dont_know;
2317 VEC_safe_push (subscript_p, heap, DDR_SUBSCRIPTS (res), subscript);
2318 }
2319
2320 return res;
2321 }
2322
2323 /* Frees memory used by the conflict function F. */
2324
2325 static void
2326 free_conflict_function (conflict_function *f)
2327 {
2328 unsigned i;
2329
2330 if (CF_NONTRIVIAL_P (f))
2331 {
2332 for (i = 0; i < f->n; i++)
2333 affine_fn_free (f->fns[i]);
2334 }
2335 free (f);
2336 }
2337
2338 /* Frees memory used by SUBSCRIPTS. */
2339
2340 static void
2341 free_subscripts (VEC (subscript_p, heap) *subscripts)
2342 {
2343 unsigned i;
2344 subscript_p s;
2345
2346 for (i = 0; VEC_iterate (subscript_p, subscripts, i, s); i++)
2347 {
2348 free_conflict_function (s->conflicting_iterations_in_a);
2349 free_conflict_function (s->conflicting_iterations_in_b);
2350 }
2351 VEC_free (subscript_p, heap, subscripts);
2352 }
2353
2354 /* Set DDR_ARE_DEPENDENT to CHREC and finalize the subscript overlap
2355 description. */
2356
2357 static inline void
2358 finalize_ddr_dependent (struct data_dependence_relation *ddr,
2359 tree chrec)
2360 {
2361 if (dump_file && (dump_flags & TDF_DETAILS))
2362 {
2363 fprintf (dump_file, "(dependence classified: ");
2364 print_generic_expr (dump_file, chrec, 0);
2365 fprintf (dump_file, ")\n");
2366 }
2367
2368 DDR_ARE_DEPENDENT (ddr) = chrec;
2369 free_subscripts (DDR_SUBSCRIPTS (ddr));
2370 }
2371
2372 /* The dependence relation DDR cannot be represented by a distance
2373 vector. */
2374
2375 static inline void
2376 non_affine_dependence_relation (struct data_dependence_relation *ddr)
2377 {
2378 if (dump_file && (dump_flags & TDF_DETAILS))
2379 fprintf (dump_file, "(Dependence relation cannot be represented by distance vector.) \n");
2380
2381 DDR_AFFINE_P (ddr) = false;
2382 }
2383
2384 \f
2385
2386 /* This section contains the classic Banerjee tests. */
2387
2388 /* Returns true iff CHREC_A and CHREC_B are not dependent on any index
2389 variables, i.e., if the ZIV (Zero Index Variable) test is true. */
2390
2391 static inline bool
2392 ziv_subscript_p (tree chrec_a,
2393 tree chrec_b)
2394 {
2395 return (evolution_function_is_constant_p (chrec_a)
2396 && evolution_function_is_constant_p (chrec_b));
2397 }
2398
2399 /* Returns true iff CHREC_A and CHREC_B are dependent on an index
2400 variable, i.e., if the SIV (Single Index Variable) test is true. */
2401
2402 static bool
2403 siv_subscript_p (tree chrec_a,
2404 tree chrec_b)
2405 {
2406 if ((evolution_function_is_constant_p (chrec_a)
2407 && evolution_function_is_univariate_p (chrec_b))
2408 || (evolution_function_is_constant_p (chrec_b)
2409 && evolution_function_is_univariate_p (chrec_a)))
2410 return true;
2411
2412 if (evolution_function_is_univariate_p (chrec_a)
2413 && evolution_function_is_univariate_p (chrec_b))
2414 {
2415 switch (TREE_CODE (chrec_a))
2416 {
2417 case POLYNOMIAL_CHREC:
2418 switch (TREE_CODE (chrec_b))
2419 {
2420 case POLYNOMIAL_CHREC:
2421 if (CHREC_VARIABLE (chrec_a) != CHREC_VARIABLE (chrec_b))
2422 return false;
2423
2424 default:
2425 return true;
2426 }
2427
2428 default:
2429 return true;
2430 }
2431 }
2432
2433 return false;
2434 }
2435
2436 /* Creates a conflict function with N dimensions. The affine functions
2437 in each dimension follow. */
2438
2439 static conflict_function *
2440 conflict_fn (unsigned n, ...)
2441 {
2442 unsigned i;
2443 conflict_function *ret = XCNEW (conflict_function);
2444 va_list ap;
2445
2446 gcc_assert (0 < n && n <= MAX_DIM);
2447 va_start(ap, n);
2448
2449 ret->n = n;
2450 for (i = 0; i < n; i++)
2451 ret->fns[i] = va_arg (ap, affine_fn);
2452 va_end(ap);
2453
2454 return ret;
2455 }
2456
2457 /* Returns constant affine function with value CST. */
2458
2459 static affine_fn
2460 affine_fn_cst (tree cst)
2461 {
2462 affine_fn fn = VEC_alloc (tree, heap, 1);
2463 VEC_quick_push (tree, fn, cst);
2464 return fn;
2465 }
2466
2467 /* Returns affine function with single variable, CST + COEF * x_DIM. */
2468
2469 static affine_fn
2470 affine_fn_univar (tree cst, unsigned dim, tree coef)
2471 {
2472 affine_fn fn = VEC_alloc (tree, heap, dim + 1);
2473 unsigned i;
2474
2475 gcc_assert (dim > 0);
2476 VEC_quick_push (tree, fn, cst);
2477 for (i = 1; i < dim; i++)
2478 VEC_quick_push (tree, fn, integer_zero_node);
2479 VEC_quick_push (tree, fn, coef);
2480 return fn;
2481 }
2482
2483 /* Analyze a ZIV (Zero Index Variable) subscript. *OVERLAPS_A and
2484 *OVERLAPS_B are initialized to the functions that describe the
2485 relation between the elements accessed twice by CHREC_A and
2486 CHREC_B. For k >= 0, the following property is verified:
2487
2488 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
2489
2490 static void
2491 analyze_ziv_subscript (tree chrec_a,
2492 tree chrec_b,
2493 conflict_function **overlaps_a,
2494 conflict_function **overlaps_b,
2495 tree *last_conflicts)
2496 {
2497 tree difference;
2498 dependence_stats.num_ziv++;
2499
2500 if (dump_file && (dump_flags & TDF_DETAILS))
2501 fprintf (dump_file, "(analyze_ziv_subscript \n");
2502
2503 chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
2504 chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
2505 difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
2506
2507 switch (TREE_CODE (difference))
2508 {
2509 case INTEGER_CST:
2510 if (integer_zerop (difference))
2511 {
2512 /* The difference is equal to zero: the accessed index
2513 overlaps for each iteration in the loop. */
2514 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2515 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
2516 *last_conflicts = chrec_dont_know;
2517 dependence_stats.num_ziv_dependent++;
2518 }
2519 else
2520 {
2521 /* The accesses do not overlap. */
2522 *overlaps_a = conflict_fn_no_dependence ();
2523 *overlaps_b = conflict_fn_no_dependence ();
2524 *last_conflicts = integer_zero_node;
2525 dependence_stats.num_ziv_independent++;
2526 }
2527 break;
2528
2529 default:
2530 /* We're not sure whether the indexes overlap. For the moment,
2531 conservatively answer "don't know". */
2532 if (dump_file && (dump_flags & TDF_DETAILS))
2533 fprintf (dump_file, "ziv test failed: difference is non-integer.\n");
2534
2535 *overlaps_a = conflict_fn_not_known ();
2536 *overlaps_b = conflict_fn_not_known ();
2537 *last_conflicts = chrec_dont_know;
2538 dependence_stats.num_ziv_unimplemented++;
2539 break;
2540 }
2541
2542 if (dump_file && (dump_flags & TDF_DETAILS))
2543 fprintf (dump_file, ")\n");
2544 }
2545
2546 /* Sets NIT to the estimated number of executions of the statements in
2547 LOOP. If CONSERVATIVE is true, we must be sure that NIT is at least as
2548 large as the number of iterations. If we have no reliable estimate,
2549 the function returns false, otherwise returns true. */
2550
2551 static bool
2552 estimated_loop_iterations (struct loop *loop, bool conservative,
2553 double_int *nit)
2554 {
2555 tree numiter = number_of_exit_cond_executions (loop);
2556
2557 /* If we have an exact value, use it. */
2558 if (TREE_CODE (numiter) == INTEGER_CST)
2559 {
2560 *nit = tree_to_double_int (numiter);
2561 return true;
2562 }
2563
2564 /* If we have a measured profile and we do not ask for a conservative bound,
2565 use it. */
2566 if (!conservative && loop->header->count != 0)
2567 {
2568 *nit = uhwi_to_double_int (expected_loop_iterations (loop) + 1);
2569 return true;
2570 }
2571
2572 /* Finally, try using a reliable estimate on number of iterations according
2573 to the size of the accessed data, if available. */
2574 estimate_numbers_of_iterations_loop (loop);
2575 if (loop->estimate_state == EST_AVAILABLE)
2576 {
2577 *nit = loop->estimated_nb_iterations;
2578 return true;
2579 }
2580
2581 return false;
2582 }
2583
2584 /* Similar to estimated_loop_iterations, but returns the estimate only
2585 if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
2586 on the number of iterations of LOOP could not be derived, returns -1. */
2587
2588 HOST_WIDE_INT
2589 estimated_loop_iterations_int (struct loop *loop, bool conservative)
2590 {
2591 double_int nit;
2592 HOST_WIDE_INT hwi_nit;
2593
2594 if (!estimated_loop_iterations (loop, conservative, &nit))
2595 return -1;
2596
2597 if (!double_int_fits_in_shwi_p (nit))
2598 return -1;
2599 hwi_nit = double_int_to_shwi (nit);
2600
2601 return hwi_nit < 0 ? -1 : hwi_nit;
2602 }
2603
2604 /* Similar to estimated_loop_iterations, but returns the estimate as a tree,
2605 and only if it fits to the int type. If this is not the case, or the
2606 estimate on the number of iterations of LOOP could not be derived, returns
2607 chrec_dont_know. */
2608
2609 static tree
2610 estimated_loop_iterations_tree (struct loop *loop, bool conservative)
2611 {
2612 double_int nit;
2613 tree type;
2614
2615 if (!estimated_loop_iterations (loop, conservative, &nit))
2616 return chrec_dont_know;
2617
2618 type = lang_hooks.types.type_for_size (INT_TYPE_SIZE, true);
2619 if (!double_int_fits_to_tree_p (type, nit))
2620 return chrec_dont_know;
2621
2622 return double_int_to_tree (type, nit);
2623 }
2624
2625 /* Analyze a SIV (Single Index Variable) subscript where CHREC_A is a
2626 constant, and CHREC_B is an affine function. *OVERLAPS_A and
2627 *OVERLAPS_B are initialized to the functions that describe the
2628 relation between the elements accessed twice by CHREC_A and
2629 CHREC_B. For k >= 0, the following property is verified:
2630
2631 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
2632
2633 static void
2634 analyze_siv_subscript_cst_affine (tree chrec_a,
2635 tree chrec_b,
2636 conflict_function **overlaps_a,
2637 conflict_function **overlaps_b,
2638 tree *last_conflicts)
2639 {
2640 bool value0, value1, value2;
2641 tree difference, tmp;
2642
2643 chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
2644 chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
2645 difference = chrec_fold_minus
2646 (integer_type_node, initial_condition (chrec_b), chrec_a);
2647
2648 if (!chrec_is_positive (initial_condition (difference), &value0))
2649 {
2650 if (dump_file && (dump_flags & TDF_DETAILS))
2651 fprintf (dump_file, "siv test failed: chrec is not positive.\n");
2652
2653 dependence_stats.num_siv_unimplemented++;
2654 *overlaps_a = conflict_fn_not_known ();
2655 *overlaps_b = conflict_fn_not_known ();
2656 *last_conflicts = chrec_dont_know;
2657 return;
2658 }
2659 else
2660 {
2661 if (value0 == false)
2662 {
2663 if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value1))
2664 {
2665 if (dump_file && (dump_flags & TDF_DETAILS))
2666 fprintf (dump_file, "siv test failed: chrec not positive.\n");
2667
2668 *overlaps_a = conflict_fn_not_known ();
2669 *overlaps_b = conflict_fn_not_known ();
2670 *last_conflicts = chrec_dont_know;
2671 dependence_stats.num_siv_unimplemented++;
2672 return;
2673 }
2674 else
2675 {
2676 if (value1 == true)
2677 {
2678 /* Example:
2679 chrec_a = 12
2680 chrec_b = {10, +, 1}
2681 */
2682
2683 if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
2684 {
2685 HOST_WIDE_INT numiter;
2686 struct loop *loop = get_chrec_loop (chrec_b);
2687
2688 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2689 tmp = fold_build2 (EXACT_DIV_EXPR, integer_type_node,
2690 fold_build1 (ABS_EXPR,
2691 integer_type_node,
2692 difference),
2693 CHREC_RIGHT (chrec_b));
2694 *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
2695 *last_conflicts = integer_one_node;
2696
2697
2698 /* Perform weak-zero siv test to see if overlap is
2699 outside the loop bounds. */
2700 numiter = estimated_loop_iterations_int (loop, true);
2701
2702 if (numiter >= 0
2703 && compare_tree_int (tmp, numiter) > 0)
2704 {
2705 free_conflict_function (*overlaps_a);
2706 free_conflict_function (*overlaps_b);
2707 *overlaps_a = conflict_fn_no_dependence ();
2708 *overlaps_b = conflict_fn_no_dependence ();
2709 *last_conflicts = integer_zero_node;
2710 dependence_stats.num_siv_independent++;
2711 return;
2712 }
2713 dependence_stats.num_siv_dependent++;
2714 return;
2715 }
2716
2717 /* When the step does not divide the difference, there are
2718 no overlaps. */
2719 else
2720 {
2721 *overlaps_a = conflict_fn_no_dependence ();
2722 *overlaps_b = conflict_fn_no_dependence ();
2723 *last_conflicts = integer_zero_node;
2724 dependence_stats.num_siv_independent++;
2725 return;
2726 }
2727 }
2728
2729 else
2730 {
2731 /* Example:
2732 chrec_a = 12
2733 chrec_b = {10, +, -1}
2734
2735 In this case, chrec_a will not overlap with chrec_b. */
2736 *overlaps_a = conflict_fn_no_dependence ();
2737 *overlaps_b = conflict_fn_no_dependence ();
2738 *last_conflicts = integer_zero_node;
2739 dependence_stats.num_siv_independent++;
2740 return;
2741 }
2742 }
2743 }
2744 else
2745 {
2746 if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value2))
2747 {
2748 if (dump_file && (dump_flags & TDF_DETAILS))
2749 fprintf (dump_file, "siv test failed: chrec not positive.\n");
2750
2751 *overlaps_a = conflict_fn_not_known ();
2752 *overlaps_b = conflict_fn_not_known ();
2753 *last_conflicts = chrec_dont_know;
2754 dependence_stats.num_siv_unimplemented++;
2755 return;
2756 }
2757 else
2758 {
2759 if (value2 == false)
2760 {
2761 /* Example:
2762 chrec_a = 3
2763 chrec_b = {10, +, -1}
2764 */
2765 if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
2766 {
2767 HOST_WIDE_INT numiter;
2768 struct loop *loop = get_chrec_loop (chrec_b);
2769
2770 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2771 tmp = fold_build2 (EXACT_DIV_EXPR,
2772 integer_type_node, difference,
2773 CHREC_RIGHT (chrec_b));
2774 *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
2775 *last_conflicts = integer_one_node;
2776
2777 /* Perform weak-zero siv test to see if overlap is
2778 outside the loop bounds. */
2779 numiter = estimated_loop_iterations_int (loop, true);
2780
2781 if (numiter >= 0
2782 && compare_tree_int (tmp, numiter) > 0)
2783 {
2784 free_conflict_function (*overlaps_a);
2785 free_conflict_function (*overlaps_b);
2786 *overlaps_a = conflict_fn_no_dependence ();
2787 *overlaps_b = conflict_fn_no_dependence ();
2788 *last_conflicts = integer_zero_node;
2789 dependence_stats.num_siv_independent++;
2790 return;
2791 }
2792 dependence_stats.num_siv_dependent++;
2793 return;
2794 }
2795
2796 /* When the step does not divide the difference, there
2797 are no overlaps. */
2798 else
2799 {
2800 *overlaps_a = conflict_fn_no_dependence ();
2801 *overlaps_b = conflict_fn_no_dependence ();
2802 *last_conflicts = integer_zero_node;
2803 dependence_stats.num_siv_independent++;
2804 return;
2805 }
2806 }
2807 else
2808 {
2809 /* Example:
2810 chrec_a = 3
2811 chrec_b = {4, +, 1}
2812
2813 In this case, chrec_a will not overlap with chrec_b. */
2814 *overlaps_a = conflict_fn_no_dependence ();
2815 *overlaps_b = conflict_fn_no_dependence ();
2816 *last_conflicts = integer_zero_node;
2817 dependence_stats.num_siv_independent++;
2818 return;
2819 }
2820 }
2821 }
2822 }
2823 }
2824
2825 /* Helper recursive function for initializing the matrix A. Returns
2826 the initial value of CHREC. */
2827
2828 static int
2829 initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult)
2830 {
2831 gcc_assert (chrec);
2832
2833 if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
2834 return int_cst_value (chrec);
2835
2836 A[index][0] = mult * int_cst_value (CHREC_RIGHT (chrec));
2837 return initialize_matrix_A (A, CHREC_LEFT (chrec), index + 1, mult);
2838 }
2839
2840 #define FLOOR_DIV(x,y) ((x) / (y))
2841
2842 /* Solves the special case of the Diophantine equation:
2843 | {0, +, STEP_A}_x (OVERLAPS_A) = {0, +, STEP_B}_y (OVERLAPS_B)
2844
2845 Computes the descriptions OVERLAPS_A and OVERLAPS_B. NITER is the
2846 number of iterations that loops X and Y run. The overlaps will be
2847 constructed as evolutions in dimension DIM. */
2848
2849 static void
2850 compute_overlap_steps_for_affine_univar (int niter, int step_a, int step_b,
2851 affine_fn *overlaps_a,
2852 affine_fn *overlaps_b,
2853 tree *last_conflicts, int dim)
2854 {
2855 if (((step_a > 0 && step_b > 0)
2856 || (step_a < 0 && step_b < 0)))
2857 {
2858 int step_overlaps_a, step_overlaps_b;
2859 int gcd_steps_a_b, last_conflict, tau2;
2860
2861 gcd_steps_a_b = gcd (step_a, step_b);
2862 step_overlaps_a = step_b / gcd_steps_a_b;
2863 step_overlaps_b = step_a / gcd_steps_a_b;
2864
2865 tau2 = FLOOR_DIV (niter, step_overlaps_a);
2866 tau2 = MIN (tau2, FLOOR_DIV (niter, step_overlaps_b));
2867 last_conflict = tau2;
2868
2869 *overlaps_a = affine_fn_univar (integer_zero_node, dim,
2870 build_int_cst (NULL_TREE,
2871 step_overlaps_a));
2872 *overlaps_b = affine_fn_univar (integer_zero_node, dim,
2873 build_int_cst (NULL_TREE,
2874 step_overlaps_b));
2875 *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
2876 }
2877
2878 else
2879 {
2880 *overlaps_a = affine_fn_cst (integer_zero_node);
2881 *overlaps_b = affine_fn_cst (integer_zero_node);
2882 *last_conflicts = integer_zero_node;
2883 }
2884 }
2885
2886 /* Solves the special case of a Diophantine equation where CHREC_A is
2887 an affine bivariate function, and CHREC_B is an affine univariate
2888 function. For example,
2889
2890 | {{0, +, 1}_x, +, 1335}_y = {0, +, 1336}_z
2891
2892 has the following overlapping functions:
2893
2894 | x (t, u, v) = {{0, +, 1336}_t, +, 1}_v
2895 | y (t, u, v) = {{0, +, 1336}_u, +, 1}_v
2896 | z (t, u, v) = {{{0, +, 1}_t, +, 1335}_u, +, 1}_v
2897
2898 FORNOW: This is a specialized implementation for a case occurring in
2899 a common benchmark. Implement the general algorithm. */
2900
2901 static void
2902 compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b,
2903 conflict_function **overlaps_a,
2904 conflict_function **overlaps_b,
2905 tree *last_conflicts)
2906 {
2907 bool xz_p, yz_p, xyz_p;
2908 int step_x, step_y, step_z;
2909 HOST_WIDE_INT niter_x, niter_y, niter_z, niter;
2910 affine_fn overlaps_a_xz, overlaps_b_xz;
2911 affine_fn overlaps_a_yz, overlaps_b_yz;
2912 affine_fn overlaps_a_xyz, overlaps_b_xyz;
2913 affine_fn ova1, ova2, ovb;
2914 tree last_conflicts_xz, last_conflicts_yz, last_conflicts_xyz;
2915
2916 step_x = int_cst_value (CHREC_RIGHT (CHREC_LEFT (chrec_a)));
2917 step_y = int_cst_value (CHREC_RIGHT (chrec_a));
2918 step_z = int_cst_value (CHREC_RIGHT (chrec_b));
2919
2920 niter_x = estimated_loop_iterations_int
2921 (get_chrec_loop (CHREC_LEFT (chrec_a)), true);
2922 niter_y = estimated_loop_iterations_int (get_chrec_loop (chrec_a), true);
2923 niter_z = estimated_loop_iterations_int (get_chrec_loop (chrec_b), true);
2924
2925 if (niter_x < 0 || niter_y < 0 || niter_z < 0)
2926 {
2927 if (dump_file && (dump_flags & TDF_DETAILS))
2928 fprintf (dump_file, "overlap steps test failed: no iteration counts.\n");
2929
2930 *overlaps_a = conflict_fn_not_known ();
2931 *overlaps_b = conflict_fn_not_known ();
2932 *last_conflicts = chrec_dont_know;
2933 return;
2934 }
2935
2936 niter = MIN (niter_x, niter_z);
2937 compute_overlap_steps_for_affine_univar (niter, step_x, step_z,
2938 &overlaps_a_xz,
2939 &overlaps_b_xz,
2940 &last_conflicts_xz, 1);
2941 niter = MIN (niter_y, niter_z);
2942 compute_overlap_steps_for_affine_univar (niter, step_y, step_z,
2943 &overlaps_a_yz,
2944 &overlaps_b_yz,
2945 &last_conflicts_yz, 2);
2946 niter = MIN (niter_x, niter_z);
2947 niter = MIN (niter_y, niter);
2948 compute_overlap_steps_for_affine_univar (niter, step_x + step_y, step_z,
2949 &overlaps_a_xyz,
2950 &overlaps_b_xyz,
2951 &last_conflicts_xyz, 3);
2952
2953 xz_p = !integer_zerop (last_conflicts_xz);
2954 yz_p = !integer_zerop (last_conflicts_yz);
2955 xyz_p = !integer_zerop (last_conflicts_xyz);
2956
2957 if (xz_p || yz_p || xyz_p)
2958 {
2959 ova1 = affine_fn_cst (integer_zero_node);
2960 ova2 = affine_fn_cst (integer_zero_node);
2961 ovb = affine_fn_cst (integer_zero_node);
2962 if (xz_p)
2963 {
2964 affine_fn t0 = ova1;
2965 affine_fn t2 = ovb;
2966
2967 ova1 = affine_fn_plus (ova1, overlaps_a_xz);
2968 ovb = affine_fn_plus (ovb, overlaps_b_xz);
2969 affine_fn_free (t0);
2970 affine_fn_free (t2);
2971 *last_conflicts = last_conflicts_xz;
2972 }
2973 if (yz_p)
2974 {
2975 affine_fn t0 = ova2;
2976 affine_fn t2 = ovb;
2977
2978 ova2 = affine_fn_plus (ova2, overlaps_a_yz);
2979 ovb = affine_fn_plus (ovb, overlaps_b_yz);
2980 affine_fn_free (t0);
2981 affine_fn_free (t2);
2982 *last_conflicts = last_conflicts_yz;
2983 }
2984 if (xyz_p)
2985 {
2986 affine_fn t0 = ova1;
2987 affine_fn t2 = ova2;
2988 affine_fn t4 = ovb;
2989
2990 ova1 = affine_fn_plus (ova1, overlaps_a_xyz);
2991 ova2 = affine_fn_plus (ova2, overlaps_a_xyz);
2992 ovb = affine_fn_plus (ovb, overlaps_b_xyz);
2993 affine_fn_free (t0);
2994 affine_fn_free (t2);
2995 affine_fn_free (t4);
2996 *last_conflicts = last_conflicts_xyz;
2997 }
2998 *overlaps_a = conflict_fn (2, ova1, ova2);
2999 *overlaps_b = conflict_fn (1, ovb);
3000 }
3001 else
3002 {
3003 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3004 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3005 *last_conflicts = integer_zero_node;
3006 }
3007
3008 affine_fn_free (overlaps_a_xz);
3009 affine_fn_free (overlaps_b_xz);
3010 affine_fn_free (overlaps_a_yz);
3011 affine_fn_free (overlaps_b_yz);
3012 affine_fn_free (overlaps_a_xyz);
3013 affine_fn_free (overlaps_b_xyz);
3014 }
3015
3016 /* Determines the overlapping elements due to accesses CHREC_A and
3017 CHREC_B, that are affine functions. This function cannot handle
3018 symbolic evolution functions, ie. when initial conditions are
3019 parameters, because it uses lambda matrices of integers. */
3020
3021 static void
3022 analyze_subscript_affine_affine (tree chrec_a,
3023 tree chrec_b,
3024 conflict_function **overlaps_a,
3025 conflict_function **overlaps_b,
3026 tree *last_conflicts)
3027 {
3028 unsigned nb_vars_a, nb_vars_b, dim;
3029 int init_a, init_b, gamma, gcd_alpha_beta;
3030 int tau1, tau2;
3031 lambda_matrix A, U, S;
3032
3033 if (eq_evolutions_p (chrec_a, chrec_b))
3034 {
3035 /* The accessed index overlaps for each iteration in the
3036 loop. */
3037 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3038 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3039 *last_conflicts = chrec_dont_know;
3040 return;
3041 }
3042 if (dump_file && (dump_flags & TDF_DETAILS))
3043 fprintf (dump_file, "(analyze_subscript_affine_affine \n");
3044
3045 /* For determining the initial intersection, we have to solve a
3046 Diophantine equation. This is the most time consuming part.
3047
3048 For answering to the question: "Is there a dependence?" we have
3049 to prove that there exists a solution to the Diophantine
3050 equation, and that the solution is in the iteration domain,
3051 i.e. the solution is positive or zero, and that the solution
3052 happens before the upper bound loop.nb_iterations. Otherwise
3053 there is no dependence. This function outputs a description of
3054 the iterations that hold the intersections. */
3055
3056 nb_vars_a = nb_vars_in_chrec (chrec_a);
3057 nb_vars_b = nb_vars_in_chrec (chrec_b);
3058
3059 dim = nb_vars_a + nb_vars_b;
3060 U = lambda_matrix_new (dim, dim);
3061 A = lambda_matrix_new (dim, 1);
3062 S = lambda_matrix_new (dim, 1);
3063
3064 init_a = initialize_matrix_A (A, chrec_a, 0, 1);
3065 init_b = initialize_matrix_A (A, chrec_b, nb_vars_a, -1);
3066 gamma = init_b - init_a;
3067
3068 /* Don't do all the hard work of solving the Diophantine equation
3069 when we already know the solution: for example,
3070 | {3, +, 1}_1
3071 | {3, +, 4}_2
3072 | gamma = 3 - 3 = 0.
3073 Then the first overlap occurs during the first iterations:
3074 | {3, +, 1}_1 ({0, +, 4}_x) = {3, +, 4}_2 ({0, +, 1}_x)
3075 */
3076 if (gamma == 0)
3077 {
3078 if (nb_vars_a == 1 && nb_vars_b == 1)
3079 {
3080 int step_a, step_b;
3081 HOST_WIDE_INT niter, niter_a, niter_b;
3082 affine_fn ova, ovb;
3083
3084 niter_a = estimated_loop_iterations_int
3085 (get_chrec_loop (chrec_a), true);
3086 niter_b = estimated_loop_iterations_int
3087 (get_chrec_loop (chrec_b), true);
3088 if (niter_a < 0 || niter_b < 0)
3089 {
3090 if (dump_file && (dump_flags & TDF_DETAILS))
3091 fprintf (dump_file, "affine-affine test failed: missing iteration counts.\n");
3092 *overlaps_a = conflict_fn_not_known ();
3093 *overlaps_b = conflict_fn_not_known ();
3094 *last_conflicts = chrec_dont_know;
3095 goto end_analyze_subs_aa;
3096 }
3097
3098 niter = MIN (niter_a, niter_b);
3099
3100 step_a = int_cst_value (CHREC_RIGHT (chrec_a));
3101 step_b = int_cst_value (CHREC_RIGHT (chrec_b));
3102
3103 compute_overlap_steps_for_affine_univar (niter, step_a, step_b,
3104 &ova, &ovb,
3105 last_conflicts, 1);
3106 *overlaps_a = conflict_fn (1, ova);
3107 *overlaps_b = conflict_fn (1, ovb);
3108 }
3109
3110 else if (nb_vars_a == 2 && nb_vars_b == 1)
3111 compute_overlap_steps_for_affine_1_2
3112 (chrec_a, chrec_b, overlaps_a, overlaps_b, last_conflicts);
3113
3114 else if (nb_vars_a == 1 && nb_vars_b == 2)
3115 compute_overlap_steps_for_affine_1_2
3116 (chrec_b, chrec_a, overlaps_b, overlaps_a, last_conflicts);
3117
3118 else
3119 {
3120 if (dump_file && (dump_flags & TDF_DETAILS))
3121 fprintf (dump_file, "affine-affine test failed: too many variables.\n");
3122 *overlaps_a = conflict_fn_not_known ();
3123 *overlaps_b = conflict_fn_not_known ();
3124 *last_conflicts = chrec_dont_know;
3125 }
3126 goto end_analyze_subs_aa;
3127 }
3128
3129 /* U.A = S */
3130 lambda_matrix_right_hermite (A, dim, 1, S, U);
3131
3132 if (S[0][0] < 0)
3133 {
3134 S[0][0] *= -1;
3135 lambda_matrix_row_negate (U, dim, 0);
3136 }
3137 gcd_alpha_beta = S[0][0];
3138
3139 /* Something went wrong: for example in {1, +, 0}_5 vs. {0, +, 0}_5,
3140 but that is a quite strange case. Instead of ICEing, answer
3141 don't know. */
3142 if (gcd_alpha_beta == 0)
3143 {
3144 *overlaps_a = conflict_fn_not_known ();
3145 *overlaps_b = conflict_fn_not_known ();
3146 *last_conflicts = chrec_dont_know;
3147 goto end_analyze_subs_aa;
3148 }
3149
3150 /* The classic "gcd-test". */
3151 if (!int_divides_p (gcd_alpha_beta, gamma))
3152 {
3153 /* The "gcd-test" has determined that there is no integer
3154 solution, i.e. there is no dependence. */
3155 *overlaps_a = conflict_fn_no_dependence ();
3156 *overlaps_b = conflict_fn_no_dependence ();
3157 *last_conflicts = integer_zero_node;
3158 }
3159
3160 /* Both access functions are univariate. This includes SIV and MIV cases. */
3161 else if (nb_vars_a == 1 && nb_vars_b == 1)
3162 {
3163 /* Both functions should have the same evolution sign. */
3164 if (((A[0][0] > 0 && -A[1][0] > 0)
3165 || (A[0][0] < 0 && -A[1][0] < 0)))
3166 {
3167 /* The solutions are given by:
3168 |
3169 | [GAMMA/GCD_ALPHA_BETA t].[u11 u12] = [x0]
3170 | [u21 u22] [y0]
3171
3172 For a given integer t. Using the following variables,
3173
3174 | i0 = u11 * gamma / gcd_alpha_beta
3175 | j0 = u12 * gamma / gcd_alpha_beta
3176 | i1 = u21
3177 | j1 = u22
3178
3179 the solutions are:
3180
3181 | x0 = i0 + i1 * t,
3182 | y0 = j0 + j1 * t. */
3183
3184 int i0, j0, i1, j1;
3185
3186 /* X0 and Y0 are the first iterations for which there is a
3187 dependence. X0, Y0 are two solutions of the Diophantine
3188 equation: chrec_a (X0) = chrec_b (Y0). */
3189 int x0, y0;
3190 int niter, niter_a, niter_b;
3191
3192 niter_a = estimated_loop_iterations_int
3193 (get_chrec_loop (chrec_a), true);
3194 niter_b = estimated_loop_iterations_int
3195 (get_chrec_loop (chrec_b), true);
3196
3197 if (niter_a < 0 || niter_b < 0)
3198 {
3199 if (dump_file && (dump_flags & TDF_DETAILS))
3200 fprintf (dump_file, "affine-affine test failed: missing iteration counts.\n");
3201 *overlaps_a = conflict_fn_not_known ();
3202 *overlaps_b = conflict_fn_not_known ();
3203 *last_conflicts = chrec_dont_know;
3204 goto end_analyze_subs_aa;
3205 }
3206
3207 niter = MIN (niter_a, niter_b);
3208
3209 i0 = U[0][0] * gamma / gcd_alpha_beta;
3210 j0 = U[0][1] * gamma / gcd_alpha_beta;
3211 i1 = U[1][0];
3212 j1 = U[1][1];
3213
3214 if ((i1 == 0 && i0 < 0)
3215 || (j1 == 0 && j0 < 0))
3216 {
3217 /* There is no solution.
3218 FIXME: The case "i0 > nb_iterations, j0 > nb_iterations"
3219 falls in here, but for the moment we don't look at the
3220 upper bound of the iteration domain. */
3221 *overlaps_a = conflict_fn_no_dependence ();
3222 *overlaps_b = conflict_fn_no_dependence ();
3223 *last_conflicts = integer_zero_node;
3224 }
3225
3226 else
3227 {
3228 if (i1 > 0)
3229 {
3230 tau1 = CEIL (-i0, i1);
3231 tau2 = FLOOR_DIV (niter - i0, i1);
3232
3233 if (j1 > 0)
3234 {
3235 int last_conflict, min_multiple;
3236 tau1 = MAX (tau1, CEIL (-j0, j1));
3237 tau2 = MIN (tau2, FLOOR_DIV (niter - j0, j1));
3238
3239 x0 = i1 * tau1 + i0;
3240 y0 = j1 * tau1 + j0;
3241
3242 /* At this point (x0, y0) is one of the
3243 solutions to the Diophantine equation. The
3244 next step has to compute the smallest
3245 positive solution: the first conflicts. */
3246 min_multiple = MIN (x0 / i1, y0 / j1);
3247 x0 -= i1 * min_multiple;
3248 y0 -= j1 * min_multiple;
3249
3250 tau1 = (x0 - i0)/i1;
3251 last_conflict = tau2 - tau1;
3252
3253 /* If the overlap occurs outside of the bounds of the
3254 loop, there is no dependence. */
3255 if (x0 > niter || y0 > niter)
3256 {
3257 *overlaps_a = conflict_fn_no_dependence ();
3258 *overlaps_b = conflict_fn_no_dependence ();
3259 *last_conflicts = integer_zero_node;
3260 }
3261 else
3262 {
3263 *overlaps_a
3264 = conflict_fn (1,
3265 affine_fn_univar (build_int_cst (NULL_TREE, x0),
3266 1,
3267 build_int_cst (NULL_TREE, i1)));
3268 *overlaps_b
3269 = conflict_fn (1,
3270 affine_fn_univar (build_int_cst (NULL_TREE, y0),
3271 1,
3272 build_int_cst (NULL_TREE, j1)));
3273 *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
3274 }
3275 }
3276 else
3277 {
3278 /* FIXME: For the moment, the upper bound of the
3279 iteration domain for j is not checked. */
3280 if (dump_file && (dump_flags & TDF_DETAILS))
3281 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3282 *overlaps_a = conflict_fn_not_known ();
3283 *overlaps_b = conflict_fn_not_known ();
3284 *last_conflicts = chrec_dont_know;
3285 }
3286 }
3287
3288 else
3289 {
3290 /* FIXME: For the moment, the upper bound of the
3291 iteration domain for i is not checked. */
3292 if (dump_file && (dump_flags & TDF_DETAILS))
3293 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3294 *overlaps_a = conflict_fn_not_known ();
3295 *overlaps_b = conflict_fn_not_known ();
3296 *last_conflicts = chrec_dont_know;
3297 }
3298 }
3299 }
3300 else
3301 {
3302 if (dump_file && (dump_flags & TDF_DETAILS))
3303 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3304 *overlaps_a = conflict_fn_not_known ();
3305 *overlaps_b = conflict_fn_not_known ();
3306 *last_conflicts = chrec_dont_know;
3307 }
3308 }
3309
3310 else
3311 {
3312 if (dump_file && (dump_flags & TDF_DETAILS))
3313 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3314 *overlaps_a = conflict_fn_not_known ();
3315 *overlaps_b = conflict_fn_not_known ();
3316 *last_conflicts = chrec_dont_know;
3317 }
3318
3319 end_analyze_subs_aa:
3320 if (dump_file && (dump_flags & TDF_DETAILS))
3321 {
3322 fprintf (dump_file, " (overlaps_a = ");
3323 dump_conflict_function (dump_file, *overlaps_a);
3324 fprintf (dump_file, ")\n (overlaps_b = ");
3325 dump_conflict_function (dump_file, *overlaps_b);
3326 fprintf (dump_file, ")\n");
3327 fprintf (dump_file, ")\n");
3328 }
3329 }
3330
3331 /* Returns true when analyze_subscript_affine_affine can be used for
3332 determining the dependence relation between chrec_a and chrec_b,
3333 that contain symbols. This function modifies chrec_a and chrec_b
3334 such that the analysis result is the same, and such that they don't
3335 contain symbols, and then can safely be passed to the analyzer.
3336
3337 Example: The analysis of the following tuples of evolutions produce
3338 the same results: {x+1, +, 1}_1 vs. {x+3, +, 1}_1, and {-2, +, 1}_1
3339 vs. {0, +, 1}_1
3340
3341 {x+1, +, 1}_1 ({2, +, 1}_1) = {x+3, +, 1}_1 ({0, +, 1}_1)
3342 {-2, +, 1}_1 ({2, +, 1}_1) = {0, +, 1}_1 ({0, +, 1}_1)
3343 */
3344
3345 static bool
3346 can_use_analyze_subscript_affine_affine (tree *chrec_a, tree *chrec_b)
3347 {
3348 tree diff, type, left_a, left_b, right_b;
3349
3350 if (chrec_contains_symbols (CHREC_RIGHT (*chrec_a))
3351 || chrec_contains_symbols (CHREC_RIGHT (*chrec_b)))
3352 /* FIXME: For the moment not handled. Might be refined later. */
3353 return false;
3354
3355 type = chrec_type (*chrec_a);
3356 left_a = CHREC_LEFT (*chrec_a);
3357 left_b = chrec_convert (type, CHREC_LEFT (*chrec_b), NULL_TREE);
3358 diff = chrec_fold_minus (type, left_a, left_b);
3359
3360 if (!evolution_function_is_constant_p (diff))
3361 return false;
3362
3363 if (dump_file && (dump_flags & TDF_DETAILS))
3364 fprintf (dump_file, "can_use_subscript_aff_aff_for_symbolic \n");
3365
3366 *chrec_a = build_polynomial_chrec (CHREC_VARIABLE (*chrec_a),
3367 diff, CHREC_RIGHT (*chrec_a));
3368 right_b = chrec_convert (type, CHREC_RIGHT (*chrec_b), NULL_TREE);
3369 *chrec_b = build_polynomial_chrec (CHREC_VARIABLE (*chrec_b),
3370 build_int_cst (type, 0),
3371 right_b);
3372 return true;
3373 }
3374
3375 /* Analyze a SIV (Single Index Variable) subscript. *OVERLAPS_A and
3376 *OVERLAPS_B are initialized to the functions that describe the
3377 relation between the elements accessed twice by CHREC_A and
3378 CHREC_B. For k >= 0, the following property is verified:
3379
3380 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
3381
3382 static void
3383 analyze_siv_subscript (tree chrec_a,
3384 tree chrec_b,
3385 conflict_function **overlaps_a,
3386 conflict_function **overlaps_b,
3387 tree *last_conflicts)
3388 {
3389 dependence_stats.num_siv++;
3390
3391 if (dump_file && (dump_flags & TDF_DETAILS))
3392 fprintf (dump_file, "(analyze_siv_subscript \n");
3393
3394 if (evolution_function_is_constant_p (chrec_a)
3395 && evolution_function_is_affine_p (chrec_b))
3396 analyze_siv_subscript_cst_affine (chrec_a, chrec_b,
3397 overlaps_a, overlaps_b, last_conflicts);
3398
3399 else if (evolution_function_is_affine_p (chrec_a)
3400 && evolution_function_is_constant_p (chrec_b))
3401 analyze_siv_subscript_cst_affine (chrec_b, chrec_a,
3402 overlaps_b, overlaps_a, last_conflicts);
3403
3404 else if (evolution_function_is_affine_p (chrec_a)
3405 && evolution_function_is_affine_p (chrec_b))
3406 {
3407 if (!chrec_contains_symbols (chrec_a)
3408 && !chrec_contains_symbols (chrec_b))
3409 {
3410 analyze_subscript_affine_affine (chrec_a, chrec_b,
3411 overlaps_a, overlaps_b,
3412 last_conflicts);
3413
3414 if (CF_NOT_KNOWN_P (*overlaps_a)
3415 || CF_NOT_KNOWN_P (*overlaps_b))
3416 dependence_stats.num_siv_unimplemented++;
3417 else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3418 || CF_NO_DEPENDENCE_P (*overlaps_b))
3419 dependence_stats.num_siv_independent++;
3420 else
3421 dependence_stats.num_siv_dependent++;
3422 }
3423 else if (can_use_analyze_subscript_affine_affine (&chrec_a,
3424 &chrec_b))
3425 {
3426 analyze_subscript_affine_affine (chrec_a, chrec_b,
3427 overlaps_a, overlaps_b,
3428 last_conflicts);
3429 /* FIXME: The number of iterations is a symbolic expression.
3430 Compute it properly. */
3431 *last_conflicts = chrec_dont_know;
3432
3433 if (CF_NOT_KNOWN_P (*overlaps_a)
3434 || CF_NOT_KNOWN_P (*overlaps_b))
3435 dependence_stats.num_siv_unimplemented++;
3436 else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3437 || CF_NO_DEPENDENCE_P (*overlaps_b))
3438 dependence_stats.num_siv_independent++;
3439 else
3440 dependence_stats.num_siv_dependent++;
3441 }
3442 else
3443 goto siv_subscript_dontknow;
3444 }
3445
3446 else
3447 {
3448 siv_subscript_dontknow:;
3449 if (dump_file && (dump_flags & TDF_DETAILS))
3450 fprintf (dump_file, "siv test failed: unimplemented.\n");
3451 *overlaps_a = conflict_fn_not_known ();
3452 *overlaps_b = conflict_fn_not_known ();
3453 *last_conflicts = chrec_dont_know;
3454 dependence_stats.num_siv_unimplemented++;
3455 }
3456
3457 if (dump_file && (dump_flags & TDF_DETAILS))
3458 fprintf (dump_file, ")\n");
3459 }
3460
3461 /* Return true when the property can be computed. RES should contain
3462 true when calling the first time this function, then it is set to
3463 false when one of the evolution steps of an affine CHREC does not
3464 divide the constant CST. */
3465
3466 static bool
3467 chrec_steps_divide_constant_p (tree chrec,
3468 tree cst,
3469 bool *res)
3470 {
3471 switch (TREE_CODE (chrec))
3472 {
3473 case POLYNOMIAL_CHREC:
3474 if (evolution_function_is_constant_p (CHREC_RIGHT (chrec)))
3475 {
3476 if (tree_fold_divides_p (CHREC_RIGHT (chrec), cst))
3477 /* Keep RES to true, and iterate on other dimensions. */
3478 return chrec_steps_divide_constant_p (CHREC_LEFT (chrec), cst, res);
3479
3480 *res = false;
3481 return true;
3482 }
3483 else
3484 /* When the step is a parameter the result is undetermined. */
3485 return false;
3486
3487 default:
3488 /* On the initial condition, return true. */
3489 return true;
3490 }
3491 }
3492
3493 /* Analyze a MIV (Multiple Index Variable) subscript. *OVERLAPS_A and
3494 *OVERLAPS_B are initialized to the functions that describe the
3495 relation between the elements accessed twice by CHREC_A and
3496 CHREC_B. For k >= 0, the following property is verified:
3497
3498 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
3499
3500 static void
3501 analyze_miv_subscript (tree chrec_a,
3502 tree chrec_b,
3503 conflict_function **overlaps_a,
3504 conflict_function **overlaps_b,
3505 tree *last_conflicts)
3506 {
3507 /* FIXME: This is a MIV subscript, not yet handled.
3508 Example: (A[{1, +, 1}_1] vs. A[{1, +, 1}_2]) that comes from
3509 (A[i] vs. A[j]).
3510
3511 In the SIV test we had to solve a Diophantine equation with two
3512 variables. In the MIV case we have to solve a Diophantine
3513 equation with 2*n variables (if the subscript uses n IVs).
3514 */
3515 bool divide_p = true;
3516 tree difference;
3517 dependence_stats.num_miv++;
3518 if (dump_file && (dump_flags & TDF_DETAILS))
3519 fprintf (dump_file, "(analyze_miv_subscript \n");
3520
3521 chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
3522 chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
3523 difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
3524
3525 if (eq_evolutions_p (chrec_a, chrec_b))
3526 {
3527 /* Access functions are the same: all the elements are accessed
3528 in the same order. */
3529 *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3530 *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3531 *last_conflicts = estimated_loop_iterations_tree
3532 (get_chrec_loop (chrec_a), true);
3533 dependence_stats.num_miv_dependent++;
3534 }
3535
3536 else if (evolution_function_is_constant_p (difference)
3537 /* For the moment, the following is verified:
3538 evolution_function_is_affine_multivariate_p (chrec_a) */
3539 && chrec_steps_divide_constant_p (chrec_a, difference, &divide_p)
3540 && !divide_p)
3541 {
3542 /* testsuite/.../ssa-chrec-33.c
3543 {{21, +, 2}_1, +, -2}_2 vs. {{20, +, 2}_1, +, -2}_2
3544
3545 The difference is 1, and the evolution steps are equal to 2,
3546 consequently there are no overlapping elements. */
3547 *overlaps_a = conflict_fn_no_dependence ();
3548 *overlaps_b = conflict_fn_no_dependence ();
3549 *last_conflicts = integer_zero_node;
3550 dependence_stats.num_miv_independent++;
3551 }
3552
3553 else if (evolution_function_is_affine_multivariate_p (chrec_a)
3554 && !chrec_contains_symbols (chrec_a)
3555 && evolution_function_is_affine_multivariate_p (chrec_b)
3556 && !chrec_contains_symbols (chrec_b))
3557 {
3558 /* testsuite/.../ssa-chrec-35.c
3559 {0, +, 1}_2 vs. {0, +, 1}_3
3560 the overlapping elements are respectively located at iterations:
3561 {0, +, 1}_x and {0, +, 1}_x,
3562 in other words, we have the equality:
3563 {0, +, 1}_2 ({0, +, 1}_x) = {0, +, 1}_3 ({0, +, 1}_x)
3564
3565 Other examples:
3566 {{0, +, 1}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y) =
3567 {0, +, 1}_1 ({{0, +, 1}_x, +, 2}_y)
3568
3569 {{0, +, 2}_1, +, 3}_2 ({0, +, 1}_y, {0, +, 1}_x) =
3570 {{0, +, 3}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y)
3571 */
3572 analyze_subscript_affine_affine (chrec_a, chrec_b,
3573 overlaps_a, overlaps_b, last_conflicts);
3574
3575 if (CF_NOT_KNOWN_P (*overlaps_a)
3576 || CF_NOT_KNOWN_P (*overlaps_b))
3577 dependence_stats.num_miv_unimplemented++;
3578 else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3579 || CF_NO_DEPENDENCE_P (*overlaps_b))
3580 dependence_stats.num_miv_independent++;
3581 else
3582 dependence_stats.num_miv_dependent++;
3583 }
3584
3585 else
3586 {
3587 /* When the analysis is too difficult, answer "don't know". */
3588 if (dump_file && (dump_flags & TDF_DETAILS))
3589 fprintf (dump_file, "analyze_miv_subscript test failed: unimplemented.\n");
3590
3591 *overlaps_a = conflict_fn_not_known ();
3592 *overlaps_b = conflict_fn_not_known ();
3593 *last_conflicts = chrec_dont_know;
3594 dependence_stats.num_miv_unimplemented++;
3595 }
3596
3597 if (dump_file && (dump_flags & TDF_DETAILS))
3598 fprintf (dump_file, ")\n");
3599 }
3600
3601 /* Determines the iterations for which CHREC_A is equal to CHREC_B.
3602 OVERLAP_ITERATIONS_A and OVERLAP_ITERATIONS_B are initialized with
3603 two functions that describe the iterations that contain conflicting
3604 elements.
3605
3606 Remark: For an integer k >= 0, the following equality is true:
3607
3608 CHREC_A (OVERLAP_ITERATIONS_A (k)) == CHREC_B (OVERLAP_ITERATIONS_B (k)).
3609 */
3610
3611 static void
3612 analyze_overlapping_iterations (tree chrec_a,
3613 tree chrec_b,
3614 conflict_function **overlap_iterations_a,
3615 conflict_function **overlap_iterations_b,
3616 tree *last_conflicts)
3617 {
3618 dependence_stats.num_subscript_tests++;
3619
3620 if (dump_file && (dump_flags & TDF_DETAILS))
3621 {
3622 fprintf (dump_file, "(analyze_overlapping_iterations \n");
3623 fprintf (dump_file, " (chrec_a = ");
3624 print_generic_expr (dump_file, chrec_a, 0);
3625 fprintf (dump_file, ")\n (chrec_b = ");
3626 print_generic_expr (dump_file, chrec_b, 0);
3627 fprintf (dump_file, ")\n");
3628 }
3629
3630 if (chrec_a == NULL_TREE
3631 || chrec_b == NULL_TREE
3632 || chrec_contains_undetermined (chrec_a)
3633 || chrec_contains_undetermined (chrec_b))
3634 {
3635 dependence_stats.num_subscript_undetermined++;
3636
3637 *overlap_iterations_a = conflict_fn_not_known ();
3638 *overlap_iterations_b = conflict_fn_not_known ();
3639 }
3640
3641 /* If they are the same chrec, and are affine, they overlap
3642 on every iteration. */
3643 else if (eq_evolutions_p (chrec_a, chrec_b)
3644 && evolution_function_is_affine_multivariate_p (chrec_a))
3645 {
3646 dependence_stats.num_same_subscript_function++;
3647 *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3648 *overlap_iterations_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3649 *last_conflicts = chrec_dont_know;
3650 }
3651
3652 /* If they aren't the same, and aren't affine, we can't do anything
3653 yet. */
3654 else if ((chrec_contains_symbols (chrec_a)
3655 || chrec_contains_symbols (chrec_b))
3656 && (!evolution_function_is_affine_multivariate_p (chrec_a)
3657 || !evolution_function_is_affine_multivariate_p (chrec_b)))
3658 {
3659 dependence_stats.num_subscript_undetermined++;
3660 *overlap_iterations_a = conflict_fn_not_known ();
3661 *overlap_iterations_b = conflict_fn_not_known ();
3662 }
3663
3664 else if (ziv_subscript_p (chrec_a, chrec_b))
3665 analyze_ziv_subscript (chrec_a, chrec_b,
3666 overlap_iterations_a, overlap_iterations_b,
3667 last_conflicts);
3668
3669 else if (siv_subscript_p (chrec_a, chrec_b))
3670 analyze_siv_subscript (chrec_a, chrec_b,
3671 overlap_iterations_a, overlap_iterations_b,
3672 last_conflicts);
3673
3674 else
3675 analyze_miv_subscript (chrec_a, chrec_b,
3676 overlap_iterations_a, overlap_iterations_b,
3677 last_conflicts);
3678
3679 if (dump_file && (dump_flags & TDF_DETAILS))
3680 {
3681 fprintf (dump_file, " (overlap_iterations_a = ");
3682 dump_conflict_function (dump_file, *overlap_iterations_a);
3683 fprintf (dump_file, ")\n (overlap_iterations_b = ");
3684 dump_conflict_function (dump_file, *overlap_iterations_b);
3685 fprintf (dump_file, ")\n");
3686 fprintf (dump_file, ")\n");
3687 }
3688 }
3689
3690 /* Helper function for uniquely inserting distance vectors. */
3691
3692 static void
3693 save_dist_v (struct data_dependence_relation *ddr, lambda_vector dist_v)
3694 {
3695 unsigned i;
3696 lambda_vector v;
3697
3698 for (i = 0; VEC_iterate (lambda_vector, DDR_DIST_VECTS (ddr), i, v); i++)
3699 if (lambda_vector_equal (v, dist_v, DDR_NB_LOOPS (ddr)))
3700 return;
3701
3702 VEC_safe_push (lambda_vector, heap, DDR_DIST_VECTS (ddr), dist_v);
3703 }
3704
3705 /* Helper function for uniquely inserting direction vectors. */
3706
3707 static void
3708 save_dir_v (struct data_dependence_relation *ddr, lambda_vector dir_v)
3709 {
3710 unsigned i;
3711 lambda_vector v;
3712
3713 for (i = 0; VEC_iterate (lambda_vector, DDR_DIR_VECTS (ddr), i, v); i++)
3714 if (lambda_vector_equal (v, dir_v, DDR_NB_LOOPS (ddr)))
3715 return;
3716
3717 VEC_safe_push (lambda_vector, heap, DDR_DIR_VECTS (ddr), dir_v);
3718 }
3719
3720 /* Add a distance of 1 on all the loops outer than INDEX. If we
3721 haven't yet determined a distance for this outer loop, push a new
3722 distance vector composed of the previous distance, and a distance
3723 of 1 for this outer loop. Example:
3724
3725 | loop_1
3726 | loop_2
3727 | A[10]
3728 | endloop_2
3729 | endloop_1
3730
3731 Saved vectors are of the form (dist_in_1, dist_in_2). First, we
3732 save (0, 1), then we have to save (1, 0). */
3733
3734 static void
3735 add_outer_distances (struct data_dependence_relation *ddr,
3736 lambda_vector dist_v, int index)
3737 {
3738 /* For each outer loop where init_v is not set, the accesses are
3739 in dependence of distance 1 in the loop. */
3740 while (--index >= 0)
3741 {
3742 lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3743 lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
3744 save_v[index] = 1;
3745 save_dist_v (ddr, save_v);
3746 }
3747 }
3748
3749 /* Return false when fail to represent the data dependence as a
3750 distance vector. INIT_B is set to true when a component has been
3751 added to the distance vector DIST_V. INDEX_CARRY is then set to
3752 the index in DIST_V that carries the dependence. */
3753
3754 static bool
3755 build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
3756 struct data_reference *ddr_a,
3757 struct data_reference *ddr_b,
3758 lambda_vector dist_v, bool *init_b,
3759 int *index_carry)
3760 {
3761 unsigned i;
3762 lambda_vector init_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3763
3764 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3765 {
3766 tree access_fn_a, access_fn_b;
3767 struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
3768
3769 if (chrec_contains_undetermined (SUB_DISTANCE (subscript)))
3770 {
3771 non_affine_dependence_relation (ddr);
3772 return false;
3773 }
3774
3775 access_fn_a = DR_ACCESS_FN (ddr_a, i);
3776 access_fn_b = DR_ACCESS_FN (ddr_b, i);
3777
3778 if (TREE_CODE (access_fn_a) == POLYNOMIAL_CHREC
3779 && TREE_CODE (access_fn_b) == POLYNOMIAL_CHREC)
3780 {
3781 int dist, index;
3782 int index_a = index_in_loop_nest (CHREC_VARIABLE (access_fn_a),
3783 DDR_LOOP_NEST (ddr));
3784 int index_b = index_in_loop_nest (CHREC_VARIABLE (access_fn_b),
3785 DDR_LOOP_NEST (ddr));
3786
3787 /* The dependence is carried by the outermost loop. Example:
3788 | loop_1
3789 | A[{4, +, 1}_1]
3790 | loop_2
3791 | A[{5, +, 1}_2]
3792 | endloop_2
3793 | endloop_1
3794 In this case, the dependence is carried by loop_1. */
3795 index = index_a < index_b ? index_a : index_b;
3796 *index_carry = MIN (index, *index_carry);
3797
3798 if (chrec_contains_undetermined (SUB_DISTANCE (subscript)))
3799 {
3800 non_affine_dependence_relation (ddr);
3801 return false;
3802 }
3803
3804 dist = int_cst_value (SUB_DISTANCE (subscript));
3805
3806 /* This is the subscript coupling test. If we have already
3807 recorded a distance for this loop (a distance coming from
3808 another subscript), it should be the same. For example,
3809 in the following code, there is no dependence:
3810
3811 | loop i = 0, N, 1
3812 | T[i+1][i] = ...
3813 | ... = T[i][i]
3814 | endloop
3815 */
3816 if (init_v[index] != 0 && dist_v[index] != dist)
3817 {
3818 finalize_ddr_dependent (ddr, chrec_known);
3819 return false;
3820 }
3821
3822 dist_v[index] = dist;
3823 init_v[index] = 1;
3824 *init_b = true;
3825 }
3826 else
3827 {
3828 /* This can be for example an affine vs. constant dependence
3829 (T[i] vs. T[3]) that is not an affine dependence and is
3830 not representable as a distance vector. */
3831 non_affine_dependence_relation (ddr);
3832 return false;
3833 }
3834 }
3835
3836 return true;
3837 }
3838
3839 /* Return true when the DDR contains two data references that have the
3840 same access functions. */
3841
3842 static bool
3843 same_access_functions (struct data_dependence_relation *ddr)
3844 {
3845 unsigned i;
3846
3847 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3848 if (!eq_evolutions_p (DR_ACCESS_FN (DDR_A (ddr), i),
3849 DR_ACCESS_FN (DDR_B (ddr), i)))
3850 return false;
3851
3852 return true;
3853 }
3854
3855 /* Helper function for the case where DDR_A and DDR_B are the same
3856 multivariate access function. */
3857
3858 static void
3859 add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
3860 {
3861 int x_1, x_2;
3862 tree c_1 = CHREC_LEFT (c_2);
3863 tree c_0 = CHREC_LEFT (c_1);
3864 lambda_vector dist_v;
3865
3866 /* Polynomials with more than 2 variables are not handled yet. */
3867 if (TREE_CODE (c_0) != INTEGER_CST)
3868 {
3869 DDR_ARE_DEPENDENT (ddr) = chrec_dont_know;
3870 return;
3871 }
3872
3873 x_2 = index_in_loop_nest (CHREC_VARIABLE (c_2), DDR_LOOP_NEST (ddr));
3874 x_1 = index_in_loop_nest (CHREC_VARIABLE (c_1), DDR_LOOP_NEST (ddr));
3875
3876 /* For "{{0, +, 2}_1, +, 3}_2" the distance vector is (3, -2). */
3877 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3878 dist_v[x_1] = int_cst_value (CHREC_RIGHT (c_2));
3879 dist_v[x_2] = -int_cst_value (CHREC_RIGHT (c_1));
3880 save_dist_v (ddr, dist_v);
3881
3882 add_outer_distances (ddr, dist_v, x_1);
3883 }
3884
3885 /* Helper function for the case where DDR_A and DDR_B are the same
3886 access functions. */
3887
3888 static void
3889 add_other_self_distances (struct data_dependence_relation *ddr)
3890 {
3891 lambda_vector dist_v;
3892 unsigned i;
3893 int index_carry = DDR_NB_LOOPS (ddr);
3894
3895 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3896 {
3897 tree access_fun = DR_ACCESS_FN (DDR_A (ddr), i);
3898
3899 if (TREE_CODE (access_fun) == POLYNOMIAL_CHREC)
3900 {
3901 if (!evolution_function_is_univariate_p (access_fun))
3902 {
3903 if (DDR_NUM_SUBSCRIPTS (ddr) != 1)
3904 {
3905 DDR_ARE_DEPENDENT (ddr) = chrec_dont_know;
3906 return;
3907 }
3908
3909 add_multivariate_self_dist (ddr, DR_ACCESS_FN (DDR_A (ddr), 0));
3910 return;
3911 }
3912
3913 index_carry = MIN (index_carry,
3914 index_in_loop_nest (CHREC_VARIABLE (access_fun),
3915 DDR_LOOP_NEST (ddr)));
3916 }
3917 }
3918
3919 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3920 add_outer_distances (ddr, dist_v, index_carry);
3921 }
3922
3923 /* Compute the classic per loop distance vector. DDR is the data
3924 dependence relation to build a vector from. Return false when fail
3925 to represent the data dependence as a distance vector. */
3926
3927 static bool
3928 build_classic_dist_vector (struct data_dependence_relation *ddr)
3929 {
3930 bool init_b = false;
3931 int index_carry = DDR_NB_LOOPS (ddr);
3932 lambda_vector dist_v;
3933
3934 if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
3935 return true;
3936
3937 if (same_access_functions (ddr))
3938 {
3939 /* Save the 0 vector. */
3940 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3941 save_dist_v (ddr, dist_v);
3942
3943 if (DDR_NB_LOOPS (ddr) > 1)
3944 add_other_self_distances (ddr);
3945
3946 return true;
3947 }
3948
3949 dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3950 if (!build_classic_dist_vector_1 (ddr, DDR_A (ddr), DDR_B (ddr),
3951 dist_v, &init_b, &index_carry))
3952 return false;
3953
3954 /* Save the distance vector if we initialized one. */
3955 if (init_b)
3956 {
3957 /* Verify a basic constraint: classic distance vectors should
3958 always be lexicographically positive.
3959
3960 Data references are collected in the order of execution of
3961 the program, thus for the following loop
3962
3963 | for (i = 1; i < 100; i++)
3964 | for (j = 1; j < 100; j++)
3965 | {
3966 | t = T[j+1][i-1]; // A
3967 | T[j][i] = t + 2; // B
3968 | }
3969
3970 references are collected following the direction of the wind:
3971 A then B. The data dependence tests are performed also
3972 following this order, such that we're looking at the distance
3973 separating the elements accessed by A from the elements later
3974 accessed by B. But in this example, the distance returned by
3975 test_dep (A, B) is lexicographically negative (-1, 1), that
3976 means that the access A occurs later than B with respect to
3977 the outer loop, ie. we're actually looking upwind. In this
3978 case we solve test_dep (B, A) looking downwind to the
3979 lexicographically positive solution, that returns the
3980 distance vector (1, -1). */
3981 if (!lambda_vector_lexico_pos (dist_v, DDR_NB_LOOPS (ddr)))
3982 {
3983 lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3984 subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr));
3985 compute_subscript_distance (ddr);
3986 build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
3987 save_v, &init_b, &index_carry);
3988 save_dist_v (ddr, save_v);
3989
3990 /* In this case there is a dependence forward for all the
3991 outer loops:
3992
3993 | for (k = 1; k < 100; k++)
3994 | for (i = 1; i < 100; i++)
3995 | for (j = 1; j < 100; j++)
3996 | {
3997 | t = T[j+1][i-1]; // A
3998 | T[j][i] = t + 2; // B
3999 | }
4000
4001 the vectors are:
4002 (0, 1, -1)
4003 (1, 1, -1)
4004 (1, -1, 1)
4005 */
4006 if (DDR_NB_LOOPS (ddr) > 1)
4007 {
4008 add_outer_distances (ddr, save_v, index_carry);
4009 add_outer_distances (ddr, dist_v, index_carry);
4010 }
4011 }
4012 else
4013 {
4014 lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4015 lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
4016 save_dist_v (ddr, save_v);
4017
4018 if (DDR_NB_LOOPS (ddr) > 1)
4019 {
4020 lambda_vector opposite_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4021
4022 subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr));
4023 compute_subscript_distance (ddr);
4024 build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
4025 opposite_v, &init_b, &index_carry);
4026
4027 add_outer_distances (ddr, dist_v, index_carry);
4028 add_outer_distances (ddr, opposite_v, index_carry);
4029 }
4030 }
4031 }
4032 else
4033 {
4034 /* There is a distance of 1 on all the outer loops: Example:
4035 there is a dependence of distance 1 on loop_1 for the array A.
4036
4037 | loop_1
4038 | A[5] = ...
4039 | endloop
4040 */
4041 add_outer_distances (ddr, dist_v,
4042 lambda_vector_first_nz (dist_v,
4043 DDR_NB_LOOPS (ddr), 0));
4044 }
4045
4046 if (dump_file && (dump_flags & TDF_DETAILS))
4047 {
4048 unsigned i;
4049
4050 fprintf (dump_file, "(build_classic_dist_vector\n");
4051 for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
4052 {
4053 fprintf (dump_file, " dist_vector = (");
4054 print_lambda_vector (dump_file, DDR_DIST_VECT (ddr, i),
4055 DDR_NB_LOOPS (ddr));
4056 fprintf (dump_file, " )\n");
4057 }
4058 fprintf (dump_file, ")\n");
4059 }
4060
4061 return true;
4062 }
4063
4064 /* Return the direction for a given distance.
4065 FIXME: Computing dir this way is suboptimal, since dir can catch
4066 cases that dist is unable to represent. */
4067
4068 static inline enum data_dependence_direction
4069 dir_from_dist (int dist)
4070 {
4071 if (dist > 0)
4072 return dir_positive;
4073 else if (dist < 0)
4074 return dir_negative;
4075 else
4076 return dir_equal;
4077 }
4078
4079 /* Compute the classic per loop direction vector. DDR is the data
4080 dependence relation to build a vector from. */
4081
4082 static void
4083 build_classic_dir_vector (struct data_dependence_relation *ddr)
4084 {
4085 unsigned i, j;
4086 lambda_vector dist_v;
4087
4088 for (i = 0; VEC_iterate (lambda_vector, DDR_DIST_VECTS (ddr), i, dist_v); i++)
4089 {
4090 lambda_vector dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4091
4092 for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
4093 dir_v[j] = dir_from_dist (dist_v[j]);
4094
4095 save_dir_v (ddr, dir_v);
4096 }
4097 }
4098
4099 /* Helper function. Returns true when there is a dependence between
4100 data references DRA and DRB. */
4101
4102 static bool
4103 subscript_dependence_tester_1 (struct data_dependence_relation *ddr,
4104 struct data_reference *dra,
4105 struct data_reference *drb)
4106 {
4107 unsigned int i;
4108 tree last_conflicts;
4109 struct subscript *subscript;
4110
4111 for (i = 0; VEC_iterate (subscript_p, DDR_SUBSCRIPTS (ddr), i, subscript);
4112 i++)
4113 {
4114 conflict_function *overlaps_a, *overlaps_b;
4115
4116 analyze_overlapping_iterations (DR_ACCESS_FN (dra, i),
4117 DR_ACCESS_FN (drb, i),
4118 &overlaps_a, &overlaps_b,
4119 &last_conflicts);
4120
4121 if (CF_NOT_KNOWN_P (overlaps_a)
4122 || CF_NOT_KNOWN_P (overlaps_b))
4123 {
4124 finalize_ddr_dependent (ddr, chrec_dont_know);
4125 dependence_stats.num_dependence_undetermined++;
4126 free_conflict_function (overlaps_a);
4127 free_conflict_function (overlaps_b);
4128 return false;
4129 }
4130
4131 else if (CF_NO_DEPENDENCE_P (overlaps_a)
4132 || CF_NO_DEPENDENCE_P (overlaps_b))
4133 {
4134 finalize_ddr_dependent (ddr, chrec_known);
4135 dependence_stats.num_dependence_independent++;
4136 free_conflict_function (overlaps_a);
4137 free_conflict_function (overlaps_b);
4138 return false;
4139 }
4140
4141 else
4142 {
4143 SUB_CONFLICTS_IN_A (subscript) = overlaps_a;
4144 SUB_CONFLICTS_IN_B (subscript) = overlaps_b;
4145 SUB_LAST_CONFLICT (subscript) = last_conflicts;
4146 }
4147 }
4148
4149 return true;
4150 }
4151
4152 /* Computes the conflicting iterations, and initialize DDR. */
4153
4154 static void
4155 subscript_dependence_tester (struct data_dependence_relation *ddr)
4156 {
4157
4158 if (dump_file && (dump_flags & TDF_DETAILS))
4159 fprintf (dump_file, "(subscript_dependence_tester \n");
4160
4161 if (subscript_dependence_tester_1 (ddr, DDR_A (ddr), DDR_B (ddr)))
4162 dependence_stats.num_dependence_dependent++;
4163
4164 compute_subscript_distance (ddr);
4165 if (build_classic_dist_vector (ddr))
4166 build_classic_dir_vector (ddr);
4167
4168 if (dump_file && (dump_flags & TDF_DETAILS))
4169 fprintf (dump_file, ")\n");
4170 }
4171
4172 /* Returns true when all the access functions of A are affine or
4173 constant. */
4174
4175 static bool
4176 access_functions_are_affine_or_constant_p (struct data_reference *a)
4177 {
4178 unsigned int i;
4179 VEC(tree,heap) **fns = DR_ACCESS_FNS_ADDR (a);
4180 tree t;
4181
4182 for (i = 0; VEC_iterate (tree, *fns, i, t); i++)
4183 if (!evolution_function_is_constant_p (t)
4184 && !evolution_function_is_affine_multivariate_p (t))
4185 return false;
4186
4187 return true;
4188 }
4189
4190 /* This computes the affine dependence relation between A and B.
4191 CHREC_KNOWN is used for representing the independence between two
4192 accesses, while CHREC_DONT_KNOW is used for representing the unknown
4193 relation.
4194
4195 Note that it is possible to stop the computation of the dependence
4196 relation the first time we detect a CHREC_KNOWN element for a given
4197 subscript. */
4198
4199 static void
4200 compute_affine_dependence (struct data_dependence_relation *ddr)
4201 {
4202 struct data_reference *dra = DDR_A (ddr);
4203 struct data_reference *drb = DDR_B (ddr);
4204
4205 if (dump_file && (dump_flags & TDF_DETAILS))
4206 {
4207 fprintf (dump_file, "(compute_affine_dependence\n");
4208 fprintf (dump_file, " (stmt_a = \n");
4209 print_generic_expr (dump_file, DR_STMT (dra), 0);
4210 fprintf (dump_file, ")\n (stmt_b = \n");
4211 print_generic_expr (dump_file, DR_STMT (drb), 0);
4212 fprintf (dump_file, ")\n");
4213 }
4214
4215 /* Analyze only when the dependence relation is not yet known. */
4216 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
4217 {
4218 dependence_stats.num_dependence_tests++;
4219
4220 if (access_functions_are_affine_or_constant_p (dra)
4221 && access_functions_are_affine_or_constant_p (drb))
4222 subscript_dependence_tester (ddr);
4223
4224 /* As a last case, if the dependence cannot be determined, or if
4225 the dependence is considered too difficult to determine, answer
4226 "don't know". */
4227 else
4228 {
4229 dependence_stats.num_dependence_undetermined++;
4230
4231 if (dump_file && (dump_flags & TDF_DETAILS))
4232 {
4233 fprintf (dump_file, "Data ref a:\n");
4234 dump_data_reference (dump_file, dra);
4235 fprintf (dump_file, "Data ref b:\n");
4236 dump_data_reference (dump_file, drb);
4237 fprintf (dump_file, "affine dependence test not usable: access function not affine or constant.\n");
4238 }
4239 finalize_ddr_dependent (ddr, chrec_dont_know);
4240 }
4241 }
4242
4243 if (dump_file && (dump_flags & TDF_DETAILS))
4244 fprintf (dump_file, ")\n");
4245 }
4246
4247 /* This computes the dependence relation for the same data
4248 reference into DDR. */
4249
4250 static void
4251 compute_self_dependence (struct data_dependence_relation *ddr)
4252 {
4253 unsigned int i;
4254 struct subscript *subscript;
4255
4256 for (i = 0; VEC_iterate (subscript_p, DDR_SUBSCRIPTS (ddr), i, subscript);
4257 i++)
4258 {
4259 /* The accessed index overlaps for each iteration. */
4260 SUB_CONFLICTS_IN_A (subscript)
4261 = conflict_fn (1, affine_fn_cst (integer_zero_node));
4262 SUB_CONFLICTS_IN_B (subscript)
4263 = conflict_fn (1, affine_fn_cst (integer_zero_node));
4264 SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
4265 }
4266
4267 /* The distance vector is the zero vector. */
4268 save_dist_v (ddr, lambda_vector_new (DDR_NB_LOOPS (ddr)));
4269 save_dir_v (ddr, lambda_vector_new (DDR_NB_LOOPS (ddr)));
4270 }
4271
4272 /* Compute in DEPENDENCE_RELATIONS the data dependence graph for all
4273 the data references in DATAREFS, in the LOOP_NEST. When
4274 COMPUTE_SELF_AND_RR is FALSE, don't compute read-read and self
4275 relations. */
4276
4277 static void
4278 compute_all_dependences (VEC (data_reference_p, heap) *datarefs,
4279 VEC (ddr_p, heap) **dependence_relations,
4280 VEC (loop_p, heap) *loop_nest,
4281 bool compute_self_and_rr)
4282 {
4283 struct data_dependence_relation *ddr;
4284 struct data_reference *a, *b;
4285 unsigned int i, j;
4286
4287 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, a); i++)
4288 for (j = i + 1; VEC_iterate (data_reference_p, datarefs, j, b); j++)
4289 if (!DR_IS_READ (a) || !DR_IS_READ (b) || compute_self_and_rr)
4290 {
4291 ddr = initialize_data_dependence_relation (a, b, loop_nest);
4292 VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
4293 compute_affine_dependence (ddr);
4294 }
4295
4296 if (compute_self_and_rr)
4297 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, a); i++)
4298 {
4299 ddr = initialize_data_dependence_relation (a, a, loop_nest);
4300 VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
4301 compute_self_dependence (ddr);
4302 }
4303 }
4304
4305 /* Stores the locations of memory references in STMT to REFERENCES. Returns
4306 true if STMT clobbers memory, false otherwise. */
4307
4308 bool
4309 get_references_in_stmt (tree stmt, VEC (data_ref_loc, heap) **references)
4310 {
4311 bool clobbers_memory = false;
4312 data_ref_loc *ref;
4313 tree *op0, *op1, arg, call;
4314 call_expr_arg_iterator iter;
4315
4316 *references = NULL;
4317
4318 /* ASM_EXPR and CALL_EXPR may embed arbitrary side effects.
4319 Calls have side-effects, except those to const or pure
4320 functions. */
4321 call = get_call_expr_in (stmt);
4322 if ((call
4323 && !(call_expr_flags (call) & (ECF_CONST | ECF_PURE)))
4324 || (TREE_CODE (stmt) == ASM_EXPR
4325 && ASM_VOLATILE_P (stmt)))
4326 clobbers_memory = true;
4327
4328 if (ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
4329 return clobbers_memory;
4330
4331 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
4332 {
4333 op0 = &GIMPLE_STMT_OPERAND (stmt, 0);
4334 op1 = &GIMPLE_STMT_OPERAND (stmt, 1);
4335
4336 if (DECL_P (*op1)
4337 || REFERENCE_CLASS_P (*op1))
4338 {
4339 ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
4340 ref->pos = op1;
4341 ref->is_read = true;
4342 }
4343
4344 if (DECL_P (*op0)
4345 || REFERENCE_CLASS_P (*op0))
4346 {
4347 ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
4348 ref->pos = op0;
4349 ref->is_read = false;
4350 }
4351 }
4352
4353 if (call)
4354 {
4355 FOR_EACH_CALL_EXPR_ARG (arg, iter, call)
4356 {
4357 op0 = &arg;
4358 if (DECL_P (*op0)
4359 || REFERENCE_CLASS_P (*op0))
4360 {
4361 ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
4362 ref->pos = op0;
4363 ref->is_read = true;
4364 }
4365 }
4366 }
4367
4368 return clobbers_memory;
4369 }
4370
4371 /* Stores the data references in STMT to DATAREFS. If there is an unanalyzable
4372 reference, returns false, otherwise returns true. */
4373
4374 static bool
4375 find_data_references_in_stmt (tree stmt,
4376 VEC (data_reference_p, heap) **datarefs)
4377 {
4378 unsigned i;
4379 VEC (data_ref_loc, heap) *references;
4380 data_ref_loc *ref;
4381 bool ret = true;
4382 data_reference_p dr;
4383
4384 if (get_references_in_stmt (stmt, &references))
4385 {
4386 VEC_free (data_ref_loc, heap, references);
4387 return false;
4388 }
4389
4390 for (i = 0; VEC_iterate (data_ref_loc, references, i, ref); i++)
4391 {
4392 dr = create_data_ref (*ref->pos, stmt, ref->is_read);
4393 if (dr)
4394 VEC_safe_push (data_reference_p, heap, *datarefs, dr);
4395 else
4396 {
4397 ret = false;
4398 break;
4399 }
4400 }
4401 VEC_free (data_ref_loc, heap, references);
4402 return ret;
4403 }
4404
4405 /* Search the data references in LOOP, and record the information into
4406 DATAREFS. Returns chrec_dont_know when failing to analyze a
4407 difficult case, returns NULL_TREE otherwise.
4408
4409 TODO: This function should be made smarter so that it can handle address
4410 arithmetic as if they were array accesses, etc. */
4411
4412 tree
4413 find_data_references_in_loop (struct loop *loop,
4414 VEC (data_reference_p, heap) **datarefs)
4415 {
4416 basic_block bb, *bbs;
4417 unsigned int i;
4418 block_stmt_iterator bsi;
4419
4420 bbs = get_loop_body (loop);
4421
4422 for (i = 0; i < loop->num_nodes; i++)
4423 {
4424 bb = bbs[i];
4425
4426 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
4427 {
4428 tree stmt = bsi_stmt (bsi);
4429
4430 if (!find_data_references_in_stmt (stmt, datarefs))
4431 {
4432 struct data_reference *res;
4433 res = XNEW (struct data_reference);
4434 DR_STMT (res) = NULL_TREE;
4435 DR_REF (res) = NULL_TREE;
4436 DR_BASE_OBJECT (res) = NULL;
4437 DR_TYPE (res) = ARRAY_REF_TYPE;
4438 DR_SET_ACCESS_FNS (res, NULL);
4439 DR_BASE_OBJECT (res) = NULL;
4440 DR_IS_READ (res) = false;
4441 DR_BASE_ADDRESS (res) = NULL_TREE;
4442 DR_OFFSET (res) = NULL_TREE;
4443 DR_INIT (res) = NULL_TREE;
4444 DR_STEP (res) = NULL_TREE;
4445 DR_OFFSET_MISALIGNMENT (res) = NULL_TREE;
4446 DR_MEMTAG (res) = NULL_TREE;
4447 DR_PTR_INFO (res) = NULL;
4448 VEC_safe_push (data_reference_p, heap, *datarefs, res);
4449
4450 free (bbs);
4451 return chrec_dont_know;
4452 }
4453 }
4454 }
4455 free (bbs);
4456
4457 return NULL_TREE;
4458 }
4459
4460 /* Recursive helper function. */
4461
4462 static bool
4463 find_loop_nest_1 (struct loop *loop, VEC (loop_p, heap) **loop_nest)
4464 {
4465 /* Inner loops of the nest should not contain siblings. Example:
4466 when there are two consecutive loops,
4467
4468 | loop_0
4469 | loop_1
4470 | A[{0, +, 1}_1]
4471 | endloop_1
4472 | loop_2
4473 | A[{0, +, 1}_2]
4474 | endloop_2
4475 | endloop_0
4476
4477 the dependence relation cannot be captured by the distance
4478 abstraction. */
4479 if (loop->next)
4480 return false;
4481
4482 VEC_safe_push (loop_p, heap, *loop_nest, loop);
4483 if (loop->inner)
4484 return find_loop_nest_1 (loop->inner, loop_nest);
4485 return true;
4486 }
4487
4488 /* Return false when the LOOP is not well nested. Otherwise return
4489 true and insert in LOOP_NEST the loops of the nest. LOOP_NEST will
4490 contain the loops from the outermost to the innermost, as they will
4491 appear in the classic distance vector. */
4492
4493 static bool
4494 find_loop_nest (struct loop *loop, VEC (loop_p, heap) **loop_nest)
4495 {
4496 VEC_safe_push (loop_p, heap, *loop_nest, loop);
4497 if (loop->inner)
4498 return find_loop_nest_1 (loop->inner, loop_nest);
4499 return true;
4500 }
4501
4502 /* Given a loop nest LOOP, the following vectors are returned:
4503 DATAREFS is initialized to all the array elements contained in this loop,
4504 DEPENDENCE_RELATIONS contains the relations between the data references.
4505 Compute read-read and self relations if
4506 COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE. */
4507
4508 void
4509 compute_data_dependences_for_loop (struct loop *loop,
4510 bool compute_self_and_read_read_dependences,
4511 VEC (data_reference_p, heap) **datarefs,
4512 VEC (ddr_p, heap) **dependence_relations)
4513 {
4514 struct loop *loop_nest = loop;
4515 VEC (loop_p, heap) *vloops = VEC_alloc (loop_p, heap, 3);
4516
4517 memset (&dependence_stats, 0, sizeof (dependence_stats));
4518
4519 /* If the loop nest is not well formed, or one of the data references
4520 is not computable, give up without spending time to compute other
4521 dependences. */
4522 if (!loop_nest
4523 || !find_loop_nest (loop_nest, &vloops)
4524 || find_data_references_in_loop (loop, datarefs) == chrec_dont_know)
4525 {
4526 struct data_dependence_relation *ddr;
4527
4528 /* Insert a single relation into dependence_relations:
4529 chrec_dont_know. */
4530 ddr = initialize_data_dependence_relation (NULL, NULL, vloops);
4531 VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
4532 }
4533 else
4534 compute_all_dependences (*datarefs, dependence_relations, vloops,
4535 compute_self_and_read_read_dependences);
4536
4537 if (dump_file && (dump_flags & TDF_STATS))
4538 {
4539 fprintf (dump_file, "Dependence tester statistics:\n");
4540
4541 fprintf (dump_file, "Number of dependence tests: %d\n",
4542 dependence_stats.num_dependence_tests);
4543 fprintf (dump_file, "Number of dependence tests classified dependent: %d\n",
4544 dependence_stats.num_dependence_dependent);
4545 fprintf (dump_file, "Number of dependence tests classified independent: %d\n",
4546 dependence_stats.num_dependence_independent);
4547 fprintf (dump_file, "Number of undetermined dependence tests: %d\n",
4548 dependence_stats.num_dependence_undetermined);
4549
4550 fprintf (dump_file, "Number of subscript tests: %d\n",
4551 dependence_stats.num_subscript_tests);
4552 fprintf (dump_file, "Number of undetermined subscript tests: %d\n",
4553 dependence_stats.num_subscript_undetermined);
4554 fprintf (dump_file, "Number of same subscript function: %d\n",
4555 dependence_stats.num_same_subscript_function);
4556
4557 fprintf (dump_file, "Number of ziv tests: %d\n",
4558 dependence_stats.num_ziv);
4559 fprintf (dump_file, "Number of ziv tests returning dependent: %d\n",
4560 dependence_stats.num_ziv_dependent);
4561 fprintf (dump_file, "Number of ziv tests returning independent: %d\n",
4562 dependence_stats.num_ziv_independent);
4563 fprintf (dump_file, "Number of ziv tests unimplemented: %d\n",
4564 dependence_stats.num_ziv_unimplemented);
4565
4566 fprintf (dump_file, "Number of siv tests: %d\n",
4567 dependence_stats.num_siv);
4568 fprintf (dump_file, "Number of siv tests returning dependent: %d\n",
4569 dependence_stats.num_siv_dependent);
4570 fprintf (dump_file, "Number of siv tests returning independent: %d\n",
4571 dependence_stats.num_siv_independent);
4572 fprintf (dump_file, "Number of siv tests unimplemented: %d\n",
4573 dependence_stats.num_siv_unimplemented);
4574
4575 fprintf (dump_file, "Number of miv tests: %d\n",
4576 dependence_stats.num_miv);
4577 fprintf (dump_file, "Number of miv tests returning dependent: %d\n",
4578 dependence_stats.num_miv_dependent);
4579 fprintf (dump_file, "Number of miv tests returning independent: %d\n",
4580 dependence_stats.num_miv_independent);
4581 fprintf (dump_file, "Number of miv tests unimplemented: %d\n",
4582 dependence_stats.num_miv_unimplemented);
4583 }
4584 }
4585
4586 /* Entry point (for testing only). Analyze all the data references
4587 and the dependence relations.
4588
4589 The data references are computed first.
4590
4591 A relation on these nodes is represented by a complete graph. Some
4592 of the relations could be of no interest, thus the relations can be
4593 computed on demand.
4594
4595 In the following function we compute all the relations. This is
4596 just a first implementation that is here for:
4597 - for showing how to ask for the dependence relations,
4598 - for the debugging the whole dependence graph,
4599 - for the dejagnu testcases and maintenance.
4600
4601 It is possible to ask only for a part of the graph, avoiding to
4602 compute the whole dependence graph. The computed dependences are
4603 stored in a knowledge base (KB) such that later queries don't
4604 recompute the same information. The implementation of this KB is
4605 transparent to the optimizer, and thus the KB can be changed with a
4606 more efficient implementation, or the KB could be disabled. */
4607 #if 0
4608 static void
4609 analyze_all_data_dependences (struct loops *loops)
4610 {
4611 unsigned int i;
4612 int nb_data_refs = 10;
4613 VEC (data_reference_p, heap) *datarefs =
4614 VEC_alloc (data_reference_p, heap, nb_data_refs);
4615 VEC (ddr_p, heap) *dependence_relations =
4616 VEC_alloc (ddr_p, heap, nb_data_refs * nb_data_refs);
4617
4618 /* Compute DDs on the whole function. */
4619 compute_data_dependences_for_loop (loops->parray[0], false,
4620 &datarefs, &dependence_relations);
4621
4622 if (dump_file)
4623 {
4624 dump_data_dependence_relations (dump_file, dependence_relations);
4625 fprintf (dump_file, "\n\n");
4626
4627 if (dump_flags & TDF_DETAILS)
4628 dump_dist_dir_vectors (dump_file, dependence_relations);
4629
4630 if (dump_flags & TDF_STATS)
4631 {
4632 unsigned nb_top_relations = 0;
4633 unsigned nb_bot_relations = 0;
4634 unsigned nb_basename_differ = 0;
4635 unsigned nb_chrec_relations = 0;
4636 struct data_dependence_relation *ddr;
4637
4638 for (i = 0; VEC_iterate (ddr_p, dependence_relations, i, ddr); i++)
4639 {
4640 if (chrec_contains_undetermined (DDR_ARE_DEPENDENT (ddr)))
4641 nb_top_relations++;
4642
4643 else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
4644 {
4645 struct data_reference *a = DDR_A (ddr);
4646 struct data_reference *b = DDR_B (ddr);
4647 bool differ_p;
4648
4649 if ((DR_BASE_OBJECT (a) && DR_BASE_OBJECT (b)
4650 && DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b))
4651 || (base_object_differ_p (a, b, &differ_p)
4652 && differ_p))
4653 nb_basename_differ++;
4654 else
4655 nb_bot_relations++;
4656 }
4657
4658 else
4659 nb_chrec_relations++;
4660 }
4661
4662 gather_stats_on_scev_database ();
4663 }
4664 }
4665
4666 free_dependence_relations (dependence_relations);
4667 free_data_refs (datarefs);
4668 }
4669 #endif
4670
4671 /* Free the memory used by a data dependence relation DDR. */
4672
4673 void
4674 free_dependence_relation (struct data_dependence_relation *ddr)
4675 {
4676 if (ddr == NULL)
4677 return;
4678
4679 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_SUBSCRIPTS (ddr))
4680 free_subscripts (DDR_SUBSCRIPTS (ddr));
4681
4682 free (ddr);
4683 }
4684
4685 /* Free the memory used by the data dependence relations from
4686 DEPENDENCE_RELATIONS. */
4687
4688 void
4689 free_dependence_relations (VEC (ddr_p, heap) *dependence_relations)
4690 {
4691 unsigned int i;
4692 struct data_dependence_relation *ddr;
4693 VEC (loop_p, heap) *loop_nest = NULL;
4694
4695 for (i = 0; VEC_iterate (ddr_p, dependence_relations, i, ddr); i++)
4696 {
4697 if (ddr == NULL)
4698 continue;
4699 if (loop_nest == NULL)
4700 loop_nest = DDR_LOOP_NEST (ddr);
4701 else
4702 gcc_assert (DDR_LOOP_NEST (ddr) == NULL
4703 || DDR_LOOP_NEST (ddr) == loop_nest);
4704 free_dependence_relation (ddr);
4705 }
4706
4707 if (loop_nest)
4708 VEC_free (loop_p, heap, loop_nest);
4709 VEC_free (ddr_p, heap, dependence_relations);
4710 }
4711
4712 /* Free the memory used by the data references from DATAREFS. */
4713
4714 void
4715 free_data_refs (VEC (data_reference_p, heap) *datarefs)
4716 {
4717 unsigned int i;
4718 struct data_reference *dr;
4719
4720 for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
4721 free_data_ref (dr);
4722 VEC_free (data_reference_p, heap, datarefs);
4723 }
4724