OSDN Git Service

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