OSDN Git Service

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