]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-data-ref.c
targhooks.c (default_unwind_emit, [...]): Use gcc_assert, gcc_unreachable & internal_...
[thirdparty/gcc.git] / gcc / tree-data-ref.c
1 /* Data references and dependences detectors.
2 Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <s.pop@laposte.net>
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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, 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 dependences
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 "errors.h"
82 #include "ggc.h"
83 #include "tree.h"
84
85 /* These RTL headers are needed for basic-block.h. */
86 #include "rtl.h"
87 #include "basic-block.h"
88 #include "diagnostic.h"
89 #include "tree-flow.h"
90 #include "tree-dump.h"
91 #include "timevar.h"
92 #include "cfgloop.h"
93 #include "tree-chrec.h"
94 #include "tree-data-ref.h"
95 #include "tree-scalar-evolution.h"
96 #include "tree-pass.h"
97 #include "lambda.h"
98
99 \f
100 /* This is the simplest data dependence test: determines whether the
101 data references A and B access the same array/region. If can't determine -
102 return false; Otherwise, return true, and DIFFER_P will record
103 the result. This utility will not be necessary when alias_sets_conflict_p
104 will be less conservative. */
105
106 bool
107 array_base_name_differ_p (struct data_reference *a,
108 struct data_reference *b,
109 bool *differ_p)
110 {
111 tree base_a = DR_BASE_NAME (a);
112 tree base_b = DR_BASE_NAME (b);
113 tree ta = TREE_TYPE (base_a);
114 tree tb = TREE_TYPE (base_b);
115
116
117 /** Determine if same base **/
118
119 /* array accesses: a[i],b[i] or pointer accesses: *a,*b. bases are a,b. */
120 if (base_a == base_b)
121 {
122 *differ_p = false;
123 return true;
124 }
125
126 /* pointer based accesses - (*p)[i],(*q)[j]. bases are (*p),(*q) */
127 if (TREE_CODE (base_a) == INDIRECT_REF && TREE_CODE (base_b) == INDIRECT_REF
128 && TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0))
129 {
130 *differ_p = false;
131 return true;
132 }
133
134 /* record/union based accesses - s.a[i], t.b[j]. bases are s.a,t.b. */
135 if (TREE_CODE (base_a) == COMPONENT_REF && TREE_CODE (base_b) == COMPONENT_REF
136 && TREE_OPERAND (base_a, 0) == TREE_OPERAND (base_b, 0)
137 && TREE_OPERAND (base_a, 1) == TREE_OPERAND (base_b, 1))
138 {
139 *differ_p = false;
140 return true;
141 }
142
143
144 /** Determine if different bases **/
145
146 /* at this point we know that base_a != base_b. However, pointer accesses
147 of the form x=(*p) and y=(*q), which bases are p and q, may still by pointing
148 to the same base. In SSAed GIMPLE p and q will be SSA_NAMES in this case.
149 Therefore, here we check if it's really two diferent declarations. */
150 if (TREE_CODE (base_a) == VAR_DECL && TREE_CODE (base_b) == VAR_DECL)
151 {
152 *differ_p = true;
153 return true;
154 }
155
156 /* compare two record/union bases s.a and t.b:
157 s != t or (a != b and s and t are not unions) */
158 if (TREE_CODE (base_a) == COMPONENT_REF && TREE_CODE (base_b) == COMPONENT_REF
159 && ((TREE_CODE (TREE_OPERAND (base_a, 0)) == VAR_DECL
160 && TREE_CODE (TREE_OPERAND (base_b, 0)) == VAR_DECL
161 && TREE_OPERAND (base_a, 0) != TREE_OPERAND (base_b, 0))
162 || (TREE_CODE (TREE_TYPE (TREE_OPERAND (base_a, 0))) == RECORD_TYPE
163 && TREE_CODE (TREE_TYPE (TREE_OPERAND (base_b, 0))) == RECORD_TYPE
164 && TREE_OPERAND (base_a, 1) != TREE_OPERAND (base_b, 1))))
165 {
166 *differ_p = true;
167 return true;
168 }
169
170 /* compare a record/union access and an array access. */
171 if ((TREE_CODE (base_a) == VAR_DECL
172 && (TREE_CODE (base_b) == COMPONENT_REF
173 && TREE_CODE (TREE_OPERAND (base_b, 0)) == VAR_DECL))
174 || (TREE_CODE (base_b) == VAR_DECL
175 && (TREE_CODE (base_a) == COMPONENT_REF
176 && TREE_CODE (TREE_OPERAND (base_a, 0)) == VAR_DECL)))
177 {
178 *differ_p = true;
179 return true;
180 }
181
182 if (!alias_sets_conflict_p (get_alias_set (base_a), get_alias_set (base_b)))
183 {
184 *differ_p = true;
185 return true;
186 }
187
188 /* An insn writing through a restricted pointer is "independent" of any
189 insn reading or writing through a different pointer, in the same
190 block/scope.
191 */
192 if ((TREE_CODE (ta) == POINTER_TYPE && TYPE_RESTRICT (ta)
193 && !DR_IS_READ(a))
194 || (TREE_CODE (tb) == POINTER_TYPE && TYPE_RESTRICT (tb)
195 && !DR_IS_READ(b)))
196 {
197 *differ_p = true;
198 return true;
199 }
200
201 *differ_p = false; /* Don't know, but be conservative. */
202 return false;
203 }
204
205 /* Returns true iff A divides B. */
206
207 static inline bool
208 tree_fold_divides_p (tree type,
209 tree a,
210 tree b)
211 {
212 if (integer_onep (a))
213 return true;
214
215 /* Determines whether (A == gcd (A, B)). */
216 return integer_zerop
217 (fold (build (MINUS_EXPR, type, a, tree_fold_gcd (a, b))));
218 }
219
220 /* Bezout: Let A1 and A2 be two integers; there exist two integers U11
221 and U12 such that,
222
223 | U11 * A1 + U12 * A2 = gcd (A1, A2).
224
225 This function computes the greatest common divisor using the
226 Blankinship algorithm. The gcd is returned, and the coefficients
227 of the unimodular matrix U are (U11, U12, U21, U22) such that,
228
229 | U.A = S
230
231 | (U11 U12) (A1) = (gcd)
232 | (U21 U22) (A2) (0)
233
234 FIXME: Use lambda_..._hermite for implementing this function.
235 */
236
237 static tree
238 tree_fold_bezout (tree a1,
239 tree a2,
240 tree *u11, tree *u12,
241 tree *u21, tree *u22)
242 {
243 tree s1, s2;
244
245 /* Initialize S with the coefficients of A. */
246 s1 = a1;
247 s2 = a2;
248
249 /* Initialize the U matrix */
250 *u11 = integer_one_node;
251 *u12 = integer_zero_node;
252 *u21 = integer_zero_node;
253 *u22 = integer_one_node;
254
255 if (integer_zerop (a1)
256 || integer_zerop (a2))
257 return integer_zero_node;
258
259 while (!integer_zerop (s2))
260 {
261 int sign;
262 tree z, zu21, zu22, zs2;
263
264 sign = tree_int_cst_sgn (s1) * tree_int_cst_sgn (s2);
265 z = fold (build (FLOOR_DIV_EXPR, integer_type_node,
266 fold (build1 (ABS_EXPR, integer_type_node, s1)),
267 fold (build1 (ABS_EXPR, integer_type_node, s2))));
268 zu21 = fold (build (MULT_EXPR, integer_type_node, z, *u21));
269 zu22 = fold (build (MULT_EXPR, integer_type_node, z, *u22));
270 zs2 = fold (build (MULT_EXPR, integer_type_node, z, s2));
271
272 /* row1 -= z * row2. */
273 gcc_assert (sign != 0);
274 if (sign < 0)
275 {
276 *u11 = fold (build (PLUS_EXPR, integer_type_node, *u11, zu21));
277 *u12 = fold (build (PLUS_EXPR, integer_type_node, *u12, zu22));
278 s1 = fold (build (PLUS_EXPR, integer_type_node, s1, zs2));
279 }
280 else
281 {
282 *u11 = fold (build (MINUS_EXPR, integer_type_node, *u11, zu21));
283 *u12 = fold (build (MINUS_EXPR, integer_type_node, *u12, zu22));
284 s1 = fold (build (MINUS_EXPR, integer_type_node, s1, zs2));
285 }
286
287 /* Interchange row1 and row2. */
288 {
289 tree flip;
290
291 flip = *u11;
292 *u11 = *u21;
293 *u21 = flip;
294
295 flip = *u12;
296 *u12 = *u22;
297 *u22 = flip;
298
299 flip = s1;
300 s1 = s2;
301 s2 = flip;
302 }
303 }
304
305 if (tree_int_cst_sgn (s1) < 0)
306 {
307 *u11 = fold (build (MULT_EXPR, integer_type_node, *u11,
308 integer_minus_one_node));
309 *u12 = fold (build (MULT_EXPR, integer_type_node, *u12,
310 integer_minus_one_node));
311 s1 = fold (build (MULT_EXPR, integer_type_node, s1, integer_minus_one_node));
312 }
313
314 return s1;
315 }
316
317 \f
318
319 /* Dump into FILE all the data references from DATAREFS. */
320
321 void
322 dump_data_references (FILE *file,
323 varray_type datarefs)
324 {
325 unsigned int i;
326
327 for (i = 0; i < VARRAY_ACTIVE_SIZE (datarefs); i++)
328 dump_data_reference (file, VARRAY_GENERIC_PTR (datarefs, i));
329 }
330
331 /* Dump into FILE all the dependence relations from DDR. */
332
333 void
334 dump_data_dependence_relations (FILE *file,
335 varray_type ddr)
336 {
337 unsigned int i;
338
339 for (i = 0; i < VARRAY_ACTIVE_SIZE (ddr); i++)
340 dump_data_dependence_relation (file, VARRAY_GENERIC_PTR (ddr, i));
341 }
342
343 /* Dump function for a DATA_REFERENCE structure. */
344
345 void
346 dump_data_reference (FILE *outf,
347 struct data_reference *dr)
348 {
349 unsigned int i;
350
351 fprintf (outf, "(Data Ref: \n stmt: ");
352 print_generic_stmt (outf, DR_STMT (dr), 0);
353 fprintf (outf, " ref: ");
354 print_generic_stmt (outf, DR_REF (dr), 0);
355 fprintf (outf, " base_name: ");
356 print_generic_stmt (outf, DR_BASE_NAME (dr), 0);
357
358 for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
359 {
360 fprintf (outf, " Access function %d: ", i);
361 print_generic_stmt (outf, DR_ACCESS_FN (dr, i), 0);
362 }
363 fprintf (outf, ")\n");
364 }
365
366 /* Dump function for a DATA_DEPENDENCE_RELATION structure. */
367
368 void
369 dump_data_dependence_relation (FILE *outf,
370 struct data_dependence_relation *ddr)
371 {
372 unsigned int i;
373 struct data_reference *dra, *drb;
374
375 dra = DDR_A (ddr);
376 drb = DDR_B (ddr);
377
378 if (dra && drb)
379 fprintf (outf, "(Data Dep:");
380 else
381 fprintf (outf, "(Data Dep:");
382
383 if (chrec_contains_undetermined (DDR_ARE_DEPENDENT (ddr)))
384 fprintf (outf, " (don't know)\n");
385
386 else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
387 fprintf (outf, " (no dependence)\n");
388
389 else
390 {
391 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
392 {
393 tree chrec;
394 struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
395
396 fprintf (outf, "\n (subscript %d:\n", i);
397 fprintf (outf, " access_fn_A: ");
398 print_generic_stmt (outf, DR_ACCESS_FN (dra, i), 0);
399 fprintf (outf, " access_fn_B: ");
400 print_generic_stmt (outf, DR_ACCESS_FN (drb, i), 0);
401
402 chrec = SUB_CONFLICTS_IN_A (subscript);
403 fprintf (outf, " iterations_that_access_an_element_twice_in_A: ");
404 print_generic_stmt (outf, chrec, 0);
405 if (chrec == chrec_known)
406 fprintf (outf, " (no dependence)\n");
407 else if (chrec_contains_undetermined (chrec))
408 fprintf (outf, " (don't know)\n");
409 else
410 {
411 tree last_iteration = SUB_LAST_CONFLICT_IN_A (subscript);
412 fprintf (outf, " last_iteration_that_access_an_element_twice_in_A: ");
413 print_generic_stmt (outf, last_iteration, 0);
414 }
415
416 chrec = SUB_CONFLICTS_IN_B (subscript);
417 fprintf (outf, " iterations_that_access_an_element_twice_in_B: ");
418 print_generic_stmt (outf, chrec, 0);
419 if (chrec == chrec_known)
420 fprintf (outf, " (no dependence)\n");
421 else if (chrec_contains_undetermined (chrec))
422 fprintf (outf, " (don't know)\n");
423 else
424 {
425 tree last_iteration = SUB_LAST_CONFLICT_IN_B (subscript);
426 fprintf (outf, " last_iteration_that_access_an_element_twice_in_B: ");
427 print_generic_stmt (outf, last_iteration, 0);
428 }
429
430 fprintf (outf, " )\n");
431 }
432
433 fprintf (outf, " (Distance Vector: \n");
434 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
435 {
436 struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
437
438 fprintf (outf, "(");
439 print_generic_stmt (outf, SUB_DISTANCE (subscript), 0);
440 fprintf (outf, ")\n");
441 }
442 fprintf (outf, " )\n");
443 }
444
445 fprintf (outf, ")\n");
446 }
447
448
449
450 /* Dump function for a DATA_DEPENDENCE_DIRECTION structure. */
451
452 void
453 dump_data_dependence_direction (FILE *file,
454 enum data_dependence_direction dir)
455 {
456 switch (dir)
457 {
458 case dir_positive:
459 fprintf (file, "+");
460 break;
461
462 case dir_negative:
463 fprintf (file, "-");
464 break;
465
466 case dir_equal:
467 fprintf (file, "=");
468 break;
469
470 case dir_positive_or_negative:
471 fprintf (file, "+-");
472 break;
473
474 case dir_positive_or_equal:
475 fprintf (file, "+=");
476 break;
477
478 case dir_negative_or_equal:
479 fprintf (file, "-=");
480 break;
481
482 case dir_star:
483 fprintf (file, "*");
484 break;
485
486 default:
487 break;
488 }
489 }
490
491 \f
492
493 /* Given an ARRAY_REF node REF, records its access functions.
494 Example: given A[i][3], record in ACCESS_FNS the opnd1 function,
495 ie. the constant "3", then recursively call the function on opnd0,
496 ie. the ARRAY_REF "A[i]". The function returns the base name:
497 "A". */
498
499 static tree
500 analyze_array_indexes (struct loop *loop,
501 varray_type access_fns,
502 tree ref)
503 {
504 tree opnd0, opnd1;
505 tree access_fn;
506
507 opnd0 = TREE_OPERAND (ref, 0);
508 opnd1 = TREE_OPERAND (ref, 1);
509
510 /* The detection of the evolution function for this data access is
511 postponed until the dependence test. This lazy strategy avoids
512 the computation of access functions that are of no interest for
513 the optimizers. */
514 access_fn = instantiate_parameters
515 (loop, analyze_scalar_evolution (loop, opnd1));
516
517 VARRAY_PUSH_TREE (access_fns, access_fn);
518
519 /* Recursively record other array access functions. */
520 if (TREE_CODE (opnd0) == ARRAY_REF)
521 return analyze_array_indexes (loop, access_fns, opnd0);
522
523 /* Return the base name of the data access. */
524 else
525 return opnd0;
526 }
527
528 /* For a data reference REF contained in the statemet STMT, initialize
529 a DATA_REFERENCE structure, and return it. IS_READ flag has to be
530 set to true when REF is in the right hand side of an
531 assignment. */
532
533 struct data_reference *
534 analyze_array (tree stmt, tree ref, bool is_read)
535 {
536 struct data_reference *res;
537
538 if (dump_file && (dump_flags & TDF_DETAILS))
539 {
540 fprintf (dump_file, "(analyze_array \n");
541 fprintf (dump_file, " (ref = ");
542 print_generic_stmt (dump_file, ref, 0);
543 fprintf (dump_file, ")\n");
544 }
545
546 res = xmalloc (sizeof (struct data_reference));
547
548 DR_STMT (res) = stmt;
549 DR_REF (res) = ref;
550 VARRAY_TREE_INIT (DR_ACCESS_FNS (res), 3, "access_fns");
551 DR_BASE_NAME (res) = analyze_array_indexes
552 (loop_containing_stmt (stmt), DR_ACCESS_FNS (res), ref);
553 DR_IS_READ (res) = is_read;
554
555 if (dump_file && (dump_flags & TDF_DETAILS))
556 fprintf (dump_file, ")\n");
557
558 return res;
559 }
560
561 /* For a data reference REF contained in the statemet STMT, initialize
562 a DATA_REFERENCE structure, and return it. */
563
564 struct data_reference *
565 init_data_ref (tree stmt,
566 tree ref,
567 tree base,
568 tree access_fn,
569 bool is_read)
570 {
571 struct data_reference *res;
572
573 if (dump_file && (dump_flags & TDF_DETAILS))
574 {
575 fprintf (dump_file, "(init_data_ref \n");
576 fprintf (dump_file, " (ref = ");
577 print_generic_stmt (dump_file, ref, 0);
578 fprintf (dump_file, ")\n");
579 }
580
581 res = xmalloc (sizeof (struct data_reference));
582
583 DR_STMT (res) = stmt;
584 DR_REF (res) = ref;
585 VARRAY_TREE_INIT (DR_ACCESS_FNS (res), 5, "access_fns");
586 DR_BASE_NAME (res) = base;
587 VARRAY_PUSH_TREE (DR_ACCESS_FNS (res), access_fn);
588 DR_IS_READ (res) = is_read;
589
590 if (dump_file && (dump_flags & TDF_DETAILS))
591 fprintf (dump_file, ")\n");
592
593 return res;
594 }
595
596 \f
597
598 /* When there exists a dependence relation, determine its distance
599 vector. */
600
601 static void
602 compute_distance_vector (struct data_dependence_relation *ddr)
603 {
604 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
605 {
606 unsigned int i;
607
608 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
609 {
610 tree conflicts_a, conflicts_b, difference;
611 struct subscript *subscript;
612
613 subscript = DDR_SUBSCRIPT (ddr, i);
614 conflicts_a = SUB_CONFLICTS_IN_A (subscript);
615 conflicts_b = SUB_CONFLICTS_IN_B (subscript);
616 difference = chrec_fold_minus
617 (integer_type_node, conflicts_b, conflicts_a);
618
619 if (evolution_function_is_constant_p (difference))
620 SUB_DISTANCE (subscript) = difference;
621
622 else
623 SUB_DISTANCE (subscript) = chrec_dont_know;
624 }
625 }
626 }
627
628 /* Initialize a ddr. */
629
630 struct data_dependence_relation *
631 initialize_data_dependence_relation (struct data_reference *a,
632 struct data_reference *b)
633 {
634 struct data_dependence_relation *res;
635 bool differ_p;
636
637 res = xmalloc (sizeof (struct data_dependence_relation));
638 DDR_A (res) = a;
639 DDR_B (res) = b;
640
641 if (a == NULL || b == NULL
642 || DR_BASE_NAME (a) == NULL_TREE
643 || DR_BASE_NAME (b) == NULL_TREE)
644 DDR_ARE_DEPENDENT (res) = chrec_dont_know;
645
646 /* When the dimensions of A and B differ, we directly initialize
647 the relation to "there is no dependence": chrec_known. */
648 else if (DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b)
649 || (array_base_name_differ_p (a, b, &differ_p) && differ_p))
650 DDR_ARE_DEPENDENT (res) = chrec_known;
651
652 else
653 {
654 unsigned int i;
655 DDR_ARE_DEPENDENT (res) = NULL_TREE;
656 DDR_SUBSCRIPTS_VECTOR_INIT (res, DR_NUM_DIMENSIONS (a));
657
658 for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)
659 {
660 struct subscript *subscript;
661
662 subscript = xmalloc (sizeof (struct subscript));
663 SUB_CONFLICTS_IN_A (subscript) = chrec_dont_know;
664 SUB_CONFLICTS_IN_B (subscript) = chrec_dont_know;
665 SUB_LAST_CONFLICT_IN_A (subscript) = chrec_dont_know;
666 SUB_LAST_CONFLICT_IN_B (subscript) = chrec_dont_know;
667 SUB_DISTANCE (subscript) = chrec_dont_know;
668 VARRAY_PUSH_GENERIC_PTR (DDR_SUBSCRIPTS (res), subscript);
669 }
670 }
671
672 return res;
673 }
674
675 /* Set DDR_ARE_DEPENDENT to CHREC and finalize the subscript overlap
676 description. */
677
678 static inline void
679 finalize_ddr_dependent (struct data_dependence_relation *ddr,
680 tree chrec)
681 {
682 if (dump_file && (dump_flags & TDF_DETAILS))
683 {
684 fprintf (dump_file, "(dependence classified: ");
685 print_generic_expr (dump_file, chrec, 0);
686 fprintf (dump_file, ")\n");
687 }
688
689 DDR_ARE_DEPENDENT (ddr) = chrec;
690 varray_clear (DDR_SUBSCRIPTS (ddr));
691 }
692
693 \f
694
695 /* This section contains the classic Banerjee tests. */
696
697 /* Returns true iff CHREC_A and CHREC_B are not dependent on any index
698 variables, i.e., if the ZIV (Zero Index Variable) test is true. */
699
700 static inline bool
701 ziv_subscript_p (tree chrec_a,
702 tree chrec_b)
703 {
704 return (evolution_function_is_constant_p (chrec_a)
705 && evolution_function_is_constant_p (chrec_b));
706 }
707
708 /* Returns true iff CHREC_A and CHREC_B are dependent on an index
709 variable, i.e., if the SIV (Single Index Variable) test is true. */
710
711 static bool
712 siv_subscript_p (tree chrec_a,
713 tree chrec_b)
714 {
715 if ((evolution_function_is_constant_p (chrec_a)
716 && evolution_function_is_univariate_p (chrec_b))
717 || (evolution_function_is_constant_p (chrec_b)
718 && evolution_function_is_univariate_p (chrec_a)))
719 return true;
720
721 if (evolution_function_is_univariate_p (chrec_a)
722 && evolution_function_is_univariate_p (chrec_b))
723 {
724 switch (TREE_CODE (chrec_a))
725 {
726 case POLYNOMIAL_CHREC:
727 switch (TREE_CODE (chrec_b))
728 {
729 case POLYNOMIAL_CHREC:
730 if (CHREC_VARIABLE (chrec_a) != CHREC_VARIABLE (chrec_b))
731 return false;
732
733 default:
734 return true;
735 }
736
737 default:
738 return true;
739 }
740 }
741
742 return false;
743 }
744
745 /* Analyze a ZIV (Zero Index Variable) subscript. *OVERLAPS_A and
746 *OVERLAPS_B are initialized to the functions that describe the
747 relation between the elements accessed twice by CHREC_A and
748 CHREC_B. For k >= 0, the following property is verified:
749
750 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
751
752 static void
753 analyze_ziv_subscript (tree chrec_a,
754 tree chrec_b,
755 tree *overlaps_a,
756 tree *overlaps_b)
757 {
758 tree difference;
759
760 if (dump_file && (dump_flags & TDF_DETAILS))
761 fprintf (dump_file, "(analyze_ziv_subscript \n");
762
763 difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
764
765 switch (TREE_CODE (difference))
766 {
767 case INTEGER_CST:
768 if (integer_zerop (difference))
769 {
770 /* The difference is equal to zero: the accessed index
771 overlaps for each iteration in the loop. */
772 *overlaps_a = integer_zero_node;
773 *overlaps_b = integer_zero_node;
774 }
775 else
776 {
777 /* The accesses do not overlap. */
778 *overlaps_a = chrec_known;
779 *overlaps_b = chrec_known;
780 }
781 break;
782
783 default:
784 /* We're not sure whether the indexes overlap. For the moment,
785 conservatively answer "don't know". */
786 *overlaps_a = chrec_dont_know;
787 *overlaps_b = chrec_dont_know;
788 break;
789 }
790
791 if (dump_file && (dump_flags & TDF_DETAILS))
792 fprintf (dump_file, ")\n");
793 }
794
795 /* Analyze a SIV (Single Index Variable) subscript where CHREC_A is a
796 constant, and CHREC_B is an affine function. *OVERLAPS_A and
797 *OVERLAPS_B are initialized to the functions that describe the
798 relation between the elements accessed twice by CHREC_A and
799 CHREC_B. For k >= 0, the following property is verified:
800
801 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
802
803 static void
804 analyze_siv_subscript_cst_affine (tree chrec_a,
805 tree chrec_b,
806 tree *overlaps_a,
807 tree *overlaps_b)
808 {
809 bool value0, value1, value2;
810 tree difference = chrec_fold_minus
811 (integer_type_node, CHREC_LEFT (chrec_b), chrec_a);
812
813 if (!chrec_is_positive (initial_condition (difference), &value0))
814 {
815 *overlaps_a = chrec_dont_know;
816 *overlaps_b = chrec_dont_know;
817 return;
818 }
819 else
820 {
821 if (value0 == false)
822 {
823 if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value1))
824 {
825 *overlaps_a = chrec_dont_know;
826 *overlaps_b = chrec_dont_know;
827 return;
828 }
829 else
830 {
831 if (value1 == true)
832 {
833 /* Example:
834 chrec_a = 12
835 chrec_b = {10, +, 1}
836 */
837
838 if (tree_fold_divides_p
839 (integer_type_node, CHREC_RIGHT (chrec_b), difference))
840 {
841 *overlaps_a = integer_zero_node;
842 *overlaps_b = fold
843 (build (EXACT_DIV_EXPR, integer_type_node,
844 fold (build1 (ABS_EXPR, integer_type_node, difference)),
845 CHREC_RIGHT (chrec_b)));
846 return;
847 }
848
849 /* When the step does not divides the difference, there are
850 no overlaps. */
851 else
852 {
853 *overlaps_a = chrec_known;
854 *overlaps_b = chrec_known;
855 return;
856 }
857 }
858
859 else
860 {
861 /* Example:
862 chrec_a = 12
863 chrec_b = {10, +, -1}
864
865 In this case, chrec_a will not overlap with chrec_b. */
866 *overlaps_a = chrec_known;
867 *overlaps_b = chrec_known;
868 return;
869 }
870 }
871 }
872 else
873 {
874 if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value2))
875 {
876 *overlaps_a = chrec_dont_know;
877 *overlaps_b = chrec_dont_know;
878 return;
879 }
880 else
881 {
882 if (value2 == false)
883 {
884 /* Example:
885 chrec_a = 3
886 chrec_b = {10, +, -1}
887 */
888 if (tree_fold_divides_p
889 (integer_type_node, CHREC_RIGHT (chrec_b), difference))
890 {
891 *overlaps_a = integer_zero_node;
892 *overlaps_b = fold
893 (build (EXACT_DIV_EXPR, integer_type_node, difference,
894 CHREC_RIGHT (chrec_b)));
895 return;
896 }
897
898 /* When the step does not divides the difference, there
899 are no overlaps. */
900 else
901 {
902 *overlaps_a = chrec_known;
903 *overlaps_b = chrec_known;
904 return;
905 }
906 }
907 else
908 {
909 /* Example:
910 chrec_a = 3
911 chrec_b = {4, +, 1}
912
913 In this case, chrec_a will not overlap with chrec_b. */
914 *overlaps_a = chrec_known;
915 *overlaps_b = chrec_known;
916 return;
917 }
918 }
919 }
920 }
921 }
922
923 /* Analyze a SIV (Single Index Variable) subscript where CHREC_A is an
924 affine function, and CHREC_B is a constant. *OVERLAPS_A and
925 *OVERLAPS_B are initialized to the functions that describe the
926 relation between the elements accessed twice by CHREC_A and
927 CHREC_B. For k >= 0, the following property is verified:
928
929 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
930
931 static void
932 analyze_siv_subscript_affine_cst (tree chrec_a,
933 tree chrec_b,
934 tree *overlaps_a,
935 tree *overlaps_b)
936 {
937 analyze_siv_subscript_cst_affine (chrec_b, chrec_a, overlaps_b, overlaps_a);
938 }
939
940 /* Determines the overlapping elements due to accesses CHREC_A and
941 CHREC_B, that are affine functions. This is a part of the
942 subscript analyzer. */
943
944 static void
945 analyze_subscript_affine_affine (tree chrec_a,
946 tree chrec_b,
947 tree *overlaps_a,
948 tree *overlaps_b)
949 {
950 tree left_a, left_b, right_a, right_b;
951
952 if (dump_file && (dump_flags & TDF_DETAILS))
953 fprintf (dump_file, "(analyze_subscript_affine_affine \n");
954
955 /* For determining the initial intersection, we have to solve a
956 Diophantine equation. This is the most time consuming part.
957
958 For answering to the question: "Is there a dependence?" we have
959 to prove that there exists a solution to the Diophantine
960 equation, and that the solution is in the iteration domain,
961 ie. the solution is positive or zero, and that the solution
962 happens before the upper bound loop.nb_iterations. Otherwise
963 there is no dependence. This function outputs a description of
964 the iterations that hold the intersections. */
965
966 left_a = CHREC_LEFT (chrec_a);
967 left_b = CHREC_LEFT (chrec_b);
968 right_a = CHREC_RIGHT (chrec_a);
969 right_b = CHREC_RIGHT (chrec_b);
970
971 if (chrec_zerop (chrec_fold_minus (integer_type_node, left_a, left_b)))
972 {
973 /* The first element accessed twice is on the first
974 iteration. */
975 *overlaps_a = build_polynomial_chrec
976 (CHREC_VARIABLE (chrec_b), integer_zero_node, integer_one_node);
977 *overlaps_b = build_polynomial_chrec
978 (CHREC_VARIABLE (chrec_a), integer_zero_node, integer_one_node);
979 }
980
981 else if (TREE_CODE (left_a) == INTEGER_CST
982 && TREE_CODE (left_b) == INTEGER_CST
983 && TREE_CODE (right_a) == INTEGER_CST
984 && TREE_CODE (right_b) == INTEGER_CST
985
986 /* Both functions should have the same evolution sign. */
987 && ((tree_int_cst_sgn (right_a) > 0
988 && tree_int_cst_sgn (right_b) > 0)
989 || (tree_int_cst_sgn (right_a) < 0
990 && tree_int_cst_sgn (right_b) < 0)))
991 {
992 /* Here we have to solve the Diophantine equation. Reference
993 book: "Loop Transformations for Restructuring Compilers - The
994 Foundations" by Utpal Banerjee, pages 59-80.
995
996 ALPHA * X0 = BETA * Y0 + GAMMA.
997
998 with:
999 ALPHA = RIGHT_A
1000 BETA = RIGHT_B
1001 GAMMA = LEFT_B - LEFT_A
1002 CHREC_A = {LEFT_A, +, RIGHT_A}
1003 CHREC_B = {LEFT_B, +, RIGHT_B}
1004
1005 The Diophantine equation has a solution if and only if gcd
1006 (ALPHA, BETA) divides GAMMA. This is commonly known under
1007 the name of the "gcd-test".
1008 */
1009 tree alpha, beta, gamma;
1010 tree la, lb;
1011 tree gcd_alpha_beta;
1012 tree u11, u12, u21, u22;
1013
1014 /* Both alpha and beta have to be integer_type_node. The gcd
1015 function does not work correctly otherwise. */
1016 alpha = copy_node (right_a);
1017 beta = copy_node (right_b);
1018 la = copy_node (left_a);
1019 lb = copy_node (left_b);
1020 TREE_TYPE (alpha) = integer_type_node;
1021 TREE_TYPE (beta) = integer_type_node;
1022 TREE_TYPE (la) = integer_type_node;
1023 TREE_TYPE (lb) = integer_type_node;
1024
1025 gamma = fold (build (MINUS_EXPR, integer_type_node, lb, la));
1026
1027 /* FIXME: Use lambda_*_Hermite for implementing Bezout. */
1028 gcd_alpha_beta = tree_fold_bezout
1029 (alpha,
1030 fold (build (MULT_EXPR, integer_type_node, beta,
1031 integer_minus_one_node)),
1032 &u11, &u12,
1033 &u21, &u22);
1034
1035 if (dump_file && (dump_flags & TDF_DETAILS))
1036 {
1037 fprintf (dump_file, " (alpha = ");
1038 print_generic_expr (dump_file, alpha, 0);
1039 fprintf (dump_file, ")\n (beta = ");
1040 print_generic_expr (dump_file, beta, 0);
1041 fprintf (dump_file, ")\n (gamma = ");
1042 print_generic_expr (dump_file, gamma, 0);
1043 fprintf (dump_file, ")\n (gcd_alpha_beta = ");
1044 print_generic_expr (dump_file, gcd_alpha_beta, 0);
1045 fprintf (dump_file, ")\n");
1046 }
1047
1048 /* The classic "gcd-test". */
1049 if (!tree_fold_divides_p (integer_type_node, gcd_alpha_beta, gamma))
1050 {
1051 /* The "gcd-test" has determined that there is no integer
1052 solution, ie. there is no dependence. */
1053 *overlaps_a = chrec_known;
1054 *overlaps_b = chrec_known;
1055 }
1056
1057 else
1058 {
1059 /* The solutions are given by:
1060 |
1061 | [GAMMA/GCD_ALPHA_BETA t].[u11 u12] = [X]
1062 | [u21 u22] [Y]
1063
1064 For a given integer t. Using the following variables,
1065
1066 | i0 = u11 * gamma / gcd_alpha_beta
1067 | j0 = u12 * gamma / gcd_alpha_beta
1068 | i1 = u21
1069 | j1 = u22
1070
1071 the solutions are:
1072
1073 | x = i0 + i1 * t,
1074 | y = j0 + j1 * t. */
1075
1076 tree i0, j0, i1, j1, t;
1077 tree gamma_gcd;
1078
1079 /* X0 and Y0 are the first iterations for which there is a
1080 dependence. X0, Y0 are two solutions of the Diophantine
1081 equation: chrec_a (X0) = chrec_b (Y0). */
1082 tree x0, y0;
1083
1084 /* Exact div because in this case gcd_alpha_beta divides
1085 gamma. */
1086 gamma_gcd = fold (build (EXACT_DIV_EXPR, integer_type_node, gamma,
1087 gcd_alpha_beta));
1088 i0 = fold (build (MULT_EXPR, integer_type_node, u11, gamma_gcd));
1089 j0 = fold (build (MULT_EXPR, integer_type_node, u12, gamma_gcd));
1090 i1 = u21;
1091 j1 = u22;
1092
1093 if ((tree_int_cst_sgn (i1) == 0
1094 && tree_int_cst_sgn (i0) < 0)
1095 || (tree_int_cst_sgn (j1) == 0
1096 && tree_int_cst_sgn (j0) < 0))
1097 {
1098 /* There is no solution.
1099 FIXME: The case "i0 > nb_iterations, j0 > nb_iterations"
1100 falls in here, but for the moment we don't look at the
1101 upper bound of the iteration domain. */
1102 *overlaps_a = chrec_known;
1103 *overlaps_b = chrec_known;
1104 }
1105
1106 else
1107 {
1108 if (tree_int_cst_sgn (i1) > 0)
1109 {
1110 t = fold
1111 (build (CEIL_DIV_EXPR, integer_type_node,
1112 fold (build (MULT_EXPR, integer_type_node, i0,
1113 integer_minus_one_node)),
1114 i1));
1115
1116 if (tree_int_cst_sgn (j1) > 0)
1117 {
1118 t = fold
1119 (build (MAX_EXPR, integer_type_node, t,
1120 fold (build (CEIL_DIV_EXPR, integer_type_node,
1121 fold (build
1122 (MULT_EXPR,
1123 integer_type_node, j0,
1124 integer_minus_one_node)),
1125 j1))));
1126
1127 x0 = fold
1128 (build (PLUS_EXPR, integer_type_node, i0,
1129 fold (build
1130 (MULT_EXPR, integer_type_node, i1, t))));
1131 y0 = fold
1132 (build (PLUS_EXPR, integer_type_node, j0,
1133 fold (build
1134 (MULT_EXPR, integer_type_node, j1, t))));
1135
1136 *overlaps_a = build_polynomial_chrec
1137 (CHREC_VARIABLE (chrec_b), x0, u21);
1138 *overlaps_b = build_polynomial_chrec
1139 (CHREC_VARIABLE (chrec_a), y0, u22);
1140 }
1141 else
1142 {
1143 /* FIXME: For the moment, the upper bound of the
1144 iteration domain for j is not checked. */
1145 *overlaps_a = chrec_dont_know;
1146 *overlaps_b = chrec_dont_know;
1147 }
1148 }
1149
1150 else
1151 {
1152 /* FIXME: For the moment, the upper bound of the
1153 iteration domain for i is not checked. */
1154 *overlaps_a = chrec_dont_know;
1155 *overlaps_b = chrec_dont_know;
1156 }
1157 }
1158 }
1159 }
1160
1161 else
1162 {
1163 /* For the moment, "don't know". */
1164 *overlaps_a = chrec_dont_know;
1165 *overlaps_b = chrec_dont_know;
1166 }
1167
1168 if (dump_file && (dump_flags & TDF_DETAILS))
1169 {
1170 fprintf (dump_file, " (overlaps_a = ");
1171 print_generic_expr (dump_file, *overlaps_a, 0);
1172 fprintf (dump_file, ")\n (overlaps_b = ");
1173 print_generic_expr (dump_file, *overlaps_b, 0);
1174 fprintf (dump_file, ")\n");
1175 }
1176
1177 if (dump_file && (dump_flags & TDF_DETAILS))
1178 fprintf (dump_file, ")\n");
1179 }
1180
1181 /* Analyze a SIV (Single Index Variable) subscript. *OVERLAPS_A and
1182 *OVERLAPS_B are initialized to the functions that describe the
1183 relation between the elements accessed twice by CHREC_A and
1184 CHREC_B. For k >= 0, the following property is verified:
1185
1186 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
1187
1188 static void
1189 analyze_siv_subscript (tree chrec_a,
1190 tree chrec_b,
1191 tree *overlaps_a,
1192 tree *overlaps_b)
1193 {
1194 if (dump_file && (dump_flags & TDF_DETAILS))
1195 fprintf (dump_file, "(analyze_siv_subscript \n");
1196
1197 if (evolution_function_is_constant_p (chrec_a)
1198 && evolution_function_is_affine_p (chrec_b))
1199 analyze_siv_subscript_cst_affine (chrec_a, chrec_b,
1200 overlaps_a, overlaps_b);
1201
1202 else if (evolution_function_is_affine_p (chrec_a)
1203 && evolution_function_is_constant_p (chrec_b))
1204 analyze_siv_subscript_affine_cst (chrec_a, chrec_b,
1205 overlaps_a, overlaps_b);
1206
1207 else if (evolution_function_is_affine_p (chrec_a)
1208 && evolution_function_is_affine_p (chrec_b)
1209 && (CHREC_VARIABLE (chrec_a) == CHREC_VARIABLE (chrec_b)))
1210 analyze_subscript_affine_affine (chrec_a, chrec_b,
1211 overlaps_a, overlaps_b);
1212 else
1213 {
1214 *overlaps_a = chrec_dont_know;
1215 *overlaps_b = chrec_dont_know;
1216 }
1217
1218 if (dump_file && (dump_flags & TDF_DETAILS))
1219 fprintf (dump_file, ")\n");
1220 }
1221
1222 /* Return true when the evolution steps of an affine CHREC divide the
1223 constant CST. */
1224
1225 static bool
1226 chrec_steps_divide_constant_p (tree chrec,
1227 tree cst)
1228 {
1229 switch (TREE_CODE (chrec))
1230 {
1231 case POLYNOMIAL_CHREC:
1232 return (tree_fold_divides_p (integer_type_node, CHREC_RIGHT (chrec), cst)
1233 && chrec_steps_divide_constant_p (CHREC_LEFT (chrec), cst));
1234
1235 default:
1236 /* On the initial condition, return true. */
1237 return true;
1238 }
1239 }
1240
1241 /* Analyze a MIV (Multiple Index Variable) subscript. *OVERLAPS_A and
1242 *OVERLAPS_B are initialized to the functions that describe the
1243 relation between the elements accessed twice by CHREC_A and
1244 CHREC_B. For k >= 0, the following property is verified:
1245
1246 CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)). */
1247
1248 static void
1249 analyze_miv_subscript (tree chrec_a,
1250 tree chrec_b,
1251 tree *overlaps_a,
1252 tree *overlaps_b)
1253 {
1254 /* FIXME: This is a MIV subscript, not yet handled.
1255 Example: (A[{1, +, 1}_1] vs. A[{1, +, 1}_2]) that comes from
1256 (A[i] vs. A[j]).
1257
1258 In the SIV test we had to solve a Diophantine equation with two
1259 variables. In the MIV case we have to solve a Diophantine
1260 equation with 2*n variables (if the subscript uses n IVs).
1261 */
1262 tree difference;
1263
1264 if (dump_file && (dump_flags & TDF_DETAILS))
1265 fprintf (dump_file, "(analyze_miv_subscript \n");
1266
1267 difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
1268
1269 if (chrec_zerop (difference))
1270 {
1271 /* Access functions are the same: all the elements are accessed
1272 in the same order. */
1273 *overlaps_a = integer_zero_node;
1274 *overlaps_b = integer_zero_node;
1275 }
1276
1277 else if (evolution_function_is_constant_p (difference)
1278 /* For the moment, the following is verified:
1279 evolution_function_is_affine_multivariate_p (chrec_a) */
1280 && !chrec_steps_divide_constant_p (chrec_a, difference))
1281 {
1282 /* testsuite/.../ssa-chrec-33.c
1283 {{21, +, 2}_1, +, -2}_2 vs. {{20, +, 2}_1, +, -2}_2
1284
1285 The difference is 1, and the evolution steps are equal to 2,
1286 consequently there are no overlapping elements. */
1287 *overlaps_a = chrec_known;
1288 *overlaps_b = chrec_known;
1289 }
1290
1291 else if (evolution_function_is_univariate_p (chrec_a)
1292 && evolution_function_is_univariate_p (chrec_b))
1293 {
1294 /* testsuite/.../ssa-chrec-35.c
1295 {0, +, 1}_2 vs. {0, +, 1}_3
1296 the overlapping elements are respectively located at iterations:
1297 {0, +, 1}_3 and {0, +, 1}_2.
1298 */
1299 if (evolution_function_is_affine_p (chrec_a)
1300 && evolution_function_is_affine_p (chrec_b))
1301 analyze_subscript_affine_affine (chrec_a, chrec_b,
1302 overlaps_a, overlaps_b);
1303 else
1304 {
1305 *overlaps_a = chrec_dont_know;
1306 *overlaps_b = chrec_dont_know;
1307 }
1308 }
1309
1310 else
1311 {
1312 /* When the analysis is too difficult, answer "don't know". */
1313 *overlaps_a = chrec_dont_know;
1314 *overlaps_b = chrec_dont_know;
1315 }
1316
1317 if (dump_file && (dump_flags & TDF_DETAILS))
1318 fprintf (dump_file, ")\n");
1319 }
1320
1321 /* Determines the iterations for which CHREC_A is equal to CHREC_B.
1322 OVERLAP_ITERATIONS_A and OVERLAP_ITERATIONS_B are initialized with
1323 two functions that describe the iterations that contain conflicting
1324 elements.
1325
1326 Remark: For an integer k >= 0, the following equality is true:
1327
1328 CHREC_A (OVERLAP_ITERATIONS_A (k)) == CHREC_B (OVERLAP_ITERATIONS_B (k)).
1329 */
1330
1331 static void
1332 analyze_overlapping_iterations (tree chrec_a,
1333 tree chrec_b,
1334 tree *overlap_iterations_a,
1335 tree *overlap_iterations_b)
1336 {
1337 if (dump_file && (dump_flags & TDF_DETAILS))
1338 {
1339 fprintf (dump_file, "(analyze_overlapping_iterations \n");
1340 fprintf (dump_file, " (chrec_a = ");
1341 print_generic_expr (dump_file, chrec_a, 0);
1342 fprintf (dump_file, ")\n chrec_b = ");
1343 print_generic_expr (dump_file, chrec_b, 0);
1344 fprintf (dump_file, ")\n");
1345 }
1346
1347 if (chrec_a == NULL_TREE
1348 || chrec_b == NULL_TREE
1349 || chrec_contains_undetermined (chrec_a)
1350 || chrec_contains_undetermined (chrec_b)
1351 || chrec_contains_symbols (chrec_a)
1352 || chrec_contains_symbols (chrec_b))
1353 {
1354 *overlap_iterations_a = chrec_dont_know;
1355 *overlap_iterations_b = chrec_dont_know;
1356 }
1357
1358 else if (ziv_subscript_p (chrec_a, chrec_b))
1359 analyze_ziv_subscript (chrec_a, chrec_b,
1360 overlap_iterations_a, overlap_iterations_b);
1361
1362 else if (siv_subscript_p (chrec_a, chrec_b))
1363 analyze_siv_subscript (chrec_a, chrec_b,
1364 overlap_iterations_a, overlap_iterations_b);
1365
1366 else
1367 analyze_miv_subscript (chrec_a, chrec_b,
1368 overlap_iterations_a, overlap_iterations_b);
1369
1370 if (dump_file && (dump_flags & TDF_DETAILS))
1371 {
1372 fprintf (dump_file, " (overlap_iterations_a = ");
1373 print_generic_expr (dump_file, *overlap_iterations_a, 0);
1374 fprintf (dump_file, ")\n (overlap_iterations_b = ");
1375 print_generic_expr (dump_file, *overlap_iterations_b, 0);
1376 fprintf (dump_file, ")\n");
1377 }
1378 }
1379
1380 \f
1381
1382 /* This section contains the affine functions dependences detector. */
1383
1384 /* Computes the conflicting iterations, and initialize DDR. */
1385
1386 static void
1387 subscript_dependence_tester (struct data_dependence_relation *ddr)
1388 {
1389 unsigned int i;
1390 struct data_reference *dra = DDR_A (ddr);
1391 struct data_reference *drb = DDR_B (ddr);
1392
1393 if (dump_file && (dump_flags & TDF_DETAILS))
1394 fprintf (dump_file, "(subscript_dependence_tester \n");
1395
1396 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
1397 {
1398 tree overlaps_a, overlaps_b;
1399 struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
1400
1401 analyze_overlapping_iterations (DR_ACCESS_FN (dra, i),
1402 DR_ACCESS_FN (drb, i),
1403 &overlaps_a, &overlaps_b);
1404
1405 if (chrec_contains_undetermined (overlaps_a)
1406 || chrec_contains_undetermined (overlaps_b))
1407 {
1408 finalize_ddr_dependent (ddr, chrec_dont_know);
1409 break;
1410 }
1411
1412 else if (overlaps_a == chrec_known
1413 || overlaps_b == chrec_known)
1414 {
1415 finalize_ddr_dependent (ddr, chrec_known);
1416 break;
1417 }
1418
1419 else
1420 {
1421 SUB_CONFLICTS_IN_A (subscript) = overlaps_a;
1422 SUB_CONFLICTS_IN_B (subscript) = overlaps_b;
1423 }
1424 }
1425
1426 if (dump_file && (dump_flags & TDF_DETAILS))
1427 fprintf (dump_file, ")\n");
1428 }
1429
1430 /* Compute the classic per loop distance vector.
1431
1432 DDR is the data dependence relation to build a vector from.
1433 NB_LOOPS is the total number of loops we are considering.
1434 FIRST_LOOP is the loop->num of the first loop. */
1435
1436 static void
1437 build_classic_dist_vector (struct data_dependence_relation *ddr,
1438 int nb_loops, unsigned int first_loop)
1439 {
1440 unsigned i;
1441 lambda_vector dist_v, init_v;
1442
1443 dist_v = lambda_vector_new (nb_loops);
1444 init_v = lambda_vector_new (nb_loops);
1445 lambda_vector_clear (dist_v, nb_loops);
1446 lambda_vector_clear (init_v, nb_loops);
1447
1448 if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
1449 return;
1450
1451 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
1452 {
1453 struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
1454
1455 if (chrec_contains_undetermined (SUB_DISTANCE (subscript)))
1456 return;
1457
1458 if (TREE_CODE (SUB_CONFLICTS_IN_A (subscript)) == POLYNOMIAL_CHREC)
1459 {
1460 int dist;
1461 int loop_nb;
1462 loop_nb = CHREC_VARIABLE (SUB_CONFLICTS_IN_A (subscript));
1463 loop_nb -= first_loop;
1464 /* If the loop number is still greater than the number of
1465 loops we've been asked to analyze, or negative,
1466 something is borked. */
1467 gcc_assert (loop_nb >= 0);
1468 gcc_assert (loop_nb < nb_loops);
1469 dist = int_cst_value (SUB_DISTANCE (subscript));
1470
1471 /* This is the subscript coupling test.
1472 | loop i = 0, N, 1
1473 | T[i+1][i] = ...
1474 | ... = T[i][i]
1475 | endloop
1476 There is no dependence. */
1477 if (init_v[loop_nb] != 0
1478 && dist_v[loop_nb] != dist)
1479 {
1480 finalize_ddr_dependent (ddr, chrec_known);
1481 return;
1482 }
1483
1484 dist_v[loop_nb] = dist;
1485 init_v[loop_nb] = 1;
1486 }
1487 }
1488
1489 /* There is a distance of 1 on all the outer loops:
1490
1491 Example: there is a dependence of distance 1 on loop_1 for the array A.
1492 | loop_1
1493 | A[5] = ...
1494 | endloop
1495 */
1496 {
1497 struct loop *lca, *loop_a, *loop_b;
1498 struct data_reference *a = DDR_A (ddr);
1499 struct data_reference *b = DDR_B (ddr);
1500 int lca_nb;
1501 loop_a = loop_containing_stmt (DR_STMT (a));
1502 loop_b = loop_containing_stmt (DR_STMT (b));
1503
1504 /* Get the common ancestor loop. */
1505 lca = find_common_loop (loop_a, loop_b);
1506
1507 lca_nb = lca->num;
1508 lca_nb -= first_loop;
1509 gcc_assert (lca_nb >= 0);
1510 gcc_assert (lca_nb < nb_loops);
1511 /* For each outer loop where init_v is not set, the accesses are
1512 in dependence of distance 1 in the loop. */
1513 if (lca != loop_a
1514 && lca != loop_b
1515 && init_v[lca_nb] == 0)
1516 dist_v[lca_nb] = 1;
1517
1518 lca = lca->outer;
1519
1520 if (lca)
1521 {
1522 lca_nb = lca->num - first_loop;
1523 while (lca->depth != 0)
1524 {
1525 gcc_assert (lca_nb >= 0);
1526 gcc_assert (lca_nb < nb_loops);
1527 if (init_v[lca_nb] == 0)
1528 dist_v[lca_nb] = 1;
1529 lca = lca->outer;
1530 lca_nb = lca->num - first_loop;
1531
1532 }
1533 }
1534 }
1535
1536 DDR_DIST_VECT (ddr) = dist_v;
1537 }
1538
1539 /* Compute the classic per loop direction vector.
1540
1541 DDR is the data dependence relation to build a vector from.
1542 NB_LOOPS is the total number of loops we are considering.
1543 FIRST_LOOP is the loop->num of the first loop. */
1544
1545 static void
1546 build_classic_dir_vector (struct data_dependence_relation *ddr,
1547 int nb_loops, unsigned int first_loop)
1548 {
1549 unsigned i;
1550 lambda_vector dir_v, init_v;
1551
1552 dir_v = lambda_vector_new (nb_loops);
1553 init_v = lambda_vector_new (nb_loops);
1554 lambda_vector_clear (dir_v, nb_loops);
1555 lambda_vector_clear (init_v, nb_loops);
1556
1557 if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
1558 return;
1559
1560 for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
1561 {
1562 struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
1563
1564 if (TREE_CODE (SUB_CONFLICTS_IN_A (subscript)) == POLYNOMIAL_CHREC
1565 && TREE_CODE (SUB_CONFLICTS_IN_B (subscript)) == POLYNOMIAL_CHREC)
1566 {
1567 int loop_nb;
1568
1569 enum data_dependence_direction dir = dir_star;
1570 loop_nb = CHREC_VARIABLE (SUB_CONFLICTS_IN_A (subscript));
1571 loop_nb -= first_loop;
1572
1573 /* If the loop number is still greater than the number of
1574 loops we've been asked to analyze, or negative,
1575 something is borked. */
1576 gcc_assert (loop_nb >= 0);
1577 gcc_assert (loop_nb < nb_loops);
1578 if (!chrec_contains_undetermined (SUB_DISTANCE (subscript)))
1579 {
1580 int dist = int_cst_value (SUB_DISTANCE (subscript));
1581
1582 if (dist == 0)
1583 dir = dir_equal;
1584 else if (dist > 0)
1585 dir = dir_positive;
1586 else if (dist < 0)
1587 dir = dir_negative;
1588 }
1589
1590 /* This is the subscript coupling test.
1591 | loop i = 0, N, 1
1592 | T[i+1][i] = ...
1593 | ... = T[i][i]
1594 | endloop
1595 There is no dependence. */
1596 if (init_v[loop_nb] != 0
1597 && dir != dir_star
1598 && (enum data_dependence_direction) dir_v[loop_nb] != dir
1599 && (enum data_dependence_direction) dir_v[loop_nb] != dir_star)
1600 {
1601 finalize_ddr_dependent (ddr, chrec_known);
1602 return;
1603 }
1604
1605 dir_v[loop_nb] = dir;
1606 init_v[loop_nb] = 1;
1607 }
1608 }
1609
1610 /* There is a distance of 1 on all the outer loops:
1611
1612 Example: there is a dependence of distance 1 on loop_1 for the array A.
1613 | loop_1
1614 | A[5] = ...
1615 | endloop
1616 */
1617 {
1618 struct loop *lca, *loop_a, *loop_b;
1619 struct data_reference *a = DDR_A (ddr);
1620 struct data_reference *b = DDR_B (ddr);
1621 int lca_nb;
1622 loop_a = loop_containing_stmt (DR_STMT (a));
1623 loop_b = loop_containing_stmt (DR_STMT (b));
1624
1625 /* Get the common ancestor loop. */
1626 lca = find_common_loop (loop_a, loop_b);
1627 lca_nb = lca->num - first_loop;
1628
1629 gcc_assert (lca_nb >= 0);
1630 gcc_assert (lca_nb < nb_loops);
1631 /* For each outer loop where init_v is not set, the accesses are
1632 in dependence of distance 1 in the loop. */
1633 if (lca != loop_a
1634 && lca != loop_b
1635 && init_v[lca_nb] == 0)
1636 dir_v[lca_nb] = dir_positive;
1637
1638 lca = lca->outer;
1639 if (lca)
1640 {
1641 lca_nb = lca->num - first_loop;
1642 while (lca->depth != 0)
1643 {
1644 gcc_assert (lca_nb >= 0);
1645 gcc_assert (lca_nb < nb_loops);
1646 if (init_v[lca_nb] == 0)
1647 dir_v[lca_nb] = dir_positive;
1648 lca = lca->outer;
1649 lca_nb = lca->num - first_loop;
1650
1651 }
1652 }
1653 }
1654
1655 DDR_DIR_VECT (ddr) = dir_v;
1656 }
1657
1658 /* Returns true when all the access functions of A are affine or
1659 constant. */
1660
1661 static bool
1662 access_functions_are_affine_or_constant_p (struct data_reference *a)
1663 {
1664 unsigned int i;
1665 varray_type fns = DR_ACCESS_FNS (a);
1666
1667 for (i = 0; i < VARRAY_ACTIVE_SIZE (fns); i++)
1668 if (!evolution_function_is_constant_p (VARRAY_TREE (fns, i))
1669 && !evolution_function_is_affine_multivariate_p (VARRAY_TREE (fns, i)))
1670 return false;
1671
1672 return true;
1673 }
1674
1675 /* This computes the affine dependence relation between A and B.
1676 CHREC_KNOWN is used for representing the independence between two
1677 accesses, while CHREC_DONT_KNOW is used for representing the unknown
1678 relation.
1679
1680 Note that it is possible to stop the computation of the dependence
1681 relation the first time we detect a CHREC_KNOWN element for a given
1682 subscript. */
1683
1684 void
1685 compute_affine_dependence (struct data_dependence_relation *ddr)
1686 {
1687 struct data_reference *dra = DDR_A (ddr);
1688 struct data_reference *drb = DDR_B (ddr);
1689
1690 if (dump_file && (dump_flags & TDF_DETAILS))
1691 {
1692 fprintf (dump_file, "(compute_affine_dependence\n");
1693 fprintf (dump_file, " (stmt_a = \n");
1694 print_generic_expr (dump_file, DR_STMT (dra), 0);
1695 fprintf (dump_file, ")\n (stmt_b = \n");
1696 print_generic_expr (dump_file, DR_STMT (drb), 0);
1697 fprintf (dump_file, ")\n");
1698 }
1699
1700 /* Analyze only when the dependence relation is not yet known. */
1701 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
1702 {
1703 if (access_functions_are_affine_or_constant_p (dra)
1704 && access_functions_are_affine_or_constant_p (drb))
1705 subscript_dependence_tester (ddr);
1706
1707 /* As a last case, if the dependence cannot be determined, or if
1708 the dependence is considered too difficult to determine, answer
1709 "don't know". */
1710 else
1711 finalize_ddr_dependent (ddr, chrec_dont_know);
1712 }
1713
1714 if (dump_file && (dump_flags & TDF_DETAILS))
1715 fprintf (dump_file, ")\n");
1716 }
1717
1718 /* Compute a subset of the data dependence relation graph. Don't
1719 compute read-read relations, and avoid the computation of the
1720 opposite relation, ie. when AB has been computed, don't compute BA.
1721 DATAREFS contains a list of data references, and the result is set
1722 in DEPENDENCE_RELATIONS. */
1723
1724 static void
1725 compute_all_dependences (varray_type datarefs,
1726 varray_type *dependence_relations)
1727 {
1728 unsigned int i, j, N;
1729
1730 N = VARRAY_ACTIVE_SIZE (datarefs);
1731
1732 for (i = 0; i < N; i++)
1733 for (j = i; j < N; j++)
1734 {
1735 struct data_reference *a, *b;
1736 struct data_dependence_relation *ddr;
1737
1738 a = VARRAY_GENERIC_PTR (datarefs, i);
1739 b = VARRAY_GENERIC_PTR (datarefs, j);
1740
1741 ddr = initialize_data_dependence_relation (a, b);
1742
1743 VARRAY_PUSH_GENERIC_PTR (*dependence_relations, ddr);
1744 compute_affine_dependence (ddr);
1745 compute_distance_vector (ddr);
1746 }
1747 }
1748
1749 /* Search the data references in LOOP, and record the information into
1750 DATAREFS. Returns chrec_dont_know when failing to analyze a
1751 difficult case, returns NULL_TREE otherwise.
1752
1753 FIXME: This is a "dumb" walker over all the trees in the loop body.
1754 Find another technique that avoids this costly walk. This is
1755 acceptable for the moment, since this function is used only for
1756 debugging purposes. */
1757
1758 static tree
1759 find_data_references_in_loop (struct loop *loop, varray_type *datarefs)
1760 {
1761 basic_block bb;
1762 block_stmt_iterator bsi;
1763
1764 FOR_EACH_BB (bb)
1765 {
1766 if (!flow_bb_inside_loop_p (loop, bb))
1767 continue;
1768
1769 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1770 {
1771 tree stmt = bsi_stmt (bsi);
1772 stmt_ann_t ann = stmt_ann (stmt);
1773
1774 if (TREE_CODE (stmt) != MODIFY_EXPR)
1775 continue;
1776
1777 if (!VUSE_OPS (ann)
1778 && !V_MUST_DEF_OPS (ann)
1779 && !V_MAY_DEF_OPS (ann))
1780 continue;
1781
1782 /* In the GIMPLE representation, a modify expression
1783 contains a single load or store to memory. */
1784 if (TREE_CODE (TREE_OPERAND (stmt, 0)) == ARRAY_REF)
1785 VARRAY_PUSH_GENERIC_PTR
1786 (*datarefs, analyze_array (stmt, TREE_OPERAND (stmt, 0),
1787 false));
1788
1789 else if (TREE_CODE (TREE_OPERAND (stmt, 1)) == ARRAY_REF)
1790 VARRAY_PUSH_GENERIC_PTR
1791 (*datarefs, analyze_array (stmt, TREE_OPERAND (stmt, 1),
1792 true));
1793
1794 else
1795 return chrec_dont_know;
1796 }
1797 }
1798
1799 return NULL_TREE;
1800 }
1801
1802 \f
1803
1804 /* This section contains all the entry points. */
1805
1806 /* Given a loop nest LOOP, the following vectors are returned:
1807 *DATAREFS is initialized to all the array elements contained in this loop,
1808 *DEPENDENCE_RELATIONS contains the relations between the data references. */
1809
1810 void
1811 compute_data_dependences_for_loop (unsigned nb_loops,
1812 struct loop *loop,
1813 varray_type *datarefs,
1814 varray_type *dependence_relations)
1815 {
1816 unsigned int i;
1817
1818 /* If one of the data references is not computable, give up without
1819 spending time to compute other dependences. */
1820 if (find_data_references_in_loop (loop, datarefs) == chrec_dont_know)
1821 {
1822 struct data_dependence_relation *ddr;
1823
1824 /* Insert a single relation into dependence_relations:
1825 chrec_dont_know. */
1826 ddr = initialize_data_dependence_relation (NULL, NULL);
1827 VARRAY_PUSH_GENERIC_PTR (*dependence_relations, ddr);
1828 build_classic_dist_vector (ddr, nb_loops, loop->num);
1829 build_classic_dir_vector (ddr, nb_loops, loop->num);
1830 return;
1831 }
1832
1833 compute_all_dependences (*datarefs, dependence_relations);
1834
1835 for (i = 0; i < VARRAY_ACTIVE_SIZE (*dependence_relations); i++)
1836 {
1837 struct data_dependence_relation *ddr;
1838 ddr = VARRAY_GENERIC_PTR (*dependence_relations, i);
1839 build_classic_dist_vector (ddr, nb_loops, loop->num);
1840 build_classic_dir_vector (ddr, nb_loops, loop->num);
1841 }
1842 }
1843
1844 /* Entry point (for testing only). Analyze all the data references
1845 and the dependence relations.
1846
1847 The data references are computed first.
1848
1849 A relation on these nodes is represented by a complete graph. Some
1850 of the relations could be of no interest, thus the relations can be
1851 computed on demand.
1852
1853 In the following function we compute all the relations. This is
1854 just a first implementation that is here for:
1855 - for showing how to ask for the dependence relations,
1856 - for the debugging the whole dependence graph,
1857 - for the dejagnu testcases and maintenance.
1858
1859 It is possible to ask only for a part of the graph, avoiding to
1860 compute the whole dependence graph. The computed dependences are
1861 stored in a knowledge base (KB) such that later queries don't
1862 recompute the same information. The implementation of this KB is
1863 transparent to the optimizer, and thus the KB can be changed with a
1864 more efficient implementation, or the KB could be disabled. */
1865
1866 void
1867 analyze_all_data_dependences (struct loops *loops)
1868 {
1869 unsigned int i;
1870 varray_type datarefs;
1871 varray_type dependence_relations;
1872 int nb_data_refs = 10;
1873
1874 VARRAY_GENERIC_PTR_INIT (datarefs, nb_data_refs, "datarefs");
1875 VARRAY_GENERIC_PTR_INIT (dependence_relations,
1876 nb_data_refs * nb_data_refs,
1877 "dependence_relations");
1878
1879 /* Compute DDs on the whole function. */
1880 compute_data_dependences_for_loop (loops->num, loops->parray[0],
1881 &datarefs, &dependence_relations);
1882
1883 if (dump_file)
1884 {
1885 dump_data_dependence_relations (dump_file, dependence_relations);
1886 fprintf (dump_file, "\n\n");
1887 }
1888
1889 /* Don't dump distances in order to avoid to update the
1890 testsuite. */
1891 if (dump_file && (dump_flags & TDF_DETAILS))
1892 {
1893 for (i = 0; i < VARRAY_ACTIVE_SIZE (dependence_relations); i++)
1894 {
1895 struct data_dependence_relation *ddr =
1896 (struct data_dependence_relation *)
1897 VARRAY_GENERIC_PTR (dependence_relations, i);
1898 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
1899 {
1900 fprintf (dump_file, "DISTANCE_V (");
1901 print_lambda_vector (dump_file, DDR_DIST_VECT (ddr), loops->num);
1902 fprintf (dump_file, ")\n");
1903 fprintf (dump_file, "DIRECTION_V (");
1904 print_lambda_vector (dump_file, DDR_DIR_VECT (ddr), loops->num);
1905 fprintf (dump_file, ")\n");
1906 }
1907 }
1908 fprintf (dump_file, "\n\n");
1909 }
1910
1911 if (dump_file && (dump_flags & TDF_STATS))
1912 {
1913 unsigned nb_top_relations = 0;
1914 unsigned nb_bot_relations = 0;
1915 unsigned nb_basename_differ = 0;
1916 unsigned nb_chrec_relations = 0;
1917
1918 for (i = 0; i < VARRAY_ACTIVE_SIZE (dependence_relations); i++)
1919 {
1920 struct data_dependence_relation *ddr;
1921 ddr = VARRAY_GENERIC_PTR (dependence_relations, i);
1922
1923 if (chrec_contains_undetermined (DDR_ARE_DEPENDENT (ddr)))
1924 nb_top_relations++;
1925
1926 else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
1927 {
1928 struct data_reference *a = DDR_A (ddr);
1929 struct data_reference *b = DDR_B (ddr);
1930 bool differ_p;
1931
1932 if (DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b)
1933 || (array_base_name_differ_p (a, b, &differ_p) && differ_p))
1934 nb_basename_differ++;
1935 else
1936 nb_bot_relations++;
1937 }
1938
1939 else
1940 nb_chrec_relations++;
1941 }
1942
1943 gather_stats_on_scev_database ();
1944 }
1945
1946 free_dependence_relations (dependence_relations);
1947 free_data_refs (datarefs);
1948 }
1949
1950 /* Free the memory used by a data dependence relation DDR. */
1951
1952 void
1953 free_dependence_relation (struct data_dependence_relation *ddr)
1954 {
1955 if (ddr == NULL)
1956 return;
1957
1958 if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_SUBSCRIPTS (ddr))
1959 varray_clear (DDR_SUBSCRIPTS (ddr));
1960 free (ddr);
1961 }
1962
1963 /* Free the memory used by the data dependence relations from
1964 DEPENDENCE_RELATIONS. */
1965
1966 void
1967 free_dependence_relations (varray_type dependence_relations)
1968 {
1969 unsigned int i;
1970 if (dependence_relations == NULL)
1971 return;
1972
1973 for (i = 0; i < VARRAY_ACTIVE_SIZE (dependence_relations); i++)
1974 free_dependence_relation (VARRAY_GENERIC_PTR (dependence_relations, i));
1975 varray_clear (dependence_relations);
1976 }
1977
1978 /* Free the memory used by the data references from DATAREFS. */
1979
1980 void
1981 free_data_refs (varray_type datarefs)
1982 {
1983 unsigned int i;
1984
1985 if (datarefs == NULL)
1986 return;
1987
1988 for (i = 0; i < VARRAY_ACTIVE_SIZE (datarefs); i++)
1989 {
1990 struct data_reference *dr = (struct data_reference *)
1991 VARRAY_GENERIC_PTR (datarefs, i);
1992 if (dr && DR_ACCESS_FNS (dr))
1993 varray_clear (DR_ACCESS_FNS (dr));
1994 }
1995 varray_clear (datarefs);
1996 }