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