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