Merge branch 'vendor/LIBRESSL'
[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           DR_UNCONSTRAINED_BASE (dr) = true;
1040           access_fns.safe_push (access_fn);
1041         }
1042     }
1043   else if (DECL_P (ref))
1044     {
1045       /* Canonicalize DR_BASE_OBJECT to MEM_REF form.  */
1046       ref = build2 (MEM_REF, TREE_TYPE (ref),
1047                     build_fold_addr_expr (ref),
1048                     build_int_cst (reference_alias_ptr_type (ref), 0));
1049     }
1050
1051   DR_BASE_OBJECT (dr) = ref;
1052   DR_ACCESS_FNS (dr) = access_fns;
1053 }
1054
1055 /* Extracts the alias analysis information from the memory reference DR.  */
1056
1057 static void
1058 dr_analyze_alias (struct data_reference *dr)
1059 {
1060   tree ref = DR_REF (dr);
1061   tree base = get_base_address (ref), addr;
1062
1063   if (INDIRECT_REF_P (base)
1064       || TREE_CODE (base) == MEM_REF)
1065     {
1066       addr = TREE_OPERAND (base, 0);
1067       if (TREE_CODE (addr) == SSA_NAME)
1068         DR_PTR_INFO (dr) = SSA_NAME_PTR_INFO (addr);
1069     }
1070 }
1071
1072 /* Frees data reference DR.  */
1073
1074 void
1075 free_data_ref (data_reference_p dr)
1076 {
1077   DR_ACCESS_FNS (dr).release ();
1078   free (dr);
1079 }
1080
1081 /* Analyzes memory reference MEMREF accessed in STMT.  The reference
1082    is read if IS_READ is true, write otherwise.  Returns the
1083    data_reference description of MEMREF.  NEST is the outermost loop
1084    in which the reference should be instantiated, LOOP is the loop in
1085    which the data reference should be analyzed.  */
1086
1087 struct data_reference *
1088 create_data_ref (loop_p nest, loop_p loop, tree memref, gimple stmt,
1089                  bool is_read)
1090 {
1091   struct data_reference *dr;
1092
1093   if (dump_file && (dump_flags & TDF_DETAILS))
1094     {
1095       fprintf (dump_file, "Creating dr for ");
1096       print_generic_expr (dump_file, memref, TDF_SLIM);
1097       fprintf (dump_file, "\n");
1098     }
1099
1100   dr = XCNEW (struct data_reference);
1101   DR_STMT (dr) = stmt;
1102   DR_REF (dr) = memref;
1103   DR_IS_READ (dr) = is_read;
1104
1105   dr_analyze_innermost (dr, nest);
1106   dr_analyze_indices (dr, nest, loop);
1107   dr_analyze_alias (dr);
1108
1109   if (dump_file && (dump_flags & TDF_DETAILS))
1110     {
1111       unsigned i;
1112       fprintf (dump_file, "\tbase_address: ");
1113       print_generic_expr (dump_file, DR_BASE_ADDRESS (dr), TDF_SLIM);
1114       fprintf (dump_file, "\n\toffset from base address: ");
1115       print_generic_expr (dump_file, DR_OFFSET (dr), TDF_SLIM);
1116       fprintf (dump_file, "\n\tconstant offset from base address: ");
1117       print_generic_expr (dump_file, DR_INIT (dr), TDF_SLIM);
1118       fprintf (dump_file, "\n\tstep: ");
1119       print_generic_expr (dump_file, DR_STEP (dr), TDF_SLIM);
1120       fprintf (dump_file, "\n\taligned to: ");
1121       print_generic_expr (dump_file, DR_ALIGNED_TO (dr), TDF_SLIM);
1122       fprintf (dump_file, "\n\tbase_object: ");
1123       print_generic_expr (dump_file, DR_BASE_OBJECT (dr), TDF_SLIM);
1124       fprintf (dump_file, "\n");
1125       for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
1126         {
1127           fprintf (dump_file, "\tAccess function %d: ", i);
1128           print_generic_stmt (dump_file, DR_ACCESS_FN (dr, i), TDF_SLIM);
1129         }
1130     }
1131
1132   return dr;
1133 }
1134
1135 /* Check if OFFSET1 and OFFSET2 (DR_OFFSETs of some data-refs) are identical
1136    expressions.  */
1137 static bool
1138 dr_equal_offsets_p1 (tree offset1, tree offset2)
1139 {
1140   bool res;
1141
1142   STRIP_NOPS (offset1);
1143   STRIP_NOPS (offset2);
1144
1145   if (offset1 == offset2)
1146     return true;
1147
1148   if (TREE_CODE (offset1) != TREE_CODE (offset2)
1149       || (!BINARY_CLASS_P (offset1) && !UNARY_CLASS_P (offset1)))
1150     return false;
1151
1152   res = dr_equal_offsets_p1 (TREE_OPERAND (offset1, 0),
1153                              TREE_OPERAND (offset2, 0));
1154
1155   if (!res || !BINARY_CLASS_P (offset1))
1156     return res;
1157
1158   res = dr_equal_offsets_p1 (TREE_OPERAND (offset1, 1),
1159                              TREE_OPERAND (offset2, 1));
1160
1161   return res;
1162 }
1163
1164 /* Check if DRA and DRB have equal offsets.  */
1165 bool
1166 dr_equal_offsets_p (struct data_reference *dra,
1167                     struct data_reference *drb)
1168 {
1169   tree offset1, offset2;
1170
1171   offset1 = DR_OFFSET (dra);
1172   offset2 = DR_OFFSET (drb);
1173
1174   return dr_equal_offsets_p1 (offset1, offset2);
1175 }
1176
1177 /* Returns true if FNA == FNB.  */
1178
1179 static bool
1180 affine_function_equal_p (affine_fn fna, affine_fn fnb)
1181 {
1182   unsigned i, n = fna.length ();
1183
1184   if (n != fnb.length ())
1185     return false;
1186
1187   for (i = 0; i < n; i++)
1188     if (!operand_equal_p (fna[i], fnb[i], 0))
1189       return false;
1190
1191   return true;
1192 }
1193
1194 /* If all the functions in CF are the same, returns one of them,
1195    otherwise returns NULL.  */
1196
1197 static affine_fn
1198 common_affine_function (conflict_function *cf)
1199 {
1200   unsigned i;
1201   affine_fn comm;
1202
1203   if (!CF_NONTRIVIAL_P (cf))
1204     return affine_fn ();
1205
1206   comm = cf->fns[0];
1207
1208   for (i = 1; i < cf->n; i++)
1209     if (!affine_function_equal_p (comm, cf->fns[i]))
1210       return affine_fn ();
1211
1212   return comm;
1213 }
1214
1215 /* Returns the base of the affine function FN.  */
1216
1217 static tree
1218 affine_function_base (affine_fn fn)
1219 {
1220   return fn[0];
1221 }
1222
1223 /* Returns true if FN is a constant.  */
1224
1225 static bool
1226 affine_function_constant_p (affine_fn fn)
1227 {
1228   unsigned i;
1229   tree coef;
1230
1231   for (i = 1; fn.iterate (i, &coef); i++)
1232     if (!integer_zerop (coef))
1233       return false;
1234
1235   return true;
1236 }
1237
1238 /* Returns true if FN is the zero constant function.  */
1239
1240 static bool
1241 affine_function_zero_p (affine_fn fn)
1242 {
1243   return (integer_zerop (affine_function_base (fn))
1244           && affine_function_constant_p (fn));
1245 }
1246
1247 /* Returns a signed integer type with the largest precision from TA
1248    and TB.  */
1249
1250 static tree
1251 signed_type_for_types (tree ta, tree tb)
1252 {
1253   if (TYPE_PRECISION (ta) > TYPE_PRECISION (tb))
1254     return signed_type_for (ta);
1255   else
1256     return signed_type_for (tb);
1257 }
1258
1259 /* Applies operation OP on affine functions FNA and FNB, and returns the
1260    result.  */
1261
1262 static affine_fn
1263 affine_fn_op (enum tree_code op, affine_fn fna, affine_fn fnb)
1264 {
1265   unsigned i, n, m;
1266   affine_fn ret;
1267   tree coef;
1268
1269   if (fnb.length () > fna.length ())
1270     {
1271       n = fna.length ();
1272       m = fnb.length ();
1273     }
1274   else
1275     {
1276       n = fnb.length ();
1277       m = fna.length ();
1278     }
1279
1280   ret.create (m);
1281   for (i = 0; i < n; i++)
1282     {
1283       tree type = signed_type_for_types (TREE_TYPE (fna[i]),
1284                                          TREE_TYPE (fnb[i]));
1285       ret.quick_push (fold_build2 (op, type, fna[i], fnb[i]));
1286     }
1287
1288   for (; fna.iterate (i, &coef); i++)
1289     ret.quick_push (fold_build2 (op, signed_type_for (TREE_TYPE (coef)),
1290                                  coef, integer_zero_node));
1291   for (; fnb.iterate (i, &coef); i++)
1292     ret.quick_push (fold_build2 (op, signed_type_for (TREE_TYPE (coef)),
1293                                  integer_zero_node, coef));
1294
1295   return ret;
1296 }
1297
1298 /* Returns the sum of affine functions FNA and FNB.  */
1299
1300 static affine_fn
1301 affine_fn_plus (affine_fn fna, affine_fn fnb)
1302 {
1303   return affine_fn_op (PLUS_EXPR, fna, fnb);
1304 }
1305
1306 /* Returns the difference of affine functions FNA and FNB.  */
1307
1308 static affine_fn
1309 affine_fn_minus (affine_fn fna, affine_fn fnb)
1310 {
1311   return affine_fn_op (MINUS_EXPR, fna, fnb);
1312 }
1313
1314 /* Frees affine function FN.  */
1315
1316 static void
1317 affine_fn_free (affine_fn fn)
1318 {
1319   fn.release ();
1320 }
1321
1322 /* Determine for each subscript in the data dependence relation DDR
1323    the distance.  */
1324
1325 static void
1326 compute_subscript_distance (struct data_dependence_relation *ddr)
1327 {
1328   conflict_function *cf_a, *cf_b;
1329   affine_fn fn_a, fn_b, diff;
1330
1331   if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
1332     {
1333       unsigned int i;
1334
1335       for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
1336         {
1337           struct subscript *subscript;
1338
1339           subscript = DDR_SUBSCRIPT (ddr, i);
1340           cf_a = SUB_CONFLICTS_IN_A (subscript);
1341           cf_b = SUB_CONFLICTS_IN_B (subscript);
1342
1343           fn_a = common_affine_function (cf_a);
1344           fn_b = common_affine_function (cf_b);
1345           if (!fn_a.exists () || !fn_b.exists ())
1346             {
1347               SUB_DISTANCE (subscript) = chrec_dont_know;
1348               return;
1349             }
1350           diff = affine_fn_minus (fn_a, fn_b);
1351
1352           if (affine_function_constant_p (diff))
1353             SUB_DISTANCE (subscript) = affine_function_base (diff);
1354           else
1355             SUB_DISTANCE (subscript) = chrec_dont_know;
1356
1357           affine_fn_free (diff);
1358         }
1359     }
1360 }
1361
1362 /* Returns the conflict function for "unknown".  */
1363
1364 static conflict_function *
1365 conflict_fn_not_known (void)
1366 {
1367   conflict_function *fn = XCNEW (conflict_function);
1368   fn->n = NOT_KNOWN;
1369
1370   return fn;
1371 }
1372
1373 /* Returns the conflict function for "independent".  */
1374
1375 static conflict_function *
1376 conflict_fn_no_dependence (void)
1377 {
1378   conflict_function *fn = XCNEW (conflict_function);
1379   fn->n = NO_DEPENDENCE;
1380
1381   return fn;
1382 }
1383
1384 /* Returns true if the address of OBJ is invariant in LOOP.  */
1385
1386 static bool
1387 object_address_invariant_in_loop_p (const struct loop *loop, const_tree obj)
1388 {
1389   while (handled_component_p (obj))
1390     {
1391       if (TREE_CODE (obj) == ARRAY_REF)
1392         {
1393           /* Index of the ARRAY_REF was zeroed in analyze_indices, thus we only
1394              need to check the stride and the lower bound of the reference.  */
1395           if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (obj, 2),
1396                                                       loop->num)
1397               || chrec_contains_symbols_defined_in_loop (TREE_OPERAND (obj, 3),
1398                                                          loop->num))
1399             return false;
1400         }
1401       else if (TREE_CODE (obj) == COMPONENT_REF)
1402         {
1403           if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (obj, 2),
1404                                                       loop->num))
1405             return false;
1406         }
1407       obj = TREE_OPERAND (obj, 0);
1408     }
1409
1410   if (!INDIRECT_REF_P (obj)
1411       && TREE_CODE (obj) != MEM_REF)
1412     return true;
1413
1414   return !chrec_contains_symbols_defined_in_loop (TREE_OPERAND (obj, 0),
1415                                                   loop->num);
1416 }
1417
1418 /* Returns false if we can prove that data references A and B do not alias,
1419    true otherwise.  If LOOP_NEST is false no cross-iteration aliases are
1420    considered.  */
1421
1422 bool
1423 dr_may_alias_p (const struct data_reference *a, const struct data_reference *b,
1424                 bool loop_nest)
1425 {
1426   tree addr_a = DR_BASE_OBJECT (a);
1427   tree addr_b = DR_BASE_OBJECT (b);
1428
1429   /* If we are not processing a loop nest but scalar code we
1430      do not need to care about possible cross-iteration dependences
1431      and thus can process the full original reference.  Do so,
1432      similar to how loop invariant motion applies extra offset-based
1433      disambiguation.  */
1434   if (!loop_nest)
1435     {
1436       aff_tree off1, off2;
1437       widest_int size1, size2;
1438       get_inner_reference_aff (DR_REF (a), &off1, &size1);
1439       get_inner_reference_aff (DR_REF (b), &off2, &size2);
1440       aff_combination_scale (&off1, -1);
1441       aff_combination_add (&off2, &off1);
1442       if (aff_comb_cannot_overlap_p (&off2, size1, size2))
1443         return false;
1444     }
1445
1446   if ((TREE_CODE (addr_a) == MEM_REF || TREE_CODE (addr_a) == TARGET_MEM_REF)
1447       && (TREE_CODE (addr_b) == MEM_REF || TREE_CODE (addr_b) == TARGET_MEM_REF)
1448       && MR_DEPENDENCE_CLIQUE (addr_a) == MR_DEPENDENCE_CLIQUE (addr_b)
1449       && MR_DEPENDENCE_BASE (addr_a) != MR_DEPENDENCE_BASE (addr_b))
1450     return false;
1451
1452   /* If we had an evolution in a pointer-based MEM_REF BASE_OBJECT we
1453      do not know the size of the base-object.  So we cannot do any
1454      offset/overlap based analysis but have to rely on points-to
1455      information only.  */
1456   if (TREE_CODE (addr_a) == MEM_REF
1457       && (DR_UNCONSTRAINED_BASE (a)
1458           || TREE_CODE (TREE_OPERAND (addr_a, 0)) == SSA_NAME))
1459     {
1460       /* For true dependences we can apply TBAA.  */
1461       if (flag_strict_aliasing
1462           && DR_IS_WRITE (a) && DR_IS_READ (b)
1463           && !alias_sets_conflict_p (get_alias_set (DR_REF (a)),
1464                                      get_alias_set (DR_REF (b))))
1465         return false;
1466       if (TREE_CODE (addr_b) == MEM_REF)
1467         return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
1468                                        TREE_OPERAND (addr_b, 0));
1469       else
1470         return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
1471                                        build_fold_addr_expr (addr_b));
1472     }
1473   else if (TREE_CODE (addr_b) == MEM_REF
1474            && (DR_UNCONSTRAINED_BASE (b)
1475                || TREE_CODE (TREE_OPERAND (addr_b, 0)) == SSA_NAME))
1476     {
1477       /* For true dependences we can apply TBAA.  */
1478       if (flag_strict_aliasing
1479           && DR_IS_WRITE (a) && DR_IS_READ (b)
1480           && !alias_sets_conflict_p (get_alias_set (DR_REF (a)),
1481                                      get_alias_set (DR_REF (b))))
1482         return false;
1483       if (TREE_CODE (addr_a) == MEM_REF)
1484         return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
1485                                        TREE_OPERAND (addr_b, 0));
1486       else
1487         return ptr_derefs_may_alias_p (build_fold_addr_expr (addr_a),
1488                                        TREE_OPERAND (addr_b, 0));
1489     }
1490
1491   /* Otherwise DR_BASE_OBJECT is an access that covers the whole object
1492      that is being subsetted in the loop nest.  */
1493   if (DR_IS_WRITE (a) && DR_IS_WRITE (b))
1494     return refs_output_dependent_p (addr_a, addr_b);
1495   else if (DR_IS_READ (a) && DR_IS_WRITE (b))
1496     return refs_anti_dependent_p (addr_a, addr_b);
1497   return refs_may_alias_p (addr_a, addr_b);
1498 }
1499
1500 /* Initialize a data dependence relation between data accesses A and
1501    B.  NB_LOOPS is the number of loops surrounding the references: the
1502    size of the classic distance/direction vectors.  */
1503
1504 struct data_dependence_relation *
1505 initialize_data_dependence_relation (struct data_reference *a,
1506                                      struct data_reference *b,
1507                                      vec<loop_p> loop_nest)
1508 {
1509   struct data_dependence_relation *res;
1510   unsigned int i;
1511
1512   res = XNEW (struct data_dependence_relation);
1513   DDR_A (res) = a;
1514   DDR_B (res) = b;
1515   DDR_LOOP_NEST (res).create (0);
1516   DDR_REVERSED_P (res) = false;
1517   DDR_SUBSCRIPTS (res).create (0);
1518   DDR_DIR_VECTS (res).create (0);
1519   DDR_DIST_VECTS (res).create (0);
1520
1521   if (a == NULL || b == NULL)
1522     {
1523       DDR_ARE_DEPENDENT (res) = chrec_dont_know;
1524       return res;
1525     }
1526
1527   /* If the data references do not alias, then they are independent.  */
1528   if (!dr_may_alias_p (a, b, loop_nest.exists ()))
1529     {
1530       DDR_ARE_DEPENDENT (res) = chrec_known;
1531       return res;
1532     }
1533
1534   /* The case where the references are exactly the same.  */
1535   if (operand_equal_p (DR_REF (a), DR_REF (b), 0))
1536     {
1537       if ((loop_nest.exists ()
1538            && !object_address_invariant_in_loop_p (loop_nest[0],
1539                                                    DR_BASE_OBJECT (a)))
1540           || DR_NUM_DIMENSIONS (a) == 0)
1541         {
1542           DDR_ARE_DEPENDENT (res) = chrec_dont_know;
1543           return res;
1544         }
1545       DDR_AFFINE_P (res) = true;
1546       DDR_ARE_DEPENDENT (res) = NULL_TREE;
1547       DDR_SUBSCRIPTS (res).create (DR_NUM_DIMENSIONS (a));
1548       DDR_LOOP_NEST (res) = loop_nest;
1549       DDR_INNER_LOOP (res) = 0;
1550       DDR_SELF_REFERENCE (res) = true;
1551       for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)
1552        {
1553          struct subscript *subscript;
1554
1555          subscript = XNEW (struct subscript);
1556          SUB_CONFLICTS_IN_A (subscript) = conflict_fn_not_known ();
1557          SUB_CONFLICTS_IN_B (subscript) = conflict_fn_not_known ();
1558          SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
1559          SUB_DISTANCE (subscript) = chrec_dont_know;
1560          DDR_SUBSCRIPTS (res).safe_push (subscript);
1561        }
1562       return res;
1563     }
1564
1565   /* If the references do not access the same object, we do not know
1566      whether they alias or not.  */
1567   if (!operand_equal_p (DR_BASE_OBJECT (a), DR_BASE_OBJECT (b), 0))
1568     {
1569       DDR_ARE_DEPENDENT (res) = chrec_dont_know;
1570       return res;
1571     }
1572
1573   /* If the base of the object is not invariant in the loop nest, we cannot
1574      analyze it.  TODO -- in fact, it would suffice to record that there may
1575      be arbitrary dependences in the loops where the base object varies.  */
1576   if ((loop_nest.exists ()
1577        && !object_address_invariant_in_loop_p (loop_nest[0], DR_BASE_OBJECT (a)))
1578       || DR_NUM_DIMENSIONS (a) == 0)
1579     {
1580       DDR_ARE_DEPENDENT (res) = chrec_dont_know;
1581       return res;
1582     }
1583
1584   /* If the number of dimensions of the access to not agree we can have
1585      a pointer access to a component of the array element type and an
1586      array access while the base-objects are still the same.  Punt.  */
1587   if (DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b))
1588     {
1589       DDR_ARE_DEPENDENT (res) = chrec_dont_know;
1590       return res;
1591     }
1592
1593   DDR_AFFINE_P (res) = true;
1594   DDR_ARE_DEPENDENT (res) = NULL_TREE;
1595   DDR_SUBSCRIPTS (res).create (DR_NUM_DIMENSIONS (a));
1596   DDR_LOOP_NEST (res) = loop_nest;
1597   DDR_INNER_LOOP (res) = 0;
1598   DDR_SELF_REFERENCE (res) = false;
1599
1600   for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)
1601     {
1602       struct subscript *subscript;
1603
1604       subscript = XNEW (struct subscript);
1605       SUB_CONFLICTS_IN_A (subscript) = conflict_fn_not_known ();
1606       SUB_CONFLICTS_IN_B (subscript) = conflict_fn_not_known ();
1607       SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
1608       SUB_DISTANCE (subscript) = chrec_dont_know;
1609       DDR_SUBSCRIPTS (res).safe_push (subscript);
1610     }
1611
1612   return res;
1613 }
1614
1615 /* Frees memory used by the conflict function F.  */
1616
1617 static void
1618 free_conflict_function (conflict_function *f)
1619 {
1620   unsigned i;
1621
1622   if (CF_NONTRIVIAL_P (f))
1623     {
1624       for (i = 0; i < f->n; i++)
1625         affine_fn_free (f->fns[i]);
1626     }
1627   free (f);
1628 }
1629
1630 /* Frees memory used by SUBSCRIPTS.  */
1631
1632 static void
1633 free_subscripts (vec<subscript_p> subscripts)
1634 {
1635   unsigned i;
1636   subscript_p s;
1637
1638   FOR_EACH_VEC_ELT (subscripts, i, s)
1639     {
1640       free_conflict_function (s->conflicting_iterations_in_a);
1641       free_conflict_function (s->conflicting_iterations_in_b);
1642       free (s);
1643     }
1644   subscripts.release ();
1645 }
1646
1647 /* Set DDR_ARE_DEPENDENT to CHREC and finalize the subscript overlap
1648    description.  */
1649
1650 static inline void
1651 finalize_ddr_dependent (struct data_dependence_relation *ddr,
1652                         tree chrec)
1653 {
1654   DDR_ARE_DEPENDENT (ddr) = chrec;
1655   free_subscripts (DDR_SUBSCRIPTS (ddr));
1656   DDR_SUBSCRIPTS (ddr).create (0);
1657 }
1658
1659 /* The dependence relation DDR cannot be represented by a distance
1660    vector.  */
1661
1662 static inline void
1663 non_affine_dependence_relation (struct data_dependence_relation *ddr)
1664 {
1665   if (dump_file && (dump_flags & TDF_DETAILS))
1666     fprintf (dump_file, "(Dependence relation cannot be represented by distance vector.) \n");
1667
1668   DDR_AFFINE_P (ddr) = false;
1669 }
1670
1671 \f
1672
1673 /* This section contains the classic Banerjee tests.  */
1674
1675 /* Returns true iff CHREC_A and CHREC_B are not dependent on any index
1676    variables, i.e., if the ZIV (Zero Index Variable) test is true.  */
1677
1678 static inline bool
1679 ziv_subscript_p (const_tree chrec_a, const_tree chrec_b)
1680 {
1681   return (evolution_function_is_constant_p (chrec_a)
1682           && evolution_function_is_constant_p (chrec_b));
1683 }
1684
1685 /* Returns true iff CHREC_A and CHREC_B are dependent on an index
1686    variable, i.e., if the SIV (Single Index Variable) test is true.  */
1687
1688 static bool
1689 siv_subscript_p (const_tree chrec_a, const_tree chrec_b)
1690 {
1691   if ((evolution_function_is_constant_p (chrec_a)
1692        && evolution_function_is_univariate_p (chrec_b))
1693       || (evolution_function_is_constant_p (chrec_b)
1694           && evolution_function_is_univariate_p (chrec_a)))
1695     return true;
1696
1697   if (evolution_function_is_univariate_p (chrec_a)
1698       && evolution_function_is_univariate_p (chrec_b))
1699     {
1700       switch (TREE_CODE (chrec_a))
1701         {
1702         case POLYNOMIAL_CHREC:
1703           switch (TREE_CODE (chrec_b))
1704             {
1705             case POLYNOMIAL_CHREC:
1706               if (CHREC_VARIABLE (chrec_a) != CHREC_VARIABLE (chrec_b))
1707                 return false;
1708
1709             default:
1710               return true;
1711             }
1712
1713         default:
1714           return true;
1715         }
1716     }
1717
1718   return false;
1719 }
1720
1721 /* Creates a conflict function with N dimensions.  The affine functions
1722    in each dimension follow.  */
1723
1724 static conflict_function *
1725 conflict_fn (unsigned n, ...)
1726 {
1727   unsigned i;
1728   conflict_function *ret = XCNEW (conflict_function);
1729   va_list ap;
1730
1731   gcc_assert (0 < n && n <= MAX_DIM);
1732   va_start (ap, n);
1733
1734   ret->n = n;
1735   for (i = 0; i < n; i++)
1736     ret->fns[i] = va_arg (ap, affine_fn);
1737   va_end (ap);
1738
1739   return ret;
1740 }
1741
1742 /* Returns constant affine function with value CST.  */
1743
1744 static affine_fn
1745 affine_fn_cst (tree cst)
1746 {
1747   affine_fn fn;
1748   fn.create (1);
1749   fn.quick_push (cst);
1750   return fn;
1751 }
1752
1753 /* Returns affine function with single variable, CST + COEF * x_DIM.  */
1754
1755 static affine_fn
1756 affine_fn_univar (tree cst, unsigned dim, tree coef)
1757 {
1758   affine_fn fn;
1759   fn.create (dim + 1);
1760   unsigned i;
1761
1762   gcc_assert (dim > 0);
1763   fn.quick_push (cst);
1764   for (i = 1; i < dim; i++)
1765     fn.quick_push (integer_zero_node);
1766   fn.quick_push (coef);
1767   return fn;
1768 }
1769
1770 /* Analyze a ZIV (Zero Index Variable) subscript.  *OVERLAPS_A and
1771    *OVERLAPS_B are initialized to the functions that describe the
1772    relation between the elements accessed twice by CHREC_A and
1773    CHREC_B.  For k >= 0, the following property is verified:
1774
1775    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
1776
1777 static void
1778 analyze_ziv_subscript (tree chrec_a,
1779                        tree chrec_b,
1780                        conflict_function **overlaps_a,
1781                        conflict_function **overlaps_b,
1782                        tree *last_conflicts)
1783 {
1784   tree type, difference;
1785   dependence_stats.num_ziv++;
1786
1787   if (dump_file && (dump_flags & TDF_DETAILS))
1788     fprintf (dump_file, "(analyze_ziv_subscript \n");
1789
1790   type = signed_type_for_types (TREE_TYPE (chrec_a), TREE_TYPE (chrec_b));
1791   chrec_a = chrec_convert (type, chrec_a, NULL);
1792   chrec_b = chrec_convert (type, chrec_b, NULL);
1793   difference = chrec_fold_minus (type, chrec_a, chrec_b);
1794
1795   switch (TREE_CODE (difference))
1796     {
1797     case INTEGER_CST:
1798       if (integer_zerop (difference))
1799         {
1800           /* The difference is equal to zero: the accessed index
1801              overlaps for each iteration in the loop.  */
1802           *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
1803           *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
1804           *last_conflicts = chrec_dont_know;
1805           dependence_stats.num_ziv_dependent++;
1806         }
1807       else
1808         {
1809           /* The accesses do not overlap.  */
1810           *overlaps_a = conflict_fn_no_dependence ();
1811           *overlaps_b = conflict_fn_no_dependence ();
1812           *last_conflicts = integer_zero_node;
1813           dependence_stats.num_ziv_independent++;
1814         }
1815       break;
1816
1817     default:
1818       /* We're not sure whether the indexes overlap.  For the moment,
1819          conservatively answer "don't know".  */
1820       if (dump_file && (dump_flags & TDF_DETAILS))
1821         fprintf (dump_file, "ziv test failed: difference is non-integer.\n");
1822
1823       *overlaps_a = conflict_fn_not_known ();
1824       *overlaps_b = conflict_fn_not_known ();
1825       *last_conflicts = chrec_dont_know;
1826       dependence_stats.num_ziv_unimplemented++;
1827       break;
1828     }
1829
1830   if (dump_file && (dump_flags & TDF_DETAILS))
1831     fprintf (dump_file, ")\n");
1832 }
1833
1834 /* Similar to max_stmt_executions_int, but returns the bound as a tree,
1835    and only if it fits to the int type.  If this is not the case, or the
1836    bound  on the number of iterations of LOOP could not be derived, returns
1837    chrec_dont_know.  */
1838
1839 static tree
1840 max_stmt_executions_tree (struct loop *loop)
1841 {
1842   widest_int nit;
1843
1844   if (!max_stmt_executions (loop, &nit))
1845     return chrec_dont_know;
1846
1847   if (!wi::fits_to_tree_p (nit, unsigned_type_node))
1848     return chrec_dont_know;
1849
1850   return wide_int_to_tree (unsigned_type_node, nit);
1851 }
1852
1853 /* Determine whether the CHREC is always positive/negative.  If the expression
1854    cannot be statically analyzed, return false, otherwise set the answer into
1855    VALUE.  */
1856
1857 static bool
1858 chrec_is_positive (tree chrec, bool *value)
1859 {
1860   bool value0, value1, value2;
1861   tree end_value, nb_iter;
1862
1863   switch (TREE_CODE (chrec))
1864     {
1865     case POLYNOMIAL_CHREC:
1866       if (!chrec_is_positive (CHREC_LEFT (chrec), &value0)
1867           || !chrec_is_positive (CHREC_RIGHT (chrec), &value1))
1868         return false;
1869
1870       /* FIXME -- overflows.  */
1871       if (value0 == value1)
1872         {
1873           *value = value0;
1874           return true;
1875         }
1876
1877       /* Otherwise the chrec is under the form: "{-197, +, 2}_1",
1878          and the proof consists in showing that the sign never
1879          changes during the execution of the loop, from 0 to
1880          loop->nb_iterations.  */
1881       if (!evolution_function_is_affine_p (chrec))
1882         return false;
1883
1884       nb_iter = number_of_latch_executions (get_chrec_loop (chrec));
1885       if (chrec_contains_undetermined (nb_iter))
1886         return false;
1887
1888 #if 0
1889       /* TODO -- If the test is after the exit, we may decrease the number of
1890          iterations by one.  */
1891       if (after_exit)
1892         nb_iter = chrec_fold_minus (type, nb_iter, build_int_cst (type, 1));
1893 #endif
1894
1895       end_value = chrec_apply (CHREC_VARIABLE (chrec), chrec, nb_iter);
1896
1897       if (!chrec_is_positive (end_value, &value2))
1898         return false;
1899
1900       *value = value0;
1901       return value0 == value1;
1902
1903     case INTEGER_CST:
1904       switch (tree_int_cst_sgn (chrec))
1905         {
1906         case -1:
1907           *value = false;
1908           break;
1909         case 1:
1910           *value = true;
1911           break;
1912         default:
1913           return false;
1914         }
1915       return true;
1916
1917     default:
1918       return false;
1919     }
1920 }
1921
1922
1923 /* Analyze a SIV (Single Index Variable) subscript where CHREC_A is a
1924    constant, and CHREC_B is an affine function.  *OVERLAPS_A and
1925    *OVERLAPS_B are initialized to the functions that describe the
1926    relation between the elements accessed twice by CHREC_A and
1927    CHREC_B.  For k >= 0, the following property is verified:
1928
1929    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
1930
1931 static void
1932 analyze_siv_subscript_cst_affine (tree chrec_a,
1933                                   tree chrec_b,
1934                                   conflict_function **overlaps_a,
1935                                   conflict_function **overlaps_b,
1936                                   tree *last_conflicts)
1937 {
1938   bool value0, value1, value2;
1939   tree type, difference, tmp;
1940
1941   type = signed_type_for_types (TREE_TYPE (chrec_a), TREE_TYPE (chrec_b));
1942   chrec_a = chrec_convert (type, chrec_a, NULL);
1943   chrec_b = chrec_convert (type, chrec_b, NULL);
1944   difference = chrec_fold_minus (type, initial_condition (chrec_b), chrec_a);
1945
1946   /* Special case overlap in the first iteration.  */
1947   if (integer_zerop (difference))
1948     {
1949       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
1950       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
1951       *last_conflicts = integer_one_node;
1952       return;
1953     }
1954
1955   if (!chrec_is_positive (initial_condition (difference), &value0))
1956     {
1957       if (dump_file && (dump_flags & TDF_DETAILS))
1958         fprintf (dump_file, "siv test failed: chrec is not positive.\n");
1959
1960       dependence_stats.num_siv_unimplemented++;
1961       *overlaps_a = conflict_fn_not_known ();
1962       *overlaps_b = conflict_fn_not_known ();
1963       *last_conflicts = chrec_dont_know;
1964       return;
1965     }
1966   else
1967     {
1968       if (value0 == false)
1969         {
1970           if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value1))
1971             {
1972               if (dump_file && (dump_flags & TDF_DETAILS))
1973                 fprintf (dump_file, "siv test failed: chrec not positive.\n");
1974
1975               *overlaps_a = conflict_fn_not_known ();
1976               *overlaps_b = conflict_fn_not_known ();
1977               *last_conflicts = chrec_dont_know;
1978               dependence_stats.num_siv_unimplemented++;
1979               return;
1980             }
1981           else
1982             {
1983               if (value1 == true)
1984                 {
1985                   /* Example:
1986                      chrec_a = 12
1987                      chrec_b = {10, +, 1}
1988                   */
1989
1990                   if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
1991                     {
1992                       HOST_WIDE_INT numiter;
1993                       struct loop *loop = get_chrec_loop (chrec_b);
1994
1995                       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
1996                       tmp = fold_build2 (EXACT_DIV_EXPR, type,
1997                                          fold_build1 (ABS_EXPR, type, difference),
1998                                          CHREC_RIGHT (chrec_b));
1999                       *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
2000                       *last_conflicts = integer_one_node;
2001
2002
2003                       /* Perform weak-zero siv test to see if overlap is
2004                          outside the loop bounds.  */
2005                       numiter = max_stmt_executions_int (loop);
2006
2007                       if (numiter >= 0
2008                           && compare_tree_int (tmp, numiter) > 0)
2009                         {
2010                           free_conflict_function (*overlaps_a);
2011                           free_conflict_function (*overlaps_b);
2012                           *overlaps_a = conflict_fn_no_dependence ();
2013                           *overlaps_b = conflict_fn_no_dependence ();
2014                           *last_conflicts = integer_zero_node;
2015                           dependence_stats.num_siv_independent++;
2016                           return;
2017                         }
2018                       dependence_stats.num_siv_dependent++;
2019                       return;
2020                     }
2021
2022                   /* When the step does not divide the difference, there are
2023                      no overlaps.  */
2024                   else
2025                     {
2026                       *overlaps_a = conflict_fn_no_dependence ();
2027                       *overlaps_b = conflict_fn_no_dependence ();
2028                       *last_conflicts = integer_zero_node;
2029                       dependence_stats.num_siv_independent++;
2030                       return;
2031                     }
2032                 }
2033
2034               else
2035                 {
2036                   /* Example:
2037                      chrec_a = 12
2038                      chrec_b = {10, +, -1}
2039
2040                      In this case, chrec_a will not overlap with chrec_b.  */
2041                   *overlaps_a = conflict_fn_no_dependence ();
2042                   *overlaps_b = conflict_fn_no_dependence ();
2043                   *last_conflicts = integer_zero_node;
2044                   dependence_stats.num_siv_independent++;
2045                   return;
2046                 }
2047             }
2048         }
2049       else
2050         {
2051           if (!chrec_is_positive (CHREC_RIGHT (chrec_b), &value2))
2052             {
2053               if (dump_file && (dump_flags & TDF_DETAILS))
2054                 fprintf (dump_file, "siv test failed: chrec not positive.\n");
2055
2056               *overlaps_a = conflict_fn_not_known ();
2057               *overlaps_b = conflict_fn_not_known ();
2058               *last_conflicts = chrec_dont_know;
2059               dependence_stats.num_siv_unimplemented++;
2060               return;
2061             }
2062           else
2063             {
2064               if (value2 == false)
2065                 {
2066                   /* Example:
2067                      chrec_a = 3
2068                      chrec_b = {10, +, -1}
2069                   */
2070                   if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
2071                     {
2072                       HOST_WIDE_INT numiter;
2073                       struct loop *loop = get_chrec_loop (chrec_b);
2074
2075                       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2076                       tmp = fold_build2 (EXACT_DIV_EXPR, type, difference,
2077                                          CHREC_RIGHT (chrec_b));
2078                       *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
2079                       *last_conflicts = integer_one_node;
2080
2081                       /* Perform weak-zero siv test to see if overlap is
2082                          outside the loop bounds.  */
2083                       numiter = max_stmt_executions_int (loop);
2084
2085                       if (numiter >= 0
2086                           && compare_tree_int (tmp, numiter) > 0)
2087                         {
2088                           free_conflict_function (*overlaps_a);
2089                           free_conflict_function (*overlaps_b);
2090                           *overlaps_a = conflict_fn_no_dependence ();
2091                           *overlaps_b = conflict_fn_no_dependence ();
2092                           *last_conflicts = integer_zero_node;
2093                           dependence_stats.num_siv_independent++;
2094                           return;
2095                         }
2096                       dependence_stats.num_siv_dependent++;
2097                       return;
2098                     }
2099
2100                   /* When the step does not divide the difference, there
2101                      are no overlaps.  */
2102                   else
2103                     {
2104                       *overlaps_a = conflict_fn_no_dependence ();
2105                       *overlaps_b = conflict_fn_no_dependence ();
2106                       *last_conflicts = integer_zero_node;
2107                       dependence_stats.num_siv_independent++;
2108                       return;
2109                     }
2110                 }
2111               else
2112                 {
2113                   /* Example:
2114                      chrec_a = 3
2115                      chrec_b = {4, +, 1}
2116
2117                      In this case, chrec_a will not overlap with chrec_b.  */
2118                   *overlaps_a = conflict_fn_no_dependence ();
2119                   *overlaps_b = conflict_fn_no_dependence ();
2120                   *last_conflicts = integer_zero_node;
2121                   dependence_stats.num_siv_independent++;
2122                   return;
2123                 }
2124             }
2125         }
2126     }
2127 }
2128
2129 /* Helper recursive function for initializing the matrix A.  Returns
2130    the initial value of CHREC.  */
2131
2132 static tree
2133 initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult)
2134 {
2135   gcc_assert (chrec);
2136
2137   switch (TREE_CODE (chrec))
2138     {
2139     case POLYNOMIAL_CHREC:
2140       gcc_assert (TREE_CODE (CHREC_RIGHT (chrec)) == INTEGER_CST);
2141
2142       A[index][0] = mult * int_cst_value (CHREC_RIGHT (chrec));
2143       return initialize_matrix_A (A, CHREC_LEFT (chrec), index + 1, mult);
2144
2145     case PLUS_EXPR:
2146     case MULT_EXPR:
2147     case MINUS_EXPR:
2148       {
2149         tree op0 = initialize_matrix_A (A, TREE_OPERAND (chrec, 0), index, mult);
2150         tree op1 = initialize_matrix_A (A, TREE_OPERAND (chrec, 1), index, mult);
2151
2152         return chrec_fold_op (TREE_CODE (chrec), chrec_type (chrec), op0, op1);
2153       }
2154
2155     CASE_CONVERT:
2156       {
2157         tree op = initialize_matrix_A (A, TREE_OPERAND (chrec, 0), index, mult);
2158         return chrec_convert (chrec_type (chrec), op, NULL);
2159       }
2160
2161     case BIT_NOT_EXPR:
2162       {
2163         /* Handle ~X as -1 - X.  */
2164         tree op = initialize_matrix_A (A, TREE_OPERAND (chrec, 0), index, mult);
2165         return chrec_fold_op (MINUS_EXPR, chrec_type (chrec),
2166                               build_int_cst (TREE_TYPE (chrec), -1), op);
2167       }
2168
2169     case INTEGER_CST:
2170       return chrec;
2171
2172     default:
2173       gcc_unreachable ();
2174       return NULL_TREE;
2175     }
2176 }
2177
2178 #define FLOOR_DIV(x,y) ((x) / (y))
2179
2180 /* Solves the special case of the Diophantine equation:
2181    | {0, +, STEP_A}_x (OVERLAPS_A) = {0, +, STEP_B}_y (OVERLAPS_B)
2182
2183    Computes the descriptions OVERLAPS_A and OVERLAPS_B.  NITER is the
2184    number of iterations that loops X and Y run.  The overlaps will be
2185    constructed as evolutions in dimension DIM.  */
2186
2187 static void
2188 compute_overlap_steps_for_affine_univar (int niter, int step_a, int step_b,
2189                                          affine_fn *overlaps_a,
2190                                          affine_fn *overlaps_b,
2191                                          tree *last_conflicts, int dim)
2192 {
2193   if (((step_a > 0 && step_b > 0)
2194        || (step_a < 0 && step_b < 0)))
2195     {
2196       int step_overlaps_a, step_overlaps_b;
2197       int gcd_steps_a_b, last_conflict, tau2;
2198
2199       gcd_steps_a_b = gcd (step_a, step_b);
2200       step_overlaps_a = step_b / gcd_steps_a_b;
2201       step_overlaps_b = step_a / gcd_steps_a_b;
2202
2203       if (niter > 0)
2204         {
2205           tau2 = FLOOR_DIV (niter, step_overlaps_a);
2206           tau2 = MIN (tau2, FLOOR_DIV (niter, step_overlaps_b));
2207           last_conflict = tau2;
2208           *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
2209         }
2210       else
2211         *last_conflicts = chrec_dont_know;
2212
2213       *overlaps_a = affine_fn_univar (integer_zero_node, dim,
2214                                       build_int_cst (NULL_TREE,
2215                                                      step_overlaps_a));
2216       *overlaps_b = affine_fn_univar (integer_zero_node, dim,
2217                                       build_int_cst (NULL_TREE,
2218                                                      step_overlaps_b));
2219     }
2220
2221   else
2222     {
2223       *overlaps_a = affine_fn_cst (integer_zero_node);
2224       *overlaps_b = affine_fn_cst (integer_zero_node);
2225       *last_conflicts = integer_zero_node;
2226     }
2227 }
2228
2229 /* Solves the special case of a Diophantine equation where CHREC_A is
2230    an affine bivariate function, and CHREC_B is an affine univariate
2231    function.  For example,
2232
2233    | {{0, +, 1}_x, +, 1335}_y = {0, +, 1336}_z
2234
2235    has the following overlapping functions:
2236
2237    | x (t, u, v) = {{0, +, 1336}_t, +, 1}_v
2238    | y (t, u, v) = {{0, +, 1336}_u, +, 1}_v
2239    | z (t, u, v) = {{{0, +, 1}_t, +, 1335}_u, +, 1}_v
2240
2241    FORNOW: This is a specialized implementation for a case occurring in
2242    a common benchmark.  Implement the general algorithm.  */
2243
2244 static void
2245 compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b,
2246                                       conflict_function **overlaps_a,
2247                                       conflict_function **overlaps_b,
2248                                       tree *last_conflicts)
2249 {
2250   bool xz_p, yz_p, xyz_p;
2251   int step_x, step_y, step_z;
2252   HOST_WIDE_INT niter_x, niter_y, niter_z, niter;
2253   affine_fn overlaps_a_xz, overlaps_b_xz;
2254   affine_fn overlaps_a_yz, overlaps_b_yz;
2255   affine_fn overlaps_a_xyz, overlaps_b_xyz;
2256   affine_fn ova1, ova2, ovb;
2257   tree last_conflicts_xz, last_conflicts_yz, last_conflicts_xyz;
2258
2259   step_x = int_cst_value (CHREC_RIGHT (CHREC_LEFT (chrec_a)));
2260   step_y = int_cst_value (CHREC_RIGHT (chrec_a));
2261   step_z = int_cst_value (CHREC_RIGHT (chrec_b));
2262
2263   niter_x = max_stmt_executions_int (get_chrec_loop (CHREC_LEFT (chrec_a)));
2264   niter_y = max_stmt_executions_int (get_chrec_loop (chrec_a));
2265   niter_z = max_stmt_executions_int (get_chrec_loop (chrec_b));
2266
2267   if (niter_x < 0 || niter_y < 0 || niter_z < 0)
2268     {
2269       if (dump_file && (dump_flags & TDF_DETAILS))
2270         fprintf (dump_file, "overlap steps test failed: no iteration counts.\n");
2271
2272       *overlaps_a = conflict_fn_not_known ();
2273       *overlaps_b = conflict_fn_not_known ();
2274       *last_conflicts = chrec_dont_know;
2275       return;
2276     }
2277
2278   niter = MIN (niter_x, niter_z);
2279   compute_overlap_steps_for_affine_univar (niter, step_x, step_z,
2280                                            &overlaps_a_xz,
2281                                            &overlaps_b_xz,
2282                                            &last_conflicts_xz, 1);
2283   niter = MIN (niter_y, niter_z);
2284   compute_overlap_steps_for_affine_univar (niter, step_y, step_z,
2285                                            &overlaps_a_yz,
2286                                            &overlaps_b_yz,
2287                                            &last_conflicts_yz, 2);
2288   niter = MIN (niter_x, niter_z);
2289   niter = MIN (niter_y, niter);
2290   compute_overlap_steps_for_affine_univar (niter, step_x + step_y, step_z,
2291                                            &overlaps_a_xyz,
2292                                            &overlaps_b_xyz,
2293                                            &last_conflicts_xyz, 3);
2294
2295   xz_p = !integer_zerop (last_conflicts_xz);
2296   yz_p = !integer_zerop (last_conflicts_yz);
2297   xyz_p = !integer_zerop (last_conflicts_xyz);
2298
2299   if (xz_p || yz_p || xyz_p)
2300     {
2301       ova1 = affine_fn_cst (integer_zero_node);
2302       ova2 = affine_fn_cst (integer_zero_node);
2303       ovb = affine_fn_cst (integer_zero_node);
2304       if (xz_p)
2305         {
2306           affine_fn t0 = ova1;
2307           affine_fn t2 = ovb;
2308
2309           ova1 = affine_fn_plus (ova1, overlaps_a_xz);
2310           ovb = affine_fn_plus (ovb, overlaps_b_xz);
2311           affine_fn_free (t0);
2312           affine_fn_free (t2);
2313           *last_conflicts = last_conflicts_xz;
2314         }
2315       if (yz_p)
2316         {
2317           affine_fn t0 = ova2;
2318           affine_fn t2 = ovb;
2319
2320           ova2 = affine_fn_plus (ova2, overlaps_a_yz);
2321           ovb = affine_fn_plus (ovb, overlaps_b_yz);
2322           affine_fn_free (t0);
2323           affine_fn_free (t2);
2324           *last_conflicts = last_conflicts_yz;
2325         }
2326       if (xyz_p)
2327         {
2328           affine_fn t0 = ova1;
2329           affine_fn t2 = ova2;
2330           affine_fn t4 = ovb;
2331
2332           ova1 = affine_fn_plus (ova1, overlaps_a_xyz);
2333           ova2 = affine_fn_plus (ova2, overlaps_a_xyz);
2334           ovb = affine_fn_plus (ovb, overlaps_b_xyz);
2335           affine_fn_free (t0);
2336           affine_fn_free (t2);
2337           affine_fn_free (t4);
2338           *last_conflicts = last_conflicts_xyz;
2339         }
2340       *overlaps_a = conflict_fn (2, ova1, ova2);
2341       *overlaps_b = conflict_fn (1, ovb);
2342     }
2343   else
2344     {
2345       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2346       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
2347       *last_conflicts = integer_zero_node;
2348     }
2349
2350   affine_fn_free (overlaps_a_xz);
2351   affine_fn_free (overlaps_b_xz);
2352   affine_fn_free (overlaps_a_yz);
2353   affine_fn_free (overlaps_b_yz);
2354   affine_fn_free (overlaps_a_xyz);
2355   affine_fn_free (overlaps_b_xyz);
2356 }
2357
2358 /* Copy the elements of vector VEC1 with length SIZE to VEC2.  */
2359
2360 static void
2361 lambda_vector_copy (lambda_vector vec1, lambda_vector vec2,
2362                     int size)
2363 {
2364   memcpy (vec2, vec1, size * sizeof (*vec1));
2365 }
2366
2367 /* Copy the elements of M x N matrix MAT1 to MAT2.  */
2368
2369 static void
2370 lambda_matrix_copy (lambda_matrix mat1, lambda_matrix mat2,
2371                     int m, int n)
2372 {
2373   int i;
2374
2375   for (i = 0; i < m; i++)
2376     lambda_vector_copy (mat1[i], mat2[i], n);
2377 }
2378
2379 /* Store the N x N identity matrix in MAT.  */
2380
2381 static void
2382 lambda_matrix_id (lambda_matrix mat, int size)
2383 {
2384   int i, j;
2385
2386   for (i = 0; i < size; i++)
2387     for (j = 0; j < size; j++)
2388       mat[i][j] = (i == j) ? 1 : 0;
2389 }
2390
2391 /* Return the first nonzero element of vector VEC1 between START and N.
2392    We must have START <= N.   Returns N if VEC1 is the zero vector.  */
2393
2394 static int
2395 lambda_vector_first_nz (lambda_vector vec1, int n, int start)
2396 {
2397   int j = start;
2398   while (j < n && vec1[j] == 0)
2399     j++;
2400   return j;
2401 }
2402
2403 /* Add a multiple of row R1 of matrix MAT with N columns to row R2:
2404    R2 = R2 + CONST1 * R1.  */
2405
2406 static void
2407 lambda_matrix_row_add (lambda_matrix mat, int n, int r1, int r2, int const1)
2408 {
2409   int i;
2410
2411   if (const1 == 0)
2412     return;
2413
2414   for (i = 0; i < n; i++)
2415     mat[r2][i] += const1 * mat[r1][i];
2416 }
2417
2418 /* Swap rows R1 and R2 in matrix MAT.  */
2419
2420 static void
2421 lambda_matrix_row_exchange (lambda_matrix mat, int r1, int r2)
2422 {
2423   lambda_vector row;
2424
2425   row = mat[r1];
2426   mat[r1] = mat[r2];
2427   mat[r2] = row;
2428 }
2429
2430 /* Multiply vector VEC1 of length SIZE by a constant CONST1,
2431    and store the result in VEC2.  */
2432
2433 static void
2434 lambda_vector_mult_const (lambda_vector vec1, lambda_vector vec2,
2435                           int size, int const1)
2436 {
2437   int i;
2438
2439   if (const1 == 0)
2440     lambda_vector_clear (vec2, size);
2441   else
2442     for (i = 0; i < size; i++)
2443       vec2[i] = const1 * vec1[i];
2444 }
2445
2446 /* Negate vector VEC1 with length SIZE and store it in VEC2.  */
2447
2448 static void
2449 lambda_vector_negate (lambda_vector vec1, lambda_vector vec2,
2450                       int size)
2451 {
2452   lambda_vector_mult_const (vec1, vec2, size, -1);
2453 }
2454
2455 /* Negate row R1 of matrix MAT which has N columns.  */
2456
2457 static void
2458 lambda_matrix_row_negate (lambda_matrix mat, int n, int r1)
2459 {
2460   lambda_vector_negate (mat[r1], mat[r1], n);
2461 }
2462
2463 /* Return true if two vectors are equal.  */
2464
2465 static bool
2466 lambda_vector_equal (lambda_vector vec1, lambda_vector vec2, int size)
2467 {
2468   int i;
2469   for (i = 0; i < size; i++)
2470     if (vec1[i] != vec2[i])
2471       return false;
2472   return true;
2473 }
2474
2475 /* Given an M x N integer matrix A, this function determines an M x
2476    M unimodular matrix U, and an M x N echelon matrix S such that
2477    "U.A = S".  This decomposition is also known as "right Hermite".
2478
2479    Ref: Algorithm 2.1 page 33 in "Loop Transformations for
2480    Restructuring Compilers" Utpal Banerjee.  */
2481
2482 static void
2483 lambda_matrix_right_hermite (lambda_matrix A, int m, int n,
2484                              lambda_matrix S, lambda_matrix U)
2485 {
2486   int i, j, i0 = 0;
2487
2488   lambda_matrix_copy (A, S, m, n);
2489   lambda_matrix_id (U, m);
2490
2491   for (j = 0; j < n; j++)
2492     {
2493       if (lambda_vector_first_nz (S[j], m, i0) < m)
2494         {
2495           ++i0;
2496           for (i = m - 1; i >= i0; i--)
2497             {
2498               while (S[i][j] != 0)
2499                 {
2500                   int sigma, factor, a, b;
2501
2502                   a = S[i-1][j];
2503                   b = S[i][j];
2504                   sigma = (a * b < 0) ? -1: 1;
2505                   a = abs (a);
2506                   b = abs (b);
2507                   factor = sigma * (a / b);
2508
2509                   lambda_matrix_row_add (S, n, i, i-1, -factor);
2510                   lambda_matrix_row_exchange (S, i, i-1);
2511
2512                   lambda_matrix_row_add (U, m, i, i-1, -factor);
2513                   lambda_matrix_row_exchange (U, i, i-1);
2514                 }
2515             }
2516         }
2517     }
2518 }
2519
2520 /* Determines the overlapping elements due to accesses CHREC_A and
2521    CHREC_B, that are affine functions.  This function cannot handle
2522    symbolic evolution functions, ie. when initial conditions are
2523    parameters, because it uses lambda matrices of integers.  */
2524
2525 static void
2526 analyze_subscript_affine_affine (tree chrec_a,
2527                                  tree chrec_b,
2528                                  conflict_function **overlaps_a,
2529                                  conflict_function **overlaps_b,
2530                                  tree *last_conflicts)
2531 {
2532   unsigned nb_vars_a, nb_vars_b, dim;
2533   HOST_WIDE_INT init_a, init_b, gamma, gcd_alpha_beta;
2534   lambda_matrix A, U, S;
2535   struct obstack scratch_obstack;
2536
2537   if (eq_evolutions_p (chrec_a, chrec_b))
2538     {
2539       /* The accessed index overlaps for each iteration in the
2540          loop.  */
2541       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2542       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
2543       *last_conflicts = chrec_dont_know;
2544       return;
2545     }
2546   if (dump_file && (dump_flags & TDF_DETAILS))
2547     fprintf (dump_file, "(analyze_subscript_affine_affine \n");
2548
2549   /* For determining the initial intersection, we have to solve a
2550      Diophantine equation.  This is the most time consuming part.
2551
2552      For answering to the question: "Is there a dependence?" we have
2553      to prove that there exists a solution to the Diophantine
2554      equation, and that the solution is in the iteration domain,
2555      i.e. the solution is positive or zero, and that the solution
2556      happens before the upper bound loop.nb_iterations.  Otherwise
2557      there is no dependence.  This function outputs a description of
2558      the iterations that hold the intersections.  */
2559
2560   nb_vars_a = nb_vars_in_chrec (chrec_a);
2561   nb_vars_b = nb_vars_in_chrec (chrec_b);
2562
2563   gcc_obstack_init (&scratch_obstack);
2564
2565   dim = nb_vars_a + nb_vars_b;
2566   U = lambda_matrix_new (dim, dim, &scratch_obstack);
2567   A = lambda_matrix_new (dim, 1, &scratch_obstack);
2568   S = lambda_matrix_new (dim, 1, &scratch_obstack);
2569
2570   init_a = int_cst_value (initialize_matrix_A (A, chrec_a, 0, 1));
2571   init_b = int_cst_value (initialize_matrix_A (A, chrec_b, nb_vars_a, -1));
2572   gamma = init_b - init_a;
2573
2574   /* Don't do all the hard work of solving the Diophantine equation
2575      when we already know the solution: for example,
2576      | {3, +, 1}_1
2577      | {3, +, 4}_2
2578      | gamma = 3 - 3 = 0.
2579      Then the first overlap occurs during the first iterations:
2580      | {3, +, 1}_1 ({0, +, 4}_x) = {3, +, 4}_2 ({0, +, 1}_x)
2581   */
2582   if (gamma == 0)
2583     {
2584       if (nb_vars_a == 1 && nb_vars_b == 1)
2585         {
2586           HOST_WIDE_INT step_a, step_b;
2587           HOST_WIDE_INT niter, niter_a, niter_b;
2588           affine_fn ova, ovb;
2589
2590           niter_a = max_stmt_executions_int (get_chrec_loop (chrec_a));
2591           niter_b = max_stmt_executions_int (get_chrec_loop (chrec_b));
2592           niter = MIN (niter_a, niter_b);
2593           step_a = int_cst_value (CHREC_RIGHT (chrec_a));
2594           step_b = int_cst_value (CHREC_RIGHT (chrec_b));
2595
2596           compute_overlap_steps_for_affine_univar (niter, step_a, step_b,
2597                                                    &ova, &ovb,
2598                                                    last_conflicts, 1);
2599           *overlaps_a = conflict_fn (1, ova);
2600           *overlaps_b = conflict_fn (1, ovb);
2601         }
2602
2603       else if (nb_vars_a == 2 && nb_vars_b == 1)
2604         compute_overlap_steps_for_affine_1_2
2605           (chrec_a, chrec_b, overlaps_a, overlaps_b, last_conflicts);
2606
2607       else if (nb_vars_a == 1 && nb_vars_b == 2)
2608         compute_overlap_steps_for_affine_1_2
2609           (chrec_b, chrec_a, overlaps_b, overlaps_a, last_conflicts);
2610
2611       else
2612         {
2613           if (dump_file && (dump_flags & TDF_DETAILS))
2614             fprintf (dump_file, "affine-affine test failed: too many variables.\n");
2615           *overlaps_a = conflict_fn_not_known ();
2616           *overlaps_b = conflict_fn_not_known ();
2617           *last_conflicts = chrec_dont_know;
2618         }
2619       goto end_analyze_subs_aa;
2620     }
2621
2622   /* U.A = S */
2623   lambda_matrix_right_hermite (A, dim, 1, S, U);
2624
2625   if (S[0][0] < 0)
2626     {
2627       S[0][0] *= -1;
2628       lambda_matrix_row_negate (U, dim, 0);
2629     }
2630   gcd_alpha_beta = S[0][0];
2631
2632   /* Something went wrong: for example in {1, +, 0}_5 vs. {0, +, 0}_5,
2633      but that is a quite strange case.  Instead of ICEing, answer
2634      don't know.  */
2635   if (gcd_alpha_beta == 0)
2636     {
2637       *overlaps_a = conflict_fn_not_known ();
2638       *overlaps_b = conflict_fn_not_known ();
2639       *last_conflicts = chrec_dont_know;
2640       goto end_analyze_subs_aa;
2641     }
2642
2643   /* The classic "gcd-test".  */
2644   if (!int_divides_p (gcd_alpha_beta, gamma))
2645     {
2646       /* The "gcd-test" has determined that there is no integer
2647          solution, i.e. there is no dependence.  */
2648       *overlaps_a = conflict_fn_no_dependence ();
2649       *overlaps_b = conflict_fn_no_dependence ();
2650       *last_conflicts = integer_zero_node;
2651     }
2652
2653   /* Both access functions are univariate.  This includes SIV and MIV cases.  */
2654   else if (nb_vars_a == 1 && nb_vars_b == 1)
2655     {
2656       /* Both functions should have the same evolution sign.  */
2657       if (((A[0][0] > 0 && -A[1][0] > 0)
2658            || (A[0][0] < 0 && -A[1][0] < 0)))
2659         {
2660           /* The solutions are given by:
2661              |
2662              | [GAMMA/GCD_ALPHA_BETA  t].[u11 u12]  = [x0]
2663              |                           [u21 u22]    [y0]
2664
2665              For a given integer t.  Using the following variables,
2666
2667              | i0 = u11 * gamma / gcd_alpha_beta
2668              | j0 = u12 * gamma / gcd_alpha_beta
2669              | i1 = u21
2670              | j1 = u22
2671
2672              the solutions are:
2673
2674              | x0 = i0 + i1 * t,
2675              | y0 = j0 + j1 * t.  */
2676           HOST_WIDE_INT i0, j0, i1, j1;
2677
2678           i0 = U[0][0] * gamma / gcd_alpha_beta;
2679           j0 = U[0][1] * gamma / gcd_alpha_beta;
2680           i1 = U[1][0];
2681           j1 = U[1][1];
2682
2683           if ((i1 == 0 && i0 < 0)
2684               || (j1 == 0 && j0 < 0))
2685             {
2686               /* There is no solution.
2687                  FIXME: The case "i0 > nb_iterations, j0 > nb_iterations"
2688                  falls in here, but for the moment we don't look at the
2689                  upper bound of the iteration domain.  */
2690               *overlaps_a = conflict_fn_no_dependence ();
2691               *overlaps_b = conflict_fn_no_dependence ();
2692               *last_conflicts = integer_zero_node;
2693               goto end_analyze_subs_aa;
2694             }
2695
2696           if (i1 > 0 && j1 > 0)
2697             {
2698               HOST_WIDE_INT niter_a
2699                 = max_stmt_executions_int (get_chrec_loop (chrec_a));
2700               HOST_WIDE_INT niter_b
2701                 = max_stmt_executions_int (get_chrec_loop (chrec_b));
2702               HOST_WIDE_INT niter = MIN (niter_a, niter_b);
2703
2704               /* (X0, Y0) is a solution of the Diophantine equation:
2705                  "chrec_a (X0) = chrec_b (Y0)".  */
2706               HOST_WIDE_INT tau1 = MAX (CEIL (-i0, i1),
2707                                         CEIL (-j0, j1));
2708               HOST_WIDE_INT x0 = i1 * tau1 + i0;
2709               HOST_WIDE_INT y0 = j1 * tau1 + j0;
2710
2711               /* (X1, Y1) is the smallest positive solution of the eq
2712                  "chrec_a (X1) = chrec_b (Y1)", i.e. this is where the
2713                  first conflict occurs.  */
2714               HOST_WIDE_INT min_multiple = MIN (x0 / i1, y0 / j1);
2715               HOST_WIDE_INT x1 = x0 - i1 * min_multiple;
2716               HOST_WIDE_INT y1 = y0 - j1 * min_multiple;
2717
2718               if (niter > 0)
2719                 {
2720                   HOST_WIDE_INT tau2 = MIN (FLOOR_DIV (niter - i0, i1),
2721                                             FLOOR_DIV (niter - j0, j1));
2722                   HOST_WIDE_INT last_conflict = tau2 - (x1 - i0)/i1;
2723
2724                   /* If the overlap occurs outside of the bounds of the
2725                      loop, there is no dependence.  */
2726                   if (x1 >= niter || y1 >= niter)
2727                     {
2728                       *overlaps_a = conflict_fn_no_dependence ();
2729                       *overlaps_b = conflict_fn_no_dependence ();
2730                       *last_conflicts = integer_zero_node;
2731                       goto end_analyze_subs_aa;
2732                     }
2733                   else
2734                     *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
2735                 }
2736               else
2737                 *last_conflicts = chrec_dont_know;
2738
2739               *overlaps_a
2740                 = conflict_fn (1,
2741                                affine_fn_univar (build_int_cst (NULL_TREE, x1),
2742                                                  1,
2743                                                  build_int_cst (NULL_TREE, i1)));
2744               *overlaps_b
2745                 = conflict_fn (1,
2746                                affine_fn_univar (build_int_cst (NULL_TREE, y1),
2747                                                  1,
2748                                                  build_int_cst (NULL_TREE, j1)));
2749             }
2750           else
2751             {
2752               /* FIXME: For the moment, the upper bound of the
2753                  iteration domain for i and j is not checked.  */
2754               if (dump_file && (dump_flags & TDF_DETAILS))
2755                 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
2756               *overlaps_a = conflict_fn_not_known ();
2757               *overlaps_b = conflict_fn_not_known ();
2758               *last_conflicts = chrec_dont_know;
2759             }
2760         }
2761       else
2762         {
2763           if (dump_file && (dump_flags & TDF_DETAILS))
2764             fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
2765           *overlaps_a = conflict_fn_not_known ();
2766           *overlaps_b = conflict_fn_not_known ();
2767           *last_conflicts = chrec_dont_know;
2768         }
2769     }
2770   else
2771     {
2772       if (dump_file && (dump_flags & TDF_DETAILS))
2773         fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
2774       *overlaps_a = conflict_fn_not_known ();
2775       *overlaps_b = conflict_fn_not_known ();
2776       *last_conflicts = chrec_dont_know;
2777     }
2778
2779 end_analyze_subs_aa:
2780   obstack_free (&scratch_obstack, NULL);
2781   if (dump_file && (dump_flags & TDF_DETAILS))
2782     {
2783       fprintf (dump_file, "  (overlaps_a = ");
2784       dump_conflict_function (dump_file, *overlaps_a);
2785       fprintf (dump_file, ")\n  (overlaps_b = ");
2786       dump_conflict_function (dump_file, *overlaps_b);
2787       fprintf (dump_file, "))\n");
2788     }
2789 }
2790
2791 /* Returns true when analyze_subscript_affine_affine can be used for
2792    determining the dependence relation between chrec_a and chrec_b,
2793    that contain symbols.  This function modifies chrec_a and chrec_b
2794    such that the analysis result is the same, and such that they don't
2795    contain symbols, and then can safely be passed to the analyzer.
2796
2797    Example: The analysis of the following tuples of evolutions produce
2798    the same results: {x+1, +, 1}_1 vs. {x+3, +, 1}_1, and {-2, +, 1}_1
2799    vs. {0, +, 1}_1
2800
2801    {x+1, +, 1}_1 ({2, +, 1}_1) = {x+3, +, 1}_1 ({0, +, 1}_1)
2802    {-2, +, 1}_1 ({2, +, 1}_1) = {0, +, 1}_1 ({0, +, 1}_1)
2803 */
2804
2805 static bool
2806 can_use_analyze_subscript_affine_affine (tree *chrec_a, tree *chrec_b)
2807 {
2808   tree diff, type, left_a, left_b, right_b;
2809
2810   if (chrec_contains_symbols (CHREC_RIGHT (*chrec_a))
2811       || chrec_contains_symbols (CHREC_RIGHT (*chrec_b)))
2812     /* FIXME: For the moment not handled.  Might be refined later.  */
2813     return false;
2814
2815   type = chrec_type (*chrec_a);
2816   left_a = CHREC_LEFT (*chrec_a);
2817   left_b = chrec_convert (type, CHREC_LEFT (*chrec_b), NULL);
2818   diff = chrec_fold_minus (type, left_a, left_b);
2819
2820   if (!evolution_function_is_constant_p (diff))
2821     return false;
2822
2823   if (dump_file && (dump_flags & TDF_DETAILS))
2824     fprintf (dump_file, "can_use_subscript_aff_aff_for_symbolic \n");
2825
2826   *chrec_a = build_polynomial_chrec (CHREC_VARIABLE (*chrec_a),
2827                                      diff, CHREC_RIGHT (*chrec_a));
2828   right_b = chrec_convert (type, CHREC_RIGHT (*chrec_b), NULL);
2829   *chrec_b = build_polynomial_chrec (CHREC_VARIABLE (*chrec_b),
2830                                      build_int_cst (type, 0),
2831                                      right_b);
2832   return true;
2833 }
2834
2835 /* Analyze a SIV (Single Index Variable) subscript.  *OVERLAPS_A and
2836    *OVERLAPS_B are initialized to the functions that describe the
2837    relation between the elements accessed twice by CHREC_A and
2838    CHREC_B.  For k >= 0, the following property is verified:
2839
2840    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
2841
2842 static void
2843 analyze_siv_subscript (tree chrec_a,
2844                        tree chrec_b,
2845                        conflict_function **overlaps_a,
2846                        conflict_function **overlaps_b,
2847                        tree *last_conflicts,
2848                        int loop_nest_num)
2849 {
2850   dependence_stats.num_siv++;
2851
2852   if (dump_file && (dump_flags & TDF_DETAILS))
2853     fprintf (dump_file, "(analyze_siv_subscript \n");
2854
2855   if (evolution_function_is_constant_p (chrec_a)
2856       && evolution_function_is_affine_in_loop (chrec_b, loop_nest_num))
2857     analyze_siv_subscript_cst_affine (chrec_a, chrec_b,
2858                                       overlaps_a, overlaps_b, last_conflicts);
2859
2860   else if (evolution_function_is_affine_in_loop (chrec_a, loop_nest_num)
2861            && evolution_function_is_constant_p (chrec_b))
2862     analyze_siv_subscript_cst_affine (chrec_b, chrec_a,
2863                                       overlaps_b, overlaps_a, last_conflicts);
2864
2865   else if (evolution_function_is_affine_in_loop (chrec_a, loop_nest_num)
2866            && evolution_function_is_affine_in_loop (chrec_b, loop_nest_num))
2867     {
2868       if (!chrec_contains_symbols (chrec_a)
2869           && !chrec_contains_symbols (chrec_b))
2870         {
2871           analyze_subscript_affine_affine (chrec_a, chrec_b,
2872                                            overlaps_a, overlaps_b,
2873                                            last_conflicts);
2874
2875           if (CF_NOT_KNOWN_P (*overlaps_a)
2876               || CF_NOT_KNOWN_P (*overlaps_b))
2877             dependence_stats.num_siv_unimplemented++;
2878           else if (CF_NO_DEPENDENCE_P (*overlaps_a)
2879                    || CF_NO_DEPENDENCE_P (*overlaps_b))
2880             dependence_stats.num_siv_independent++;
2881           else
2882             dependence_stats.num_siv_dependent++;
2883         }
2884       else if (can_use_analyze_subscript_affine_affine (&chrec_a,
2885                                                         &chrec_b))
2886         {
2887           analyze_subscript_affine_affine (chrec_a, chrec_b,
2888                                            overlaps_a, overlaps_b,
2889                                            last_conflicts);
2890
2891           if (CF_NOT_KNOWN_P (*overlaps_a)
2892               || CF_NOT_KNOWN_P (*overlaps_b))
2893             dependence_stats.num_siv_unimplemented++;
2894           else if (CF_NO_DEPENDENCE_P (*overlaps_a)
2895                    || CF_NO_DEPENDENCE_P (*overlaps_b))
2896             dependence_stats.num_siv_independent++;
2897           else
2898             dependence_stats.num_siv_dependent++;
2899         }
2900       else
2901         goto siv_subscript_dontknow;
2902     }
2903
2904   else
2905     {
2906     siv_subscript_dontknow:;
2907       if (dump_file && (dump_flags & TDF_DETAILS))
2908         fprintf (dump_file, "  siv test failed: unimplemented");
2909       *overlaps_a = conflict_fn_not_known ();
2910       *overlaps_b = conflict_fn_not_known ();
2911       *last_conflicts = chrec_dont_know;
2912       dependence_stats.num_siv_unimplemented++;
2913     }
2914
2915   if (dump_file && (dump_flags & TDF_DETAILS))
2916     fprintf (dump_file, ")\n");
2917 }
2918
2919 /* Returns false if we can prove that the greatest common divisor of the steps
2920    of CHREC does not divide CST, false otherwise.  */
2921
2922 static bool
2923 gcd_of_steps_may_divide_p (const_tree chrec, const_tree cst)
2924 {
2925   HOST_WIDE_INT cd = 0, val;
2926   tree step;
2927
2928   if (!tree_fits_shwi_p (cst))
2929     return true;
2930   val = tree_to_shwi (cst);
2931
2932   while (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
2933     {
2934       step = CHREC_RIGHT (chrec);
2935       if (!tree_fits_shwi_p (step))
2936         return true;
2937       cd = gcd (cd, tree_to_shwi (step));
2938       chrec = CHREC_LEFT (chrec);
2939     }
2940
2941   return val % cd == 0;
2942 }
2943
2944 /* Analyze a MIV (Multiple Index Variable) subscript with respect to
2945    LOOP_NEST.  *OVERLAPS_A and *OVERLAPS_B are initialized to the
2946    functions that describe the relation between the elements accessed
2947    twice by CHREC_A and CHREC_B.  For k >= 0, the following property
2948    is verified:
2949
2950    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
2951
2952 static void
2953 analyze_miv_subscript (tree chrec_a,
2954                        tree chrec_b,
2955                        conflict_function **overlaps_a,
2956                        conflict_function **overlaps_b,
2957                        tree *last_conflicts,
2958                        struct loop *loop_nest)
2959 {
2960   tree type, difference;
2961
2962   dependence_stats.num_miv++;
2963   if (dump_file && (dump_flags & TDF_DETAILS))
2964     fprintf (dump_file, "(analyze_miv_subscript \n");
2965
2966   type = signed_type_for_types (TREE_TYPE (chrec_a), TREE_TYPE (chrec_b));
2967   chrec_a = chrec_convert (type, chrec_a, NULL);
2968   chrec_b = chrec_convert (type, chrec_b, NULL);
2969   difference = chrec_fold_minus (type, chrec_a, chrec_b);
2970
2971   if (eq_evolutions_p (chrec_a, chrec_b))
2972     {
2973       /* Access functions are the same: all the elements are accessed
2974          in the same order.  */
2975       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2976       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
2977       *last_conflicts = max_stmt_executions_tree (get_chrec_loop (chrec_a));
2978       dependence_stats.num_miv_dependent++;
2979     }
2980
2981   else if (evolution_function_is_constant_p (difference)
2982            /* For the moment, the following is verified:
2983               evolution_function_is_affine_multivariate_p (chrec_a,
2984               loop_nest->num) */
2985            && !gcd_of_steps_may_divide_p (chrec_a, difference))
2986     {
2987       /* testsuite/.../ssa-chrec-33.c
2988          {{21, +, 2}_1, +, -2}_2  vs.  {{20, +, 2}_1, +, -2}_2
2989
2990          The difference is 1, and all the evolution steps are multiples
2991          of 2, consequently there are no overlapping elements.  */
2992       *overlaps_a = conflict_fn_no_dependence ();
2993       *overlaps_b = conflict_fn_no_dependence ();
2994       *last_conflicts = integer_zero_node;
2995       dependence_stats.num_miv_independent++;
2996     }
2997
2998   else if (evolution_function_is_affine_multivariate_p (chrec_a, loop_nest->num)
2999            && !chrec_contains_symbols (chrec_a)
3000            && evolution_function_is_affine_multivariate_p (chrec_b, loop_nest->num)
3001            && !chrec_contains_symbols (chrec_b))
3002     {
3003       /* testsuite/.../ssa-chrec-35.c
3004          {0, +, 1}_2  vs.  {0, +, 1}_3
3005          the overlapping elements are respectively located at iterations:
3006          {0, +, 1}_x and {0, +, 1}_x,
3007          in other words, we have the equality:
3008          {0, +, 1}_2 ({0, +, 1}_x) = {0, +, 1}_3 ({0, +, 1}_x)
3009
3010          Other examples:
3011          {{0, +, 1}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y) =
3012          {0, +, 1}_1 ({{0, +, 1}_x, +, 2}_y)
3013
3014          {{0, +, 2}_1, +, 3}_2 ({0, +, 1}_y, {0, +, 1}_x) =
3015          {{0, +, 3}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y)
3016       */
3017       analyze_subscript_affine_affine (chrec_a, chrec_b,
3018                                        overlaps_a, overlaps_b, last_conflicts);
3019
3020       if (CF_NOT_KNOWN_P (*overlaps_a)
3021           || CF_NOT_KNOWN_P (*overlaps_b))
3022         dependence_stats.num_miv_unimplemented++;
3023       else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3024                || CF_NO_DEPENDENCE_P (*overlaps_b))
3025         dependence_stats.num_miv_independent++;
3026       else
3027         dependence_stats.num_miv_dependent++;
3028     }
3029
3030   else
3031     {
3032       /* When the analysis is too difficult, answer "don't know".  */
3033       if (dump_file && (dump_flags & TDF_DETAILS))
3034         fprintf (dump_file, "analyze_miv_subscript test failed: unimplemented.\n");
3035
3036       *overlaps_a = conflict_fn_not_known ();
3037       *overlaps_b = conflict_fn_not_known ();
3038       *last_conflicts = chrec_dont_know;
3039       dependence_stats.num_miv_unimplemented++;
3040     }
3041
3042   if (dump_file && (dump_flags & TDF_DETAILS))
3043     fprintf (dump_file, ")\n");
3044 }
3045
3046 /* Determines the iterations for which CHREC_A is equal to CHREC_B in
3047    with respect to LOOP_NEST.  OVERLAP_ITERATIONS_A and
3048    OVERLAP_ITERATIONS_B are initialized with two functions that
3049    describe the iterations that contain conflicting elements.
3050
3051    Remark: For an integer k >= 0, the following equality is true:
3052
3053    CHREC_A (OVERLAP_ITERATIONS_A (k)) == CHREC_B (OVERLAP_ITERATIONS_B (k)).
3054 */
3055
3056 static void
3057 analyze_overlapping_iterations (tree chrec_a,
3058                                 tree chrec_b,
3059                                 conflict_function **overlap_iterations_a,
3060                                 conflict_function **overlap_iterations_b,
3061                                 tree *last_conflicts, struct loop *loop_nest)
3062 {
3063   unsigned int lnn = loop_nest->num;
3064
3065   dependence_stats.num_subscript_tests++;
3066
3067   if (dump_file && (dump_flags & TDF_DETAILS))
3068     {
3069       fprintf (dump_file, "(analyze_overlapping_iterations \n");
3070       fprintf (dump_file, "  (chrec_a = ");
3071       print_generic_expr (dump_file, chrec_a, 0);
3072       fprintf (dump_file, ")\n  (chrec_b = ");
3073       print_generic_expr (dump_file, chrec_b, 0);
3074       fprintf (dump_file, ")\n");
3075     }
3076
3077   if (chrec_a == NULL_TREE
3078       || chrec_b == NULL_TREE
3079       || chrec_contains_undetermined (chrec_a)
3080       || chrec_contains_undetermined (chrec_b))
3081     {
3082       dependence_stats.num_subscript_undetermined++;
3083
3084       *overlap_iterations_a = conflict_fn_not_known ();
3085       *overlap_iterations_b = conflict_fn_not_known ();
3086     }
3087
3088   /* If they are the same chrec, and are affine, they overlap
3089      on every iteration.  */
3090   else if (eq_evolutions_p (chrec_a, chrec_b)
3091            && (evolution_function_is_affine_multivariate_p (chrec_a, lnn)
3092                || operand_equal_p (chrec_a, chrec_b, 0)))
3093     {
3094       dependence_stats.num_same_subscript_function++;
3095       *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3096       *overlap_iterations_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3097       *last_conflicts = chrec_dont_know;
3098     }
3099
3100   /* If they aren't the same, and aren't affine, we can't do anything
3101      yet.  */
3102   else if ((chrec_contains_symbols (chrec_a)
3103             || chrec_contains_symbols (chrec_b))
3104            && (!evolution_function_is_affine_multivariate_p (chrec_a, lnn)
3105                || !evolution_function_is_affine_multivariate_p (chrec_b, lnn)))
3106     {
3107       dependence_stats.num_subscript_undetermined++;
3108       *overlap_iterations_a = conflict_fn_not_known ();
3109       *overlap_iterations_b = conflict_fn_not_known ();
3110     }
3111
3112   else if (ziv_subscript_p (chrec_a, chrec_b))
3113     analyze_ziv_subscript (chrec_a, chrec_b,
3114                            overlap_iterations_a, overlap_iterations_b,
3115                            last_conflicts);
3116
3117   else if (siv_subscript_p (chrec_a, chrec_b))
3118     analyze_siv_subscript (chrec_a, chrec_b,
3119                            overlap_iterations_a, overlap_iterations_b,
3120                            last_conflicts, lnn);
3121
3122   else
3123     analyze_miv_subscript (chrec_a, chrec_b,
3124                            overlap_iterations_a, overlap_iterations_b,
3125                            last_conflicts, loop_nest);
3126
3127   if (dump_file && (dump_flags & TDF_DETAILS))
3128     {
3129       fprintf (dump_file, "  (overlap_iterations_a = ");
3130       dump_conflict_function (dump_file, *overlap_iterations_a);
3131       fprintf (dump_file, ")\n  (overlap_iterations_b = ");
3132       dump_conflict_function (dump_file, *overlap_iterations_b);
3133       fprintf (dump_file, "))\n");
3134     }
3135 }
3136
3137 /* Helper function for uniquely inserting distance vectors.  */
3138
3139 static void
3140 save_dist_v (struct data_dependence_relation *ddr, lambda_vector dist_v)
3141 {
3142   unsigned i;
3143   lambda_vector v;
3144
3145   FOR_EACH_VEC_ELT (DDR_DIST_VECTS (ddr), i, v)
3146     if (lambda_vector_equal (v, dist_v, DDR_NB_LOOPS (ddr)))
3147       return;
3148
3149   DDR_DIST_VECTS (ddr).safe_push (dist_v);
3150 }
3151
3152 /* Helper function for uniquely inserting direction vectors.  */
3153
3154 static void
3155 save_dir_v (struct data_dependence_relation *ddr, lambda_vector dir_v)
3156 {
3157   unsigned i;
3158   lambda_vector v;
3159
3160   FOR_EACH_VEC_ELT (DDR_DIR_VECTS (ddr), i, v)
3161     if (lambda_vector_equal (v, dir_v, DDR_NB_LOOPS (ddr)))
3162       return;
3163
3164   DDR_DIR_VECTS (ddr).safe_push (dir_v);
3165 }
3166
3167 /* Add a distance of 1 on all the loops outer than INDEX.  If we
3168    haven't yet determined a distance for this outer loop, push a new
3169    distance vector composed of the previous distance, and a distance
3170    of 1 for this outer loop.  Example:
3171
3172    | loop_1
3173    |   loop_2
3174    |     A[10]
3175    |   endloop_2
3176    | endloop_1
3177
3178    Saved vectors are of the form (dist_in_1, dist_in_2).  First, we
3179    save (0, 1), then we have to save (1, 0).  */
3180
3181 static void
3182 add_outer_distances (struct data_dependence_relation *ddr,
3183                      lambda_vector dist_v, int index)
3184 {
3185   /* For each outer loop where init_v is not set, the accesses are
3186      in dependence of distance 1 in the loop.  */
3187   while (--index >= 0)
3188     {
3189       lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3190       lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
3191       save_v[index] = 1;
3192       save_dist_v (ddr, save_v);
3193     }
3194 }
3195
3196 /* Return false when fail to represent the data dependence as a
3197    distance vector.  INIT_B is set to true when a component has been
3198    added to the distance vector DIST_V.  INDEX_CARRY is then set to
3199    the index in DIST_V that carries the dependence.  */
3200
3201 static bool
3202 build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
3203                              struct data_reference *ddr_a,
3204                              struct data_reference *ddr_b,
3205                              lambda_vector dist_v, bool *init_b,
3206                              int *index_carry)
3207 {
3208   unsigned i;
3209   lambda_vector init_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3210
3211   for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3212     {
3213       tree access_fn_a, access_fn_b;
3214       struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
3215
3216       if (chrec_contains_undetermined (SUB_DISTANCE (subscript)))
3217         {
3218           non_affine_dependence_relation (ddr);
3219           return false;
3220         }
3221
3222       access_fn_a = DR_ACCESS_FN (ddr_a, i);
3223       access_fn_b = DR_ACCESS_FN (ddr_b, i);
3224
3225       if (TREE_CODE (access_fn_a) == POLYNOMIAL_CHREC
3226           && TREE_CODE (access_fn_b) == POLYNOMIAL_CHREC)
3227         {
3228           int dist, index;
3229           int var_a = CHREC_VARIABLE (access_fn_a);
3230           int var_b = CHREC_VARIABLE (access_fn_b);
3231
3232           if (var_a != var_b
3233               || chrec_contains_undetermined (SUB_DISTANCE (subscript)))
3234             {
3235               non_affine_dependence_relation (ddr);
3236               return false;
3237             }
3238
3239           dist = int_cst_value (SUB_DISTANCE (subscript));
3240           index = index_in_loop_nest (var_a, DDR_LOOP_NEST (ddr));
3241           *index_carry = MIN (index, *index_carry);
3242
3243           /* This is the subscript coupling test.  If we have already
3244              recorded a distance for this loop (a distance coming from
3245              another subscript), it should be the same.  For example,
3246              in the following code, there is no dependence:
3247
3248              | loop i = 0, N, 1
3249              |   T[i+1][i] = ...
3250              |   ... = T[i][i]
3251              | endloop
3252           */
3253           if (init_v[index] != 0 && dist_v[index] != dist)
3254             {
3255               finalize_ddr_dependent (ddr, chrec_known);
3256               return false;
3257             }
3258
3259           dist_v[index] = dist;
3260           init_v[index] = 1;
3261           *init_b = true;
3262         }
3263       else if (!operand_equal_p (access_fn_a, access_fn_b, 0))
3264         {
3265           /* This can be for example an affine vs. constant dependence
3266              (T[i] vs. T[3]) that is not an affine dependence and is
3267              not representable as a distance vector.  */
3268           non_affine_dependence_relation (ddr);
3269           return false;
3270         }
3271     }
3272
3273   return true;
3274 }
3275
3276 /* Return true when the DDR contains only constant access functions.  */
3277
3278 static bool
3279 constant_access_functions (const struct data_dependence_relation *ddr)
3280 {
3281   unsigned i;
3282
3283   for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3284     if (!evolution_function_is_constant_p (DR_ACCESS_FN (DDR_A (ddr), i))
3285         || !evolution_function_is_constant_p (DR_ACCESS_FN (DDR_B (ddr), i)))
3286       return false;
3287
3288   return true;
3289 }
3290
3291 /* Helper function for the case where DDR_A and DDR_B are the same
3292    multivariate access function with a constant step.  For an example
3293    see pr34635-1.c.  */
3294
3295 static void
3296 add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
3297 {
3298   int x_1, x_2;
3299   tree c_1 = CHREC_LEFT (c_2);
3300   tree c_0 = CHREC_LEFT (c_1);
3301   lambda_vector dist_v;
3302   int v1, v2, cd;
3303
3304   /* Polynomials with more than 2 variables are not handled yet.  When
3305      the evolution steps are parameters, it is not possible to
3306      represent the dependence using classical distance vectors.  */
3307   if (TREE_CODE (c_0) != INTEGER_CST
3308       || TREE_CODE (CHREC_RIGHT (c_1)) != INTEGER_CST
3309       || TREE_CODE (CHREC_RIGHT (c_2)) != INTEGER_CST)
3310     {
3311       DDR_AFFINE_P (ddr) = false;
3312       return;
3313     }
3314
3315   x_2 = index_in_loop_nest (CHREC_VARIABLE (c_2), DDR_LOOP_NEST (ddr));
3316   x_1 = index_in_loop_nest (CHREC_VARIABLE (c_1), DDR_LOOP_NEST (ddr));
3317
3318   /* For "{{0, +, 2}_1, +, 3}_2" the distance vector is (3, -2).  */
3319   dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3320   v1 = int_cst_value (CHREC_RIGHT (c_1));
3321   v2 = int_cst_value (CHREC_RIGHT (c_2));
3322   cd = gcd (v1, v2);
3323   v1 /= cd;
3324   v2 /= cd;
3325
3326   if (v2 < 0)
3327     {
3328       v2 = -v2;
3329       v1 = -v1;
3330     }
3331
3332   dist_v[x_1] = v2;
3333   dist_v[x_2] = -v1;
3334   save_dist_v (ddr, dist_v);
3335
3336   add_outer_distances (ddr, dist_v, x_1);
3337 }
3338
3339 /* Helper function for the case where DDR_A and DDR_B are the same
3340    access functions.  */
3341
3342 static void
3343 add_other_self_distances (struct data_dependence_relation *ddr)
3344 {
3345   lambda_vector dist_v;
3346   unsigned i;
3347   int index_carry = DDR_NB_LOOPS (ddr);
3348
3349   for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3350     {
3351       tree access_fun = DR_ACCESS_FN (DDR_A (ddr), i);
3352
3353       if (TREE_CODE (access_fun) == POLYNOMIAL_CHREC)
3354         {
3355           if (!evolution_function_is_univariate_p (access_fun))
3356             {
3357               if (DDR_NUM_SUBSCRIPTS (ddr) != 1)
3358                 {
3359                   DDR_ARE_DEPENDENT (ddr) = chrec_dont_know;
3360                   return;
3361                 }
3362
3363               access_fun = DR_ACCESS_FN (DDR_A (ddr), 0);
3364
3365               if (TREE_CODE (CHREC_LEFT (access_fun)) == POLYNOMIAL_CHREC)
3366                 add_multivariate_self_dist (ddr, access_fun);
3367               else
3368                 /* The evolution step is not constant: it varies in
3369                    the outer loop, so this cannot be represented by a
3370                    distance vector.  For example in pr34635.c the
3371                    evolution is {0, +, {0, +, 4}_1}_2.  */
3372                 DDR_AFFINE_P (ddr) = false;
3373
3374               return;
3375             }
3376
3377           index_carry = MIN (index_carry,
3378                              index_in_loop_nest (CHREC_VARIABLE (access_fun),
3379                                                  DDR_LOOP_NEST (ddr)));
3380         }
3381     }
3382
3383   dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3384   add_outer_distances (ddr, dist_v, index_carry);
3385 }
3386
3387 static void
3388 insert_innermost_unit_dist_vector (struct data_dependence_relation *ddr)
3389 {
3390   lambda_vector dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3391
3392   dist_v[DDR_INNER_LOOP (ddr)] = 1;
3393   save_dist_v (ddr, dist_v);
3394 }
3395
3396 /* Adds a unit distance vector to DDR when there is a 0 overlap.  This
3397    is the case for example when access functions are the same and
3398    equal to a constant, as in:
3399
3400    | loop_1
3401    |   A[3] = ...
3402    |   ... = A[3]
3403    | endloop_1
3404
3405    in which case the distance vectors are (0) and (1).  */
3406
3407 static void
3408 add_distance_for_zero_overlaps (struct data_dependence_relation *ddr)
3409 {
3410   unsigned i, j;
3411
3412   for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3413     {
3414       subscript_p sub = DDR_SUBSCRIPT (ddr, i);
3415       conflict_function *ca = SUB_CONFLICTS_IN_A (sub);
3416       conflict_function *cb = SUB_CONFLICTS_IN_B (sub);
3417
3418       for (j = 0; j < ca->n; j++)
3419         if (affine_function_zero_p (ca->fns[j]))
3420           {
3421             insert_innermost_unit_dist_vector (ddr);
3422             return;
3423           }
3424
3425       for (j = 0; j < cb->n; j++)
3426         if (affine_function_zero_p (cb->fns[j]))
3427           {
3428             insert_innermost_unit_dist_vector (ddr);
3429             return;
3430           }
3431     }
3432 }
3433
3434 /* Compute the classic per loop distance vector.  DDR is the data
3435    dependence relation to build a vector from.  Return false when fail
3436    to represent the data dependence as a distance vector.  */
3437
3438 static bool
3439 build_classic_dist_vector (struct data_dependence_relation *ddr,
3440                            struct loop *loop_nest)
3441 {
3442   bool init_b = false;
3443   int index_carry = DDR_NB_LOOPS (ddr);
3444   lambda_vector dist_v;
3445
3446   if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
3447     return false;
3448
3449   if (same_access_functions (ddr))
3450     {
3451       /* Save the 0 vector.  */
3452       dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3453       save_dist_v (ddr, dist_v);
3454
3455       if (constant_access_functions (ddr))
3456         add_distance_for_zero_overlaps (ddr);
3457
3458       if (DDR_NB_LOOPS (ddr) > 1)
3459         add_other_self_distances (ddr);
3460
3461       return true;
3462     }
3463
3464   dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3465   if (!build_classic_dist_vector_1 (ddr, DDR_A (ddr), DDR_B (ddr),
3466                                     dist_v, &init_b, &index_carry))
3467     return false;
3468
3469   /* Save the distance vector if we initialized one.  */
3470   if (init_b)
3471     {
3472       /* Verify a basic constraint: classic distance vectors should
3473          always be lexicographically positive.
3474
3475          Data references are collected in the order of execution of
3476          the program, thus for the following loop
3477
3478          | for (i = 1; i < 100; i++)
3479          |   for (j = 1; j < 100; j++)
3480          |     {
3481          |       t = T[j+1][i-1];  // A
3482          |       T[j][i] = t + 2;  // B
3483          |     }
3484
3485          references are collected following the direction of the wind:
3486          A then B.  The data dependence tests are performed also
3487          following this order, such that we're looking at the distance
3488          separating the elements accessed by A from the elements later
3489          accessed by B.  But in this example, the distance returned by
3490          test_dep (A, B) is lexicographically negative (-1, 1), that
3491          means that the access A occurs later than B with respect to
3492          the outer loop, ie. we're actually looking upwind.  In this
3493          case we solve test_dep (B, A) looking downwind to the
3494          lexicographically positive solution, that returns the
3495          distance vector (1, -1).  */
3496       if (!lambda_vector_lexico_pos (dist_v, DDR_NB_LOOPS (ddr)))
3497         {
3498           lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3499           if (!subscript_dependence_tester_1 (ddr, DDR_B (ddr), DDR_A (ddr),
3500                                               loop_nest))
3501             return false;
3502           compute_subscript_distance (ddr);
3503           if (!build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
3504                                             save_v, &init_b, &index_carry))
3505             return false;
3506           save_dist_v (ddr, save_v);
3507           DDR_REVERSED_P (ddr) = true;
3508
3509           /* In this case there is a dependence forward for all the
3510              outer loops:
3511
3512              | for (k = 1; k < 100; k++)
3513              |  for (i = 1; i < 100; i++)
3514              |   for (j = 1; j < 100; j++)
3515              |     {
3516              |       t = T[j+1][i-1];  // A
3517              |       T[j][i] = t + 2;  // B
3518              |     }
3519
3520              the vectors are:
3521              (0,  1, -1)
3522              (1,  1, -1)
3523              (1, -1,  1)
3524           */
3525           if (DDR_NB_LOOPS (ddr) > 1)
3526             {
3527               add_outer_distances (ddr, save_v, index_carry);
3528               add_outer_distances (ddr, dist_v, index_carry);
3529             }
3530         }
3531       else
3532         {
3533           lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3534           lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
3535
3536           if (DDR_NB_LOOPS (ddr) > 1)
3537             {
3538               lambda_vector opposite_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3539
3540               if (!subscript_dependence_tester_1 (ddr, DDR_B (ddr),
3541                                                   DDR_A (ddr), loop_nest))
3542                 return false;
3543               compute_subscript_distance (ddr);
3544               if (!build_classic_dist_vector_1 (ddr, DDR_B (ddr), DDR_A (ddr),
3545                                                 opposite_v, &init_b,
3546                                                 &index_carry))
3547                 return false;
3548
3549               save_dist_v (ddr, save_v);
3550               add_outer_distances (ddr, dist_v, index_carry);
3551               add_outer_distances (ddr, opposite_v, index_carry);
3552             }
3553           else
3554             save_dist_v (ddr, save_v);
3555         }
3556     }
3557   else
3558     {
3559       /* There is a distance of 1 on all the outer loops: Example:
3560          there is a dependence of distance 1 on loop_1 for the array A.
3561
3562          | loop_1
3563          |   A[5] = ...
3564          | endloop
3565       */
3566       add_outer_distances (ddr, dist_v,
3567                            lambda_vector_first_nz (dist_v,
3568                                                    DDR_NB_LOOPS (ddr), 0));
3569     }
3570
3571   if (dump_file && (dump_flags & TDF_DETAILS))
3572     {
3573       unsigned i;
3574
3575       fprintf (dump_file, "(build_classic_dist_vector\n");
3576       for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
3577         {
3578           fprintf (dump_file, "  dist_vector = (");
3579           print_lambda_vector (dump_file, DDR_DIST_VECT (ddr, i),
3580                                DDR_NB_LOOPS (ddr));
3581           fprintf (dump_file, "  )\n");
3582         }
3583       fprintf (dump_file, ")\n");
3584     }
3585
3586   return true;
3587 }
3588
3589 /* Return the direction for a given distance.
3590    FIXME: Computing dir this way is suboptimal, since dir can catch
3591    cases that dist is unable to represent.  */
3592
3593 static inline enum data_dependence_direction
3594 dir_from_dist (int dist)
3595 {
3596   if (dist > 0)
3597     return dir_positive;
3598   else if (dist < 0)
3599     return dir_negative;
3600   else
3601     return dir_equal;
3602 }
3603
3604 /* Compute the classic per loop direction vector.  DDR is the data
3605    dependence relation to build a vector from.  */
3606
3607 static void
3608 build_classic_dir_vector (struct data_dependence_relation *ddr)
3609 {
3610   unsigned i, j;
3611   lambda_vector dist_v;
3612
3613   FOR_EACH_VEC_ELT (DDR_DIST_VECTS (ddr), i, dist_v)
3614     {
3615       lambda_vector dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3616
3617       for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
3618         dir_v[j] = dir_from_dist (dist_v[j]);
3619
3620       save_dir_v (ddr, dir_v);
3621     }
3622 }
3623
3624 /* Helper function.  Returns true when there is a dependence between
3625    data references DRA and DRB.  */
3626
3627 static bool
3628 subscript_dependence_tester_1 (struct data_dependence_relation *ddr,
3629                                struct data_reference *dra,
3630                                struct data_reference *drb,
3631                                struct loop *loop_nest)
3632 {
3633   unsigned int i;
3634   tree last_conflicts;
3635   struct subscript *subscript;
3636   tree res = NULL_TREE;
3637
3638   for (i = 0; DDR_SUBSCRIPTS (ddr).iterate (i, &subscript); i++)
3639     {
3640       conflict_function *overlaps_a, *overlaps_b;
3641
3642       analyze_overlapping_iterations (DR_ACCESS_FN (dra, i),
3643                                       DR_ACCESS_FN (drb, i),
3644                                       &overlaps_a, &overlaps_b,
3645                                       &last_conflicts, loop_nest);
3646
3647       if (SUB_CONFLICTS_IN_A (subscript))
3648         free_conflict_function (SUB_CONFLICTS_IN_A (subscript));
3649       if (SUB_CONFLICTS_IN_B (subscript))
3650         free_conflict_function (SUB_CONFLICTS_IN_B (subscript));
3651
3652       SUB_CONFLICTS_IN_A (subscript) = overlaps_a;
3653       SUB_CONFLICTS_IN_B (subscript) = overlaps_b;
3654       SUB_LAST_CONFLICT (subscript) = last_conflicts;
3655
3656       /* If there is any undetermined conflict function we have to
3657          give a conservative answer in case we cannot prove that
3658          no dependence exists when analyzing another subscript.  */
3659       if (CF_NOT_KNOWN_P (overlaps_a)
3660           || CF_NOT_KNOWN_P (overlaps_b))
3661         {
3662           res = chrec_dont_know;
3663           continue;
3664         }
3665
3666       /* When there is a subscript with no dependence we can stop.  */
3667       else if (CF_NO_DEPENDENCE_P (overlaps_a)
3668                || CF_NO_DEPENDENCE_P (overlaps_b))
3669         {
3670           res = chrec_known;
3671           break;
3672         }
3673     }
3674
3675   if (res == NULL_TREE)
3676     return true;
3677
3678   if (res == chrec_known)
3679     dependence_stats.num_dependence_independent++;
3680   else
3681     dependence_stats.num_dependence_undetermined++;
3682   finalize_ddr_dependent (ddr, res);
3683   return false;
3684 }
3685
3686 /* Computes the conflicting iterations in LOOP_NEST, and initialize DDR.  */
3687
3688 static void
3689 subscript_dependence_tester (struct data_dependence_relation *ddr,
3690                              struct loop *loop_nest)
3691 {
3692   if (subscript_dependence_tester_1 (ddr, DDR_A (ddr), DDR_B (ddr), loop_nest))
3693     dependence_stats.num_dependence_dependent++;
3694
3695   compute_subscript_distance (ddr);
3696   if (build_classic_dist_vector (ddr, loop_nest))
3697     build_classic_dir_vector (ddr);
3698 }
3699
3700 /* Returns true when all the access functions of A are affine or
3701    constant with respect to LOOP_NEST.  */
3702
3703 static bool
3704 access_functions_are_affine_or_constant_p (const struct data_reference *a,
3705                                            const struct loop *loop_nest)
3706 {
3707   unsigned int i;
3708   vec<tree> fns = DR_ACCESS_FNS (a);
3709   tree t;
3710
3711   FOR_EACH_VEC_ELT (fns, i, t)
3712     if (!evolution_function_is_invariant_p (t, loop_nest->num)
3713         && !evolution_function_is_affine_multivariate_p (t, loop_nest->num))
3714       return false;
3715
3716   return true;
3717 }
3718
3719 /* Initializes an equation for an OMEGA problem using the information
3720    contained in the ACCESS_FUN.  Returns true when the operation
3721    succeeded.
3722
3723    PB is the omega constraint system.
3724    EQ is the number of the equation to be initialized.
3725    OFFSET is used for shifting the variables names in the constraints:
3726    a constrain is composed of 2 * the number of variables surrounding
3727    dependence accesses.  OFFSET is set either to 0 for the first n variables,
3728    then it is set to n.
3729    ACCESS_FUN is expected to be an affine chrec.  */
3730
3731 static bool
3732 init_omega_eq_with_af (omega_pb pb, unsigned eq,
3733                        unsigned int offset, tree access_fun,
3734                        struct data_dependence_relation *ddr)
3735 {
3736   switch (TREE_CODE (access_fun))
3737     {
3738     case POLYNOMIAL_CHREC:
3739       {
3740         tree left = CHREC_LEFT (access_fun);
3741         tree right = CHREC_RIGHT (access_fun);
3742         int var = CHREC_VARIABLE (access_fun);
3743         unsigned var_idx;
3744
3745         if (TREE_CODE (right) != INTEGER_CST)
3746           return false;
3747
3748         var_idx = index_in_loop_nest (var, DDR_LOOP_NEST (ddr));
3749         pb->eqs[eq].coef[offset + var_idx + 1] = int_cst_value (right);
3750
3751         /* Compute the innermost loop index.  */
3752         DDR_INNER_LOOP (ddr) = MAX (DDR_INNER_LOOP (ddr), var_idx);
3753
3754         if (offset == 0)
3755           pb->eqs[eq].coef[var_idx + DDR_NB_LOOPS (ddr) + 1]
3756             += int_cst_value (right);
3757
3758         switch (TREE_CODE (left))
3759           {
3760           case POLYNOMIAL_CHREC:
3761             return init_omega_eq_with_af (pb, eq, offset, left, ddr);
3762
3763           case INTEGER_CST:
3764             pb->eqs[eq].coef[0] += int_cst_value (left);
3765             return true;
3766
3767           default:
3768             return false;
3769           }
3770       }
3771
3772     case INTEGER_CST:
3773       pb->eqs[eq].coef[0] += int_cst_value (access_fun);
3774       return true;
3775
3776     default:
3777       return false;
3778     }
3779 }
3780
3781 /* As explained in the comments preceding init_omega_for_ddr, we have
3782    to set up a system for each loop level, setting outer loops
3783    variation to zero, and current loop variation to positive or zero.
3784    Save each lexico positive distance vector.  */
3785
3786 static void
3787 omega_extract_distance_vectors (omega_pb pb,
3788                                 struct data_dependence_relation *ddr)
3789 {
3790   int eq, geq;
3791   unsigned i, j;
3792   struct loop *loopi, *loopj;
3793   enum omega_result res;
3794
3795   /* Set a new problem for each loop in the nest.  The basis is the
3796      problem that we have initialized until now.  On top of this we
3797      add new constraints.  */
3798   for (i = 0; i <= DDR_INNER_LOOP (ddr)
3799               && DDR_LOOP_NEST (ddr).iterate (i, &loopi); i++)
3800     {
3801       int dist = 0;
3802       omega_pb copy = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr),
3803                                            DDR_NB_LOOPS (ddr));
3804
3805       omega_copy_problem (copy, pb);
3806
3807       /* For all the outer loops "loop_j", add "dj = 0".  */
3808       for (j = 0; j < i && DDR_LOOP_NEST (ddr).iterate (j, &loopj); j++)
3809         {
3810           eq = omega_add_zero_eq (copy, omega_black);
3811           copy->eqs[eq].coef[j + 1] = 1;
3812         }
3813
3814       /* For "loop_i", add "0 <= di".  */
3815       geq = omega_add_zero_geq (copy, omega_black);
3816       copy->geqs[geq].coef[i + 1] = 1;
3817
3818       /* Reduce the constraint system, and test that the current
3819          problem is feasible.  */
3820       res = omega_simplify_problem (copy);
3821       if (res == omega_false
3822           || res == omega_unknown
3823           || copy->num_geqs > (int) DDR_NB_LOOPS (ddr))
3824         goto next_problem;
3825
3826       for (eq = 0; eq < copy->num_subs; eq++)
3827         if (copy->subs[eq].key == (int) i + 1)
3828           {
3829             dist = copy->subs[eq].coef[0];
3830             goto found_dist;
3831           }
3832
3833       if (dist == 0)
3834         {
3835           /* Reinitialize problem...  */
3836           omega_copy_problem (copy, pb);
3837           for (j = 0; j < i && DDR_LOOP_NEST (ddr).iterate (j, &loopj); j++)
3838             {
3839               eq = omega_add_zero_eq (copy, omega_black);
3840               copy->eqs[eq].coef[j + 1] = 1;
3841             }
3842
3843           /* ..., but this time "di = 1".  */
3844           eq = omega_add_zero_eq (copy, omega_black);
3845           copy->eqs[eq].coef[i + 1] = 1;
3846           copy->eqs[eq].coef[0] = -1;
3847
3848           res = omega_simplify_problem (copy);
3849           if (res == omega_false
3850               || res == omega_unknown
3851               || copy->num_geqs > (int) DDR_NB_LOOPS (ddr))
3852             goto next_problem;
3853
3854           for (eq = 0; eq < copy->num_subs; eq++)
3855             if (copy->subs[eq].key == (int) i + 1)
3856               {
3857                 dist = copy->subs[eq].coef[0];
3858                 goto found_dist;
3859               }
3860         }
3861
3862     found_dist:;
3863       /* Save the lexicographically positive distance vector.  */
3864       if (dist >= 0)
3865         {
3866           lambda_vector dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3867           lambda_vector dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
3868
3869           dist_v[i] = dist;
3870
3871           for (eq = 0; eq < copy->num_subs; eq++)
3872             if (copy->subs[eq].key > 0)
3873               {
3874                 dist = copy->subs[eq].coef[0];
3875                 dist_v[copy->subs[eq].key - 1] = dist;
3876               }
3877
3878           for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
3879             dir_v[j] = dir_from_dist (dist_v[j]);
3880
3881           save_dist_v (ddr, dist_v);
3882           save_dir_v (ddr, dir_v);
3883         }
3884
3885     next_problem:;
3886       omega_free_problem (copy);
3887     }
3888 }
3889
3890 /* This is called for each subscript of a tuple of data references:
3891    insert an equality for representing the conflicts.  */
3892
3893 static bool
3894 omega_setup_subscript (tree access_fun_a, tree access_fun_b,
3895                        struct data_dependence_relation *ddr,
3896                        omega_pb pb, bool *maybe_dependent)
3897 {
3898   int eq;
3899   tree type = signed_type_for_types (TREE_TYPE (access_fun_a),
3900                                      TREE_TYPE (access_fun_b));
3901   tree fun_a = chrec_convert (type, access_fun_a, NULL);
3902   tree fun_b = chrec_convert (type, access_fun_b, NULL);
3903   tree difference = chrec_fold_minus (type, fun_a, fun_b);
3904   tree minus_one;
3905
3906   /* When the fun_a - fun_b is not constant, the dependence is not
3907      captured by the classic distance vector representation.  */
3908   if (TREE_CODE (difference) != INTEGER_CST)
3909     return false;
3910
3911   /* ZIV test.  */
3912   if (ziv_subscript_p (fun_a, fun_b) && !integer_zerop (difference))
3913     {
3914       /* There is no dependence.  */
3915       *maybe_dependent = false;
3916       return true;
3917     }
3918
3919   minus_one = build_int_cst (type, -1);
3920   fun_b = chrec_fold_multiply (type, fun_b, minus_one);
3921
3922   eq = omega_add_zero_eq (pb, omega_black);
3923   if (!init_omega_eq_with_af (pb, eq, DDR_NB_LOOPS (ddr), fun_a, ddr)
3924       || !init_omega_eq_with_af (pb, eq, 0, fun_b, ddr))
3925     /* There is probably a dependence, but the system of
3926        constraints cannot be built: answer "don't know".  */
3927     return false;
3928
3929   /* GCD test.  */
3930   if (DDR_NB_LOOPS (ddr) != 0 && pb->eqs[eq].coef[0]
3931       && !int_divides_p (lambda_vector_gcd
3932                          ((lambda_vector) &(pb->eqs[eq].coef[1]),
3933                           2 * DDR_NB_LOOPS (ddr)),
3934                          pb->eqs[eq].coef[0]))
3935     {
3936       /* There is no dependence.  */
3937       *maybe_dependent = false;
3938       return true;
3939     }
3940
3941   return true;
3942 }
3943
3944 /* Helper function, same as init_omega_for_ddr but specialized for
3945    data references A and B.  */
3946
3947 static bool
3948 init_omega_for_ddr_1 (struct data_reference *dra, struct data_reference *drb,
3949                       struct data_dependence_relation *ddr,
3950                       omega_pb pb, bool *maybe_dependent)
3951 {
3952   unsigned i;
3953   int ineq;
3954   struct loop *loopi;
3955   unsigned nb_loops = DDR_NB_LOOPS (ddr);
3956
3957   /* Insert an equality per subscript.  */
3958   for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
3959     {
3960       if (!omega_setup_subscript (DR_ACCESS_FN (dra, i), DR_ACCESS_FN (drb, i),
3961                                   ddr, pb, maybe_dependent))
3962         return false;
3963       else if (*maybe_dependent == false)
3964         {
3965           /* There is no dependence.  */
3966           DDR_ARE_DEPENDENT (ddr) = chrec_known;
3967           return true;
3968         }
3969     }
3970
3971   /* Insert inequalities: constraints corresponding to the iteration
3972      domain, i.e. the loops surrounding the references "loop_x" and
3973      the distance variables "dx".  The layout of the OMEGA
3974      representation is as follows:
3975      - coef[0] is the constant
3976      - coef[1..nb_loops] are the protected variables that will not be
3977      removed by the solver: the "dx"
3978      - coef[nb_loops + 1, 2*nb_loops] are the loop variables: "loop_x".
3979   */
3980   for (i = 0; i <= DDR_INNER_LOOP (ddr)
3981               && DDR_LOOP_NEST (ddr).iterate (i, &loopi); i++)
3982     {
3983       HOST_WIDE_INT nbi = max_stmt_executions_int (loopi);
3984
3985       /* 0 <= loop_x */
3986       ineq = omega_add_zero_geq (pb, omega_black);
3987       pb->geqs[ineq].coef[i + nb_loops + 1] = 1;
3988
3989       /* 0 <= loop_x + dx */
3990       ineq = omega_add_zero_geq (pb, omega_black);
3991       pb->geqs[ineq].coef[i + nb_loops + 1] = 1;
3992       pb->geqs[ineq].coef[i + 1] = 1;
3993
3994       if (nbi != -1)
3995         {
3996           /* loop_x <= nb_iters */
3997           ineq = omega_add_zero_geq (pb, omega_black);
3998           pb->geqs[ineq].coef[i + nb_loops + 1] = -1;
3999           pb->geqs[ineq].coef[0] = nbi;
4000
4001           /* loop_x + dx <= nb_iters */
4002           ineq = omega_add_zero_geq (pb, omega_black);
4003           pb->geqs[ineq].coef[i + nb_loops + 1] = -1;
4004           pb->geqs[ineq].coef[i + 1] = -1;
4005           pb->geqs[ineq].coef[0] = nbi;
4006
4007           /* A step "dx" bigger than nb_iters is not feasible, so
4008              add "0 <= nb_iters + dx",  */
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           /* and "dx <= nb_iters".  */
4013           ineq = omega_add_zero_geq (pb, omega_black);
4014           pb->geqs[ineq].coef[i + 1] = -1;
4015           pb->geqs[ineq].coef[0] = nbi;
4016         }
4017     }
4018
4019   omega_extract_distance_vectors (pb, ddr);
4020
4021   return true;
4022 }
4023
4024 /* Sets up the Omega dependence problem for the data dependence
4025    relation DDR.  Returns false when the constraint system cannot be
4026    built, ie. when the test answers "don't know".  Returns true
4027    otherwise, and when independence has been proved (using one of the
4028    trivial dependence test), set MAYBE_DEPENDENT to false, otherwise
4029    set MAYBE_DEPENDENT to true.
4030
4031    Example: for setting up the dependence system corresponding to the
4032    conflicting accesses
4033
4034    | loop_i
4035    |   loop_j
4036    |     A[i, i+1] = ...
4037    |     ... A[2*j, 2*(i + j)]
4038    |   endloop_j
4039    | endloop_i
4040
4041    the following constraints come from the iteration domain:
4042
4043    0 <= i <= Ni
4044    0 <= i + di <= Ni
4045    0 <= j <= Nj
4046    0 <= j + dj <= Nj
4047
4048    where di, dj are the distance variables.  The constraints
4049    representing the conflicting elements are:
4050
4051    i = 2 * (j + dj)
4052    i + 1 = 2 * (i + di + j + dj)
4053
4054    For asking that the resulting distance vector (di, dj) be
4055    lexicographically positive, we insert the constraint "di >= 0".  If
4056    "di = 0" in the solution, we fix that component to zero, and we
4057    look at the inner loops: we set a new problem where all the outer
4058    loop distances are zero, and fix this inner component to be
4059    positive.  When one of the components is positive, we save that
4060    distance, and set a new problem where the distance on this loop is
4061    zero, searching for other distances in the inner loops.  Here is
4062    the classic example that illustrates that we have to set for each
4063    inner loop a new problem:
4064
4065    | loop_1
4066    |   loop_2
4067    |     A[10]
4068    |   endloop_2
4069    | endloop_1
4070
4071    we have to save two distances (1, 0) and (0, 1).
4072
4073    Given two array references, refA and refB, we have to set the
4074    dependence problem twice, refA vs. refB and refB vs. refA, and we
4075    cannot do a single test, as refB might occur before refA in the
4076    inner loops, and the contrary when considering outer loops: ex.
4077
4078    | loop_0
4079    |   loop_1
4080    |     loop_2
4081    |       T[{1,+,1}_2][{1,+,1}_1]  // refA
4082    |       T[{2,+,1}_2][{0,+,1}_1]  // refB
4083    |     endloop_2
4084    |   endloop_1
4085    | endloop_0
4086
4087    refB touches the elements in T before refA, and thus for the same
4088    loop_0 refB precedes refA: ie. the distance vector (0, 1, -1)
4089    but for successive loop_0 iterations, we have (1, -1, 1)
4090
4091    The Omega solver expects the distance variables ("di" in the
4092    previous example) to come first in the constraint system (as
4093    variables to be protected, or "safe" variables), the constraint
4094    system is built using the following layout:
4095
4096    "cst | distance vars | index vars".
4097 */
4098
4099 static bool
4100 init_omega_for_ddr (struct data_dependence_relation *ddr,
4101                     bool *maybe_dependent)
4102 {
4103   omega_pb pb;
4104   bool res = false;
4105
4106   *maybe_dependent = true;
4107
4108   if (same_access_functions (ddr))
4109     {
4110       unsigned j;
4111       lambda_vector dir_v;
4112
4113       /* Save the 0 vector.  */
4114       save_dist_v (ddr, lambda_vector_new (DDR_NB_LOOPS (ddr)));
4115       dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4116       for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
4117         dir_v[j] = dir_equal;
4118       save_dir_v (ddr, dir_v);
4119
4120       /* Save the dependences carried by outer loops.  */
4121       pb = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr), DDR_NB_LOOPS (ddr));
4122       res = init_omega_for_ddr_1 (DDR_A (ddr), DDR_B (ddr), ddr, pb,
4123                                   maybe_dependent);
4124       omega_free_problem (pb);
4125       return res;
4126     }
4127
4128   /* Omega expects the protected variables (those that have to be kept
4129      after elimination) to appear first in the constraint system.
4130      These variables are the distance variables.  In the following
4131      initialization we declare NB_LOOPS safe variables, and the total
4132      number of variables for the constraint system is 2*NB_LOOPS.  */
4133   pb = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr), DDR_NB_LOOPS (ddr));
4134   res = init_omega_for_ddr_1 (DDR_A (ddr), DDR_B (ddr), ddr, pb,
4135                               maybe_dependent);
4136   omega_free_problem (pb);
4137
4138   /* Stop computation if not decidable, or no dependence.  */
4139   if (res == false || *maybe_dependent == false)
4140     return res;
4141
4142   pb = omega_alloc_problem (2 * DDR_NB_LOOPS (ddr), DDR_NB_LOOPS (ddr));
4143   res = init_omega_for_ddr_1 (DDR_B (ddr), DDR_A (ddr), ddr, pb,
4144                               maybe_dependent);
4145   omega_free_problem (pb);
4146
4147   return res;
4148 }
4149
4150 /* Return true when DDR contains the same information as that stored
4151    in DIR_VECTS and in DIST_VECTS, return false otherwise.   */
4152
4153 static bool
4154 ddr_consistent_p (FILE *file,
4155                   struct data_dependence_relation *ddr,
4156                   vec<lambda_vector> dist_vects,
4157                   vec<lambda_vector> dir_vects)
4158 {
4159   unsigned int i, j;
4160
4161   /* If dump_file is set, output there.  */
4162   if (dump_file && (dump_flags & TDF_DETAILS))
4163     file = dump_file;
4164
4165   if (dist_vects.length () != DDR_NUM_DIST_VECTS (ddr))
4166     {
4167       lambda_vector b_dist_v;
4168       fprintf (file, "\n(Number of distance vectors differ: Banerjee has %d, Omega has %d.\n",
4169                dist_vects.length (),
4170                DDR_NUM_DIST_VECTS (ddr));
4171
4172       fprintf (file, "Banerjee dist vectors:\n");
4173       FOR_EACH_VEC_ELT (dist_vects, i, b_dist_v)
4174         print_lambda_vector (file, b_dist_v, DDR_NB_LOOPS (ddr));
4175
4176       fprintf (file, "Omega dist vectors:\n");
4177       for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
4178         print_lambda_vector (file, DDR_DIST_VECT (ddr, i), DDR_NB_LOOPS (ddr));
4179
4180       fprintf (file, "data dependence relation:\n");
4181       dump_data_dependence_relation (file, ddr);
4182
4183       fprintf (file, ")\n");
4184       return false;
4185     }
4186
4187   if (dir_vects.length () != DDR_NUM_DIR_VECTS (ddr))
4188     {
4189       fprintf (file, "\n(Number of direction vectors differ: Banerjee has %d, Omega has %d.)\n",
4190                dir_vects.length (),
4191                DDR_NUM_DIR_VECTS (ddr));
4192       return false;
4193     }
4194
4195   for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
4196     {
4197       lambda_vector a_dist_v;
4198       lambda_vector b_dist_v = DDR_DIST_VECT (ddr, i);
4199
4200       /* Distance vectors are not ordered in the same way in the DDR
4201          and in the DIST_VECTS: search for a matching vector.  */
4202       FOR_EACH_VEC_ELT (dist_vects, j, a_dist_v)
4203         if (lambda_vector_equal (a_dist_v, b_dist_v, DDR_NB_LOOPS (ddr)))
4204           break;
4205
4206       if (j == dist_vects.length ())
4207         {
4208           fprintf (file, "\n(Dist vectors from the first dependence analyzer:\n");
4209           print_dist_vectors (file, dist_vects, DDR_NB_LOOPS (ddr));
4210           fprintf (file, "not found in Omega dist vectors:\n");
4211           print_dist_vectors (file, DDR_DIST_VECTS (ddr), DDR_NB_LOOPS (ddr));
4212           fprintf (file, "data dependence relation:\n");
4213           dump_data_dependence_relation (file, ddr);
4214           fprintf (file, ")\n");
4215         }
4216     }
4217
4218   for (i = 0; i < DDR_NUM_DIR_VECTS (ddr); i++)
4219     {
4220       lambda_vector a_dir_v;
4221       lambda_vector b_dir_v = DDR_DIR_VECT (ddr, i);
4222
4223       /* Direction vectors are not ordered in the same way in the DDR
4224          and in the DIR_VECTS: search for a matching vector.  */
4225       FOR_EACH_VEC_ELT (dir_vects, j, a_dir_v)
4226         if (lambda_vector_equal (a_dir_v, b_dir_v, DDR_NB_LOOPS (ddr)))
4227           break;
4228
4229       if (j == dist_vects.length ())
4230         {
4231           fprintf (file, "\n(Dir vectors from the first dependence analyzer:\n");
4232           print_dir_vectors (file, dir_vects, DDR_NB_LOOPS (ddr));
4233           fprintf (file, "not found in Omega dir vectors:\n");
4234           print_dir_vectors (file, DDR_DIR_VECTS (ddr), DDR_NB_LOOPS (ddr));
4235           fprintf (file, "data dependence relation:\n");
4236           dump_data_dependence_relation (file, ddr);
4237           fprintf (file, ")\n");
4238         }
4239     }
4240
4241   return true;
4242 }
4243
4244 /* This computes the affine dependence relation between A and B with
4245    respect to LOOP_NEST.  CHREC_KNOWN is used for representing the
4246    independence between two accesses, while CHREC_DONT_KNOW is used
4247    for representing the unknown relation.
4248
4249    Note that it is possible to stop the computation of the dependence
4250    relation the first time we detect a CHREC_KNOWN element for a given
4251    subscript.  */
4252
4253 void
4254 compute_affine_dependence (struct data_dependence_relation *ddr,
4255                            struct loop *loop_nest)
4256 {
4257   struct data_reference *dra = DDR_A (ddr);
4258   struct data_reference *drb = DDR_B (ddr);
4259
4260   if (dump_file && (dump_flags & TDF_DETAILS))
4261     {
4262       fprintf (dump_file, "(compute_affine_dependence\n");
4263       fprintf (dump_file, "  stmt_a: ");
4264       print_gimple_stmt (dump_file, DR_STMT (dra), 0, TDF_SLIM);
4265       fprintf (dump_file, "  stmt_b: ");
4266       print_gimple_stmt (dump_file, DR_STMT (drb), 0, TDF_SLIM);
4267     }
4268
4269   /* Analyze only when the dependence relation is not yet known.  */
4270   if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
4271     {
4272       dependence_stats.num_dependence_tests++;
4273
4274       if (access_functions_are_affine_or_constant_p (dra, loop_nest)
4275           && access_functions_are_affine_or_constant_p (drb, loop_nest))
4276         {
4277           subscript_dependence_tester (ddr, loop_nest);
4278
4279           if (flag_check_data_deps)
4280             {
4281               /* Dump the dependences from the first algorithm.  */
4282               if (dump_file && (dump_flags & TDF_DETAILS))
4283                 {
4284                   fprintf (dump_file, "\n\nBanerjee Analyzer\n");
4285                   dump_data_dependence_relation (dump_file, ddr);
4286                 }
4287
4288               if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
4289                 {
4290                   bool maybe_dependent;
4291                   vec<lambda_vector> dir_vects, dist_vects;
4292
4293                   /* Save the result of the first DD analyzer.  */
4294                   dist_vects = DDR_DIST_VECTS (ddr);
4295                   dir_vects = DDR_DIR_VECTS (ddr);
4296
4297                   /* Reset the information.  */
4298                   DDR_DIST_VECTS (ddr).create (0);
4299                   DDR_DIR_VECTS (ddr).create (0);
4300
4301                   /* Compute the same information using Omega.  */
4302                   if (!init_omega_for_ddr (ddr, &maybe_dependent))
4303                     goto csys_dont_know;
4304
4305                   if (dump_file && (dump_flags & TDF_DETAILS))
4306                     {
4307                       fprintf (dump_file, "Omega Analyzer\n");
4308                       dump_data_dependence_relation (dump_file, ddr);
4309                     }
4310
4311                   /* Check that we get the same information.  */
4312                   if (maybe_dependent)
4313                     gcc_assert (ddr_consistent_p (stderr, ddr, dist_vects,
4314                                                   dir_vects));
4315                 }
4316             }
4317         }
4318
4319       /* As a last case, if the dependence cannot be determined, or if
4320          the dependence is considered too difficult to determine, answer
4321          "don't know".  */
4322       else
4323         {
4324         csys_dont_know:;
4325           dependence_stats.num_dependence_undetermined++;
4326
4327           if (dump_file && (dump_flags & TDF_DETAILS))
4328             {
4329               fprintf (dump_file, "Data ref a:\n");
4330               dump_data_reference (dump_file, dra);
4331               fprintf (dump_file, "Data ref b:\n");
4332               dump_data_reference (dump_file, drb);
4333               fprintf (dump_file, "affine dependence test not usable: access function not affine or constant.\n");
4334             }
4335           finalize_ddr_dependent (ddr, chrec_dont_know);
4336         }
4337     }
4338
4339   if (dump_file && (dump_flags & TDF_DETAILS))
4340     {
4341       if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
4342         fprintf (dump_file, ") -> no dependence\n");
4343       else if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
4344         fprintf (dump_file, ") -> dependence analysis failed\n");
4345       else
4346         fprintf (dump_file, ")\n");
4347     }
4348 }
4349
4350 /* Compute in DEPENDENCE_RELATIONS the data dependence graph for all
4351    the data references in DATAREFS, in the LOOP_NEST.  When
4352    COMPUTE_SELF_AND_RR is FALSE, don't compute read-read and self
4353    relations.  Return true when successful, i.e. data references number
4354    is small enough to be handled.  */
4355
4356 bool
4357 compute_all_dependences (vec<data_reference_p> datarefs,
4358                          vec<ddr_p> *dependence_relations,
4359                          vec<loop_p> loop_nest,
4360                          bool compute_self_and_rr)
4361 {
4362   struct data_dependence_relation *ddr;
4363   struct data_reference *a, *b;
4364   unsigned int i, j;
4365
4366   if ((int) datarefs.length ()
4367       > PARAM_VALUE (PARAM_LOOP_MAX_DATAREFS_FOR_DATADEPS))
4368     {
4369       struct data_dependence_relation *ddr;
4370
4371       /* Insert a single relation into dependence_relations:
4372          chrec_dont_know.  */
4373       ddr = initialize_data_dependence_relation (NULL, NULL, loop_nest);
4374       dependence_relations->safe_push (ddr);
4375       return false;
4376     }
4377
4378   FOR_EACH_VEC_ELT (datarefs, i, a)
4379     for (j = i + 1; datarefs.iterate (j, &b); j++)
4380       if (DR_IS_WRITE (a) || DR_IS_WRITE (b) || compute_self_and_rr)
4381         {
4382           ddr = initialize_data_dependence_relation (a, b, loop_nest);
4383           dependence_relations->safe_push (ddr);
4384           if (loop_nest.exists ())
4385             compute_affine_dependence (ddr, loop_nest[0]);
4386         }
4387
4388   if (compute_self_and_rr)
4389     FOR_EACH_VEC_ELT (datarefs, i, a)
4390       {
4391         ddr = initialize_data_dependence_relation (a, a, loop_nest);
4392         dependence_relations->safe_push (ddr);
4393         if (loop_nest.exists ())
4394           compute_affine_dependence (ddr, loop_nest[0]);
4395       }
4396
4397   return true;
4398 }
4399
4400 /* Describes a location of a memory reference.  */
4401
4402 typedef struct data_ref_loc_d
4403 {
4404   /* The memory reference.  */
4405   tree ref;
4406
4407   /* True if the memory reference is read.  */
4408   bool is_read;
4409 } data_ref_loc;
4410
4411
4412 /* Stores the locations of memory references in STMT to REFERENCES.  Returns
4413    true if STMT clobbers memory, false otherwise.  */
4414
4415 static bool
4416 get_references_in_stmt (gimple stmt, vec<data_ref_loc, va_heap> *references)
4417 {
4418   bool clobbers_memory = false;
4419   data_ref_loc ref;
4420   tree op0, op1;
4421   enum gimple_code stmt_code = gimple_code (stmt);
4422
4423   /* ASM_EXPR and CALL_EXPR may embed arbitrary side effects.
4424      As we cannot model data-references to not spelled out
4425      accesses give up if they may occur.  */
4426   if (stmt_code == GIMPLE_CALL
4427       && !(gimple_call_flags (stmt) & ECF_CONST))
4428     {
4429       /* Allow IFN_GOMP_SIMD_LANE in their own loops.  */
4430       if (gimple_call_internal_p (stmt))
4431         switch (gimple_call_internal_fn (stmt))
4432           {
4433           case IFN_GOMP_SIMD_LANE:
4434             {
4435               struct loop *loop = gimple_bb (stmt)->loop_father;
4436               tree uid = gimple_call_arg (stmt, 0);
4437               gcc_assert (TREE_CODE (uid) == SSA_NAME);
4438               if (loop == NULL
4439                   || loop->simduid != SSA_NAME_VAR (uid))
4440                 clobbers_memory = true;
4441               break;
4442             }
4443           case IFN_MASK_LOAD:
4444           case IFN_MASK_STORE:
4445             break;
4446           default:
4447             clobbers_memory = true;
4448             break;
4449           }
4450       else
4451         clobbers_memory = true;
4452     }
4453   else if (stmt_code == GIMPLE_ASM
4454            && (gimple_asm_volatile_p (as_a <gasm *> (stmt))
4455                || gimple_vuse (stmt)))
4456     clobbers_memory = true;
4457
4458   if (!gimple_vuse (stmt))
4459     return clobbers_memory;
4460
4461   if (stmt_code == GIMPLE_ASSIGN)
4462     {
4463       tree base;
4464       op0 = gimple_assign_lhs (stmt);
4465       op1 = gimple_assign_rhs1 (stmt);
4466
4467       if (DECL_P (op1)
4468           || (REFERENCE_CLASS_P (op1)
4469               && (base = get_base_address (op1))
4470               && TREE_CODE (base) != SSA_NAME))
4471         {
4472           ref.ref = op1;
4473           ref.is_read = true;
4474           references->safe_push (ref);
4475         }
4476     }
4477   else if (stmt_code == GIMPLE_CALL)
4478     {
4479       unsigned i, n;
4480
4481       ref.is_read = false;
4482       if (gimple_call_internal_p (stmt))
4483         switch (gimple_call_internal_fn (stmt))
4484           {
4485           case IFN_MASK_LOAD:
4486             if (gimple_call_lhs (stmt) == NULL_TREE)
4487               break;
4488             ref.is_read = true;
4489           case IFN_MASK_STORE:
4490             ref.ref = fold_build2 (MEM_REF,
4491                                    ref.is_read
4492                                    ? TREE_TYPE (gimple_call_lhs (stmt))
4493                                    : TREE_TYPE (gimple_call_arg (stmt, 3)),
4494                                    gimple_call_arg (stmt, 0),
4495                                    gimple_call_arg (stmt, 1));
4496             references->safe_push (ref);
4497             return false;
4498           default:
4499             break;
4500           }
4501
4502       op0 = gimple_call_lhs (stmt);
4503       n = gimple_call_num_args (stmt);
4504       for (i = 0; i < n; i++)
4505         {
4506           op1 = gimple_call_arg (stmt, i);
4507
4508           if (DECL_P (op1)
4509               || (REFERENCE_CLASS_P (op1) && get_base_address (op1)))
4510             {
4511               ref.ref = op1;
4512               ref.is_read = true;
4513               references->safe_push (ref);
4514             }
4515         }
4516     }
4517   else
4518     return clobbers_memory;
4519
4520   if (op0
4521       && (DECL_P (op0)
4522           || (REFERENCE_CLASS_P (op0) && get_base_address (op0))))
4523     {
4524       ref.ref = op0;
4525       ref.is_read = false;
4526       references->safe_push (ref);
4527     }
4528   return clobbers_memory;
4529 }
4530
4531 /* Stores the data references in STMT to DATAREFS.  If there is an unanalyzable
4532    reference, returns false, otherwise returns true.  NEST is the outermost
4533    loop of the loop nest in which the references should be analyzed.  */
4534
4535 bool
4536 find_data_references_in_stmt (struct loop *nest, gimple stmt,
4537                               vec<data_reference_p> *datarefs)
4538 {
4539   unsigned i;
4540   auto_vec<data_ref_loc, 2> references;
4541   data_ref_loc *ref;
4542   bool ret = true;
4543   data_reference_p dr;
4544
4545   if (get_references_in_stmt (stmt, &references))
4546     return false;
4547
4548   FOR_EACH_VEC_ELT (references, i, ref)
4549     {
4550       dr = create_data_ref (nest, loop_containing_stmt (stmt),
4551                             ref->ref, stmt, ref->is_read);
4552       gcc_assert (dr != NULL);
4553       datarefs->safe_push (dr);
4554     }
4555   references.release ();
4556   return ret;
4557 }
4558
4559 /* Stores the data references in STMT to DATAREFS.  If there is an
4560    unanalyzable reference, returns false, otherwise returns true.
4561    NEST is the outermost loop of the loop nest in which the references
4562    should be instantiated, LOOP is the loop in which the references
4563    should be analyzed.  */
4564
4565 bool
4566 graphite_find_data_references_in_stmt (loop_p nest, loop_p loop, gimple stmt,
4567                                        vec<data_reference_p> *datarefs)
4568 {
4569   unsigned i;
4570   auto_vec<data_ref_loc, 2> references;
4571   data_ref_loc *ref;
4572   bool ret = true;
4573   data_reference_p dr;
4574
4575   if (get_references_in_stmt (stmt, &references))
4576     return false;
4577
4578   FOR_EACH_VEC_ELT (references, i, ref)
4579     {
4580       dr = create_data_ref (nest, loop, ref->ref, stmt, ref->is_read);
4581       gcc_assert (dr != NULL);
4582       datarefs->safe_push (dr);
4583     }
4584
4585   references.release ();
4586   return ret;
4587 }
4588
4589 /* Search the data references in LOOP, and record the information into
4590    DATAREFS.  Returns chrec_dont_know when failing to analyze a
4591    difficult case, returns NULL_TREE otherwise.  */
4592
4593 tree
4594 find_data_references_in_bb (struct loop *loop, basic_block bb,
4595                             vec<data_reference_p> *datarefs)
4596 {
4597   gimple_stmt_iterator bsi;
4598
4599   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
4600     {
4601       gimple stmt = gsi_stmt (bsi);
4602
4603       if (!find_data_references_in_stmt (loop, stmt, datarefs))
4604         {
4605           struct data_reference *res;
4606           res = XCNEW (struct data_reference);
4607           datarefs->safe_push (res);
4608
4609           return chrec_dont_know;
4610         }
4611     }
4612
4613   return NULL_TREE;
4614 }
4615
4616 /* Search the data references in LOOP, and record the information into
4617    DATAREFS.  Returns chrec_dont_know when failing to analyze a
4618    difficult case, returns NULL_TREE otherwise.
4619
4620    TODO: This function should be made smarter so that it can handle address
4621    arithmetic as if they were array accesses, etc.  */
4622
4623 tree
4624 find_data_references_in_loop (struct loop *loop,
4625                               vec<data_reference_p> *datarefs)
4626 {
4627   basic_block bb, *bbs;
4628   unsigned int i;
4629
4630   bbs = get_loop_body_in_dom_order (loop);
4631
4632   for (i = 0; i < loop->num_nodes; i++)
4633     {
4634       bb = bbs[i];
4635
4636       if (find_data_references_in_bb (loop, bb, datarefs) == chrec_dont_know)
4637         {
4638           free (bbs);
4639           return chrec_dont_know;
4640         }
4641     }
4642   free (bbs);
4643
4644   return NULL_TREE;
4645 }
4646
4647 /* Recursive helper function.  */
4648
4649 static bool
4650 find_loop_nest_1 (struct loop *loop, vec<loop_p> *loop_nest)
4651 {
4652   /* Inner loops of the nest should not contain siblings.  Example:
4653      when there are two consecutive loops,
4654
4655      | loop_0
4656      |   loop_1
4657      |     A[{0, +, 1}_1]
4658      |   endloop_1
4659      |   loop_2
4660      |     A[{0, +, 1}_2]
4661      |   endloop_2
4662      | endloop_0
4663
4664      the dependence relation cannot be captured by the distance
4665      abstraction.  */
4666   if (loop->next)
4667     return false;
4668
4669   loop_nest->safe_push (loop);
4670   if (loop->inner)
4671     return find_loop_nest_1 (loop->inner, loop_nest);
4672   return true;
4673 }
4674
4675 /* Return false when the LOOP is not well nested.  Otherwise return
4676    true and insert in LOOP_NEST the loops of the nest.  LOOP_NEST will
4677    contain the loops from the outermost to the innermost, as they will
4678    appear in the classic distance vector.  */
4679
4680 bool
4681 find_loop_nest (struct loop *loop, vec<loop_p> *loop_nest)
4682 {
4683   loop_nest->safe_push (loop);
4684   if (loop->inner)
4685     return find_loop_nest_1 (loop->inner, loop_nest);
4686   return true;
4687 }
4688
4689 /* Returns true when the data dependences have been computed, false otherwise.
4690    Given a loop nest LOOP, the following vectors are returned:
4691    DATAREFS is initialized to all the array elements contained in this loop,
4692    DEPENDENCE_RELATIONS contains the relations between the data references.
4693    Compute read-read and self relations if
4694    COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE.  */
4695
4696 bool
4697 compute_data_dependences_for_loop (struct loop *loop,
4698                                    bool compute_self_and_read_read_dependences,
4699                                    vec<loop_p> *loop_nest,
4700                                    vec<data_reference_p> *datarefs,
4701                                    vec<ddr_p> *dependence_relations)
4702 {
4703   bool res = true;
4704
4705   memset (&dependence_stats, 0, sizeof (dependence_stats));
4706
4707   /* If the loop nest is not well formed, or one of the data references
4708      is not computable, give up without spending time to compute other
4709      dependences.  */
4710   if (!loop
4711       || !find_loop_nest (loop, loop_nest)
4712       || find_data_references_in_loop (loop, datarefs) == chrec_dont_know
4713       || !compute_all_dependences (*datarefs, dependence_relations, *loop_nest,
4714                                    compute_self_and_read_read_dependences))
4715     res = false;
4716
4717   if (dump_file && (dump_flags & TDF_STATS))
4718     {
4719       fprintf (dump_file, "Dependence tester statistics:\n");
4720
4721       fprintf (dump_file, "Number of dependence tests: %d\n",
4722                dependence_stats.num_dependence_tests);
4723       fprintf (dump_file, "Number of dependence tests classified dependent: %d\n",
4724                dependence_stats.num_dependence_dependent);
4725       fprintf (dump_file, "Number of dependence tests classified independent: %d\n",
4726                dependence_stats.num_dependence_independent);
4727       fprintf (dump_file, "Number of undetermined dependence tests: %d\n",
4728                dependence_stats.num_dependence_undetermined);
4729
4730       fprintf (dump_file, "Number of subscript tests: %d\n",
4731                dependence_stats.num_subscript_tests);
4732       fprintf (dump_file, "Number of undetermined subscript tests: %d\n",
4733                dependence_stats.num_subscript_undetermined);
4734       fprintf (dump_file, "Number of same subscript function: %d\n",
4735                dependence_stats.num_same_subscript_function);
4736
4737       fprintf (dump_file, "Number of ziv tests: %d\n",
4738                dependence_stats.num_ziv);
4739       fprintf (dump_file, "Number of ziv tests returning dependent: %d\n",
4740                dependence_stats.num_ziv_dependent);
4741       fprintf (dump_file, "Number of ziv tests returning independent: %d\n",
4742                dependence_stats.num_ziv_independent);
4743       fprintf (dump_file, "Number of ziv tests unimplemented: %d\n",
4744                dependence_stats.num_ziv_unimplemented);
4745
4746       fprintf (dump_file, "Number of siv tests: %d\n",
4747                dependence_stats.num_siv);
4748       fprintf (dump_file, "Number of siv tests returning dependent: %d\n",
4749                dependence_stats.num_siv_dependent);
4750       fprintf (dump_file, "Number of siv tests returning independent: %d\n",
4751                dependence_stats.num_siv_independent);
4752       fprintf (dump_file, "Number of siv tests unimplemented: %d\n",
4753                dependence_stats.num_siv_unimplemented);
4754
4755       fprintf (dump_file, "Number of miv tests: %d\n",
4756                dependence_stats.num_miv);
4757       fprintf (dump_file, "Number of miv tests returning dependent: %d\n",
4758                dependence_stats.num_miv_dependent);
4759       fprintf (dump_file, "Number of miv tests returning independent: %d\n",
4760                dependence_stats.num_miv_independent);
4761       fprintf (dump_file, "Number of miv tests unimplemented: %d\n",
4762                dependence_stats.num_miv_unimplemented);
4763     }
4764
4765   return res;
4766 }
4767
4768 /* Returns true when the data dependences for the basic block BB have been
4769    computed, false otherwise.
4770    DATAREFS is initialized to all the array elements contained in this basic
4771    block, DEPENDENCE_RELATIONS contains the relations between the data
4772    references. Compute read-read and self relations if
4773    COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE.  */
4774 bool
4775 compute_data_dependences_for_bb (basic_block bb,
4776                                  bool compute_self_and_read_read_dependences,
4777                                  vec<data_reference_p> *datarefs,
4778                                  vec<ddr_p> *dependence_relations)
4779 {
4780   if (find_data_references_in_bb (NULL, bb, datarefs) == chrec_dont_know)
4781     return false;
4782
4783   return compute_all_dependences (*datarefs, dependence_relations, vNULL,
4784                                   compute_self_and_read_read_dependences);
4785 }
4786
4787 /* Entry point (for testing only).  Analyze all the data references
4788    and the dependence relations in LOOP.
4789
4790    The data references are computed first.
4791
4792    A relation on these nodes is represented by a complete graph.  Some
4793    of the relations could be of no interest, thus the relations can be
4794    computed on demand.
4795
4796    In the following function we compute all the relations.  This is
4797    just a first implementation that is here for:
4798    - for showing how to ask for the dependence relations,
4799    - for the debugging the whole dependence graph,
4800    - for the dejagnu testcases and maintenance.
4801
4802    It is possible to ask only for a part of the graph, avoiding to
4803    compute the whole dependence graph.  The computed dependences are
4804    stored in a knowledge base (KB) such that later queries don't
4805    recompute the same information.  The implementation of this KB is
4806    transparent to the optimizer, and thus the KB can be changed with a
4807    more efficient implementation, or the KB could be disabled.  */
4808 static void
4809 analyze_all_data_dependences (struct loop *loop)
4810 {
4811   unsigned int i;
4812   int nb_data_refs = 10;
4813   vec<data_reference_p> datarefs;
4814   datarefs.create (nb_data_refs);
4815   vec<ddr_p> dependence_relations;
4816   dependence_relations.create (nb_data_refs * nb_data_refs);
4817   vec<loop_p> loop_nest;
4818   loop_nest.create (3);
4819
4820   /* Compute DDs on the whole function.  */
4821   compute_data_dependences_for_loop (loop, false, &loop_nest, &datarefs,
4822                                      &dependence_relations);
4823
4824   if (dump_file)
4825     {
4826       dump_data_dependence_relations (dump_file, dependence_relations);
4827       fprintf (dump_file, "\n\n");
4828
4829       if (dump_flags & TDF_DETAILS)
4830         dump_dist_dir_vectors (dump_file, dependence_relations);
4831
4832       if (dump_flags & TDF_STATS)
4833         {
4834           unsigned nb_top_relations = 0;
4835           unsigned nb_bot_relations = 0;
4836           unsigned nb_chrec_relations = 0;
4837           struct data_dependence_relation *ddr;
4838
4839           FOR_EACH_VEC_ELT (dependence_relations, i, ddr)
4840             {
4841               if (chrec_contains_undetermined (DDR_ARE_DEPENDENT (ddr)))
4842                 nb_top_relations++;
4843
4844               else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
4845                 nb_bot_relations++;
4846
4847               else
4848                 nb_chrec_relations++;
4849             }
4850
4851           gather_stats_on_scev_database ();
4852         }
4853     }
4854
4855   loop_nest.release ();
4856   free_dependence_relations (dependence_relations);
4857   free_data_refs (datarefs);
4858 }
4859
4860 /* Computes all the data dependences and check that the results of
4861    several analyzers are the same.  */
4862
4863 void
4864 tree_check_data_deps (void)
4865 {
4866   struct loop *loop_nest;
4867
4868   FOR_EACH_LOOP (loop_nest, 0)
4869     analyze_all_data_dependences (loop_nest);
4870 }
4871
4872 /* Free the memory used by a data dependence relation DDR.  */
4873
4874 void
4875 free_dependence_relation (struct data_dependence_relation *ddr)
4876 {
4877   if (ddr == NULL)
4878     return;
4879
4880   if (DDR_SUBSCRIPTS (ddr).exists ())
4881     free_subscripts (DDR_SUBSCRIPTS (ddr));
4882   DDR_DIST_VECTS (ddr).release ();
4883   DDR_DIR_VECTS (ddr).release ();
4884
4885   free (ddr);
4886 }
4887
4888 /* Free the memory used by the data dependence relations from
4889    DEPENDENCE_RELATIONS.  */
4890
4891 void
4892 free_dependence_relations (vec<ddr_p> dependence_relations)
4893 {
4894   unsigned int i;
4895   struct data_dependence_relation *ddr;
4896
4897   FOR_EACH_VEC_ELT (dependence_relations, i, ddr)
4898     if (ddr)
4899       free_dependence_relation (ddr);
4900
4901   dependence_relations.release ();
4902 }
4903
4904 /* Free the memory used by the data references from DATAREFS.  */
4905
4906 void
4907 free_data_refs (vec<data_reference_p> datarefs)
4908 {
4909   unsigned int i;
4910   struct data_reference *dr;
4911
4912   FOR_EACH_VEC_ELT (datarefs, i, dr)
4913     free_data_ref (dr);
4914   datarefs.release ();
4915 }