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