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