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