Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / gcc / tree-data-ref.c
1 /* Data references and dependences detectors.
2    Copyright (C) 2003-2018 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 #include "builtins.h"
98 #include "stringpool.h"
99 #include "tree-vrp.h"
100 #include "tree-ssanames.h"
101 #include "tree-eh.h"
102
103 static struct datadep_stats
104 {
105   int num_dependence_tests;
106   int num_dependence_dependent;
107   int num_dependence_independent;
108   int num_dependence_undetermined;
109
110   int num_subscript_tests;
111   int num_subscript_undetermined;
112   int num_same_subscript_function;
113
114   int num_ziv;
115   int num_ziv_independent;
116   int num_ziv_dependent;
117   int num_ziv_unimplemented;
118
119   int num_siv;
120   int num_siv_independent;
121   int num_siv_dependent;
122   int num_siv_unimplemented;
123
124   int num_miv;
125   int num_miv_independent;
126   int num_miv_dependent;
127   int num_miv_unimplemented;
128 } dependence_stats;
129
130 static bool subscript_dependence_tester_1 (struct data_dependence_relation *,
131                                            unsigned int, unsigned int,
132                                            struct loop *);
133 /* Returns true iff A divides B.  */
134
135 static inline bool
136 tree_fold_divides_p (const_tree a, const_tree b)
137 {
138   gcc_assert (TREE_CODE (a) == INTEGER_CST);
139   gcc_assert (TREE_CODE (b) == INTEGER_CST);
140   return integer_zerop (int_const_binop (TRUNC_MOD_EXPR, b, a));
141 }
142
143 /* Returns true iff A divides B.  */
144
145 static inline bool
146 int_divides_p (int a, int b)
147 {
148   return ((b % a) == 0);
149 }
150
151 /* Return true if reference REF contains a union access.  */
152
153 static bool
154 ref_contains_union_access_p (tree ref)
155 {
156   while (handled_component_p (ref))
157     {
158       ref = TREE_OPERAND (ref, 0);
159       if (TREE_CODE (TREE_TYPE (ref)) == UNION_TYPE
160           || TREE_CODE (TREE_TYPE (ref)) == QUAL_UNION_TYPE)
161         return true;
162     }
163   return false;
164 }
165
166 \f
167
168 /* Dump into FILE all the data references from DATAREFS.  */
169
170 static void
171 dump_data_references (FILE *file, vec<data_reference_p> datarefs)
172 {
173   unsigned int i;
174   struct data_reference *dr;
175
176   FOR_EACH_VEC_ELT (datarefs, i, dr)
177     dump_data_reference (file, dr);
178 }
179
180 /* Unified dump into FILE all the data references from DATAREFS.  */
181
182 DEBUG_FUNCTION void
183 debug (vec<data_reference_p> &ref)
184 {
185   dump_data_references (stderr, ref);
186 }
187
188 DEBUG_FUNCTION void
189 debug (vec<data_reference_p> *ptr)
190 {
191   if (ptr)
192     debug (*ptr);
193   else
194     fprintf (stderr, "<nil>\n");
195 }
196
197
198 /* Dump into STDERR all the data references from DATAREFS.  */
199
200 DEBUG_FUNCTION void
201 debug_data_references (vec<data_reference_p> datarefs)
202 {
203   dump_data_references (stderr, datarefs);
204 }
205
206 /* Print to STDERR the data_reference DR.  */
207
208 DEBUG_FUNCTION void
209 debug_data_reference (struct data_reference *dr)
210 {
211   dump_data_reference (stderr, dr);
212 }
213
214 /* Dump function for a DATA_REFERENCE structure.  */
215
216 void
217 dump_data_reference (FILE *outf,
218                      struct data_reference *dr)
219 {
220   unsigned int i;
221
222   fprintf (outf, "#(Data Ref: \n");
223   fprintf (outf, "#  bb: %d \n", gimple_bb (DR_STMT (dr))->index);
224   fprintf (outf, "#  stmt: ");
225   print_gimple_stmt (outf, DR_STMT (dr), 0);
226   fprintf (outf, "#  ref: ");
227   print_generic_stmt (outf, DR_REF (dr));
228   fprintf (outf, "#  base_object: ");
229   print_generic_stmt (outf, DR_BASE_OBJECT (dr));
230
231   for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
232     {
233       fprintf (outf, "#  Access function %d: ", i);
234       print_generic_stmt (outf, DR_ACCESS_FN (dr, i));
235     }
236   fprintf (outf, "#)\n");
237 }
238
239 /* Unified dump function for a DATA_REFERENCE structure.  */
240
241 DEBUG_FUNCTION void
242 debug (data_reference &ref)
243 {
244   dump_data_reference (stderr, &ref);
245 }
246
247 DEBUG_FUNCTION void
248 debug (data_reference *ptr)
249 {
250   if (ptr)
251     debug (*ptr);
252   else
253     fprintf (stderr, "<nil>\n");
254 }
255
256
257 /* Dumps the affine function described by FN to the file OUTF.  */
258
259 DEBUG_FUNCTION void
260 dump_affine_function (FILE *outf, affine_fn fn)
261 {
262   unsigned i;
263   tree coef;
264
265   print_generic_expr (outf, fn[0], TDF_SLIM);
266   for (i = 1; fn.iterate (i, &coef); i++)
267     {
268       fprintf (outf, " + ");
269       print_generic_expr (outf, coef, TDF_SLIM);
270       fprintf (outf, " * x_%u", i);
271     }
272 }
273
274 /* Dumps the conflict function CF to the file OUTF.  */
275
276 DEBUG_FUNCTION void
277 dump_conflict_function (FILE *outf, conflict_function *cf)
278 {
279   unsigned i;
280
281   if (cf->n == NO_DEPENDENCE)
282     fprintf (outf, "no dependence");
283   else if (cf->n == NOT_KNOWN)
284     fprintf (outf, "not known");
285   else
286     {
287       for (i = 0; i < cf->n; i++)
288         {
289           if (i != 0)
290             fprintf (outf, " ");
291           fprintf (outf, "[");
292           dump_affine_function (outf, cf->fns[i]);
293           fprintf (outf, "]");
294         }
295     }
296 }
297
298 /* Dump function for a SUBSCRIPT structure.  */
299
300 DEBUG_FUNCTION void
301 dump_subscript (FILE *outf, struct subscript *subscript)
302 {
303   conflict_function *cf = SUB_CONFLICTS_IN_A (subscript);
304
305   fprintf (outf, "\n (subscript \n");
306   fprintf (outf, "  iterations_that_access_an_element_twice_in_A: ");
307   dump_conflict_function (outf, cf);
308   if (CF_NONTRIVIAL_P (cf))
309     {
310       tree last_iteration = SUB_LAST_CONFLICT (subscript);
311       fprintf (outf, "\n  last_conflict: ");
312       print_generic_expr (outf, last_iteration);
313     }
314
315   cf = SUB_CONFLICTS_IN_B (subscript);
316   fprintf (outf, "\n  iterations_that_access_an_element_twice_in_B: ");
317   dump_conflict_function (outf, cf);
318   if (CF_NONTRIVIAL_P (cf))
319     {
320       tree last_iteration = SUB_LAST_CONFLICT (subscript);
321       fprintf (outf, "\n  last_conflict: ");
322       print_generic_expr (outf, last_iteration);
323     }
324
325   fprintf (outf, "\n  (Subscript distance: ");
326   print_generic_expr (outf, SUB_DISTANCE (subscript));
327   fprintf (outf, " ))\n");
328 }
329
330 /* Print the classic direction vector DIRV to OUTF.  */
331
332 DEBUG_FUNCTION void
333 print_direction_vector (FILE *outf,
334                         lambda_vector dirv,
335                         int length)
336 {
337   int eq;
338
339   for (eq = 0; eq < length; eq++)
340     {
341       enum data_dependence_direction dir = ((enum data_dependence_direction)
342                                             dirv[eq]);
343
344       switch (dir)
345         {
346         case dir_positive:
347           fprintf (outf, "    +");
348           break;
349         case dir_negative:
350           fprintf (outf, "    -");
351           break;
352         case dir_equal:
353           fprintf (outf, "    =");
354           break;
355         case dir_positive_or_equal:
356           fprintf (outf, "   +=");
357           break;
358         case dir_positive_or_negative:
359           fprintf (outf, "   +-");
360           break;
361         case dir_negative_or_equal:
362           fprintf (outf, "   -=");
363           break;
364         case dir_star:
365           fprintf (outf, "    *");
366           break;
367         default:
368           fprintf (outf, "indep");
369           break;
370         }
371     }
372   fprintf (outf, "\n");
373 }
374
375 /* Print a vector of direction vectors.  */
376
377 DEBUG_FUNCTION void
378 print_dir_vectors (FILE *outf, vec<lambda_vector> dir_vects,
379                    int length)
380 {
381   unsigned j;
382   lambda_vector v;
383
384   FOR_EACH_VEC_ELT (dir_vects, j, v)
385     print_direction_vector (outf, v, length);
386 }
387
388 /* Print out a vector VEC of length N to OUTFILE.  */
389
390 DEBUG_FUNCTION void
391 print_lambda_vector (FILE * outfile, lambda_vector vector, int n)
392 {
393   int i;
394
395   for (i = 0; i < n; i++)
396     fprintf (outfile, "%3d ", vector[i]);
397   fprintf (outfile, "\n");
398 }
399
400 /* Print a vector of distance vectors.  */
401
402 DEBUG_FUNCTION void
403 print_dist_vectors (FILE *outf, vec<lambda_vector> dist_vects,
404                     int length)
405 {
406   unsigned j;
407   lambda_vector v;
408
409   FOR_EACH_VEC_ELT (dist_vects, j, v)
410     print_lambda_vector (outf, v, length);
411 }
412
413 /* Dump function for a DATA_DEPENDENCE_RELATION structure.  */
414
415 DEBUG_FUNCTION void
416 dump_data_dependence_relation (FILE *outf,
417                                struct data_dependence_relation *ddr)
418 {
419   struct data_reference *dra, *drb;
420
421   fprintf (outf, "(Data Dep: \n");
422
423   if (!ddr || DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
424     {
425       if (ddr)
426         {
427           dra = DDR_A (ddr);
428           drb = DDR_B (ddr);
429           if (dra)
430             dump_data_reference (outf, dra);
431           else
432             fprintf (outf, "    (nil)\n");
433           if (drb)
434             dump_data_reference (outf, drb);
435           else
436             fprintf (outf, "    (nil)\n");
437         }
438       fprintf (outf, "    (don't know)\n)\n");
439       return;
440     }
441
442   dra = DDR_A (ddr);
443   drb = DDR_B (ddr);
444   dump_data_reference (outf, dra);
445   dump_data_reference (outf, drb);
446
447   if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
448     fprintf (outf, "    (no dependence)\n");
449
450   else if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
451     {
452       unsigned int i;
453       struct loop *loopi;
454
455       subscript *sub;
456       FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
457         {
458           fprintf (outf, "  access_fn_A: ");
459           print_generic_stmt (outf, SUB_ACCESS_FN (sub, 0));
460           fprintf (outf, "  access_fn_B: ");
461           print_generic_stmt (outf, SUB_ACCESS_FN (sub, 1));
462           dump_subscript (outf, sub);
463         }
464
465       fprintf (outf, "  inner loop index: %d\n", DDR_INNER_LOOP (ddr));
466       fprintf (outf, "  loop nest: (");
467       FOR_EACH_VEC_ELT (DDR_LOOP_NEST (ddr), i, loopi)
468         fprintf (outf, "%d ", loopi->num);
469       fprintf (outf, ")\n");
470
471       for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
472         {
473           fprintf (outf, "  distance_vector: ");
474           print_lambda_vector (outf, DDR_DIST_VECT (ddr, i),
475                                DDR_NB_LOOPS (ddr));
476         }
477
478       for (i = 0; i < DDR_NUM_DIR_VECTS (ddr); i++)
479         {
480           fprintf (outf, "  direction_vector: ");
481           print_direction_vector (outf, DDR_DIR_VECT (ddr, i),
482                                   DDR_NB_LOOPS (ddr));
483         }
484     }
485
486   fprintf (outf, ")\n");
487 }
488
489 /* Debug version.  */
490
491 DEBUG_FUNCTION void
492 debug_data_dependence_relation (struct data_dependence_relation *ddr)
493 {
494   dump_data_dependence_relation (stderr, ddr);
495 }
496
497 /* Dump into FILE all the dependence relations from DDRS.  */
498
499 DEBUG_FUNCTION void
500 dump_data_dependence_relations (FILE *file,
501                                 vec<ddr_p> ddrs)
502 {
503   unsigned int i;
504   struct data_dependence_relation *ddr;
505
506   FOR_EACH_VEC_ELT (ddrs, i, ddr)
507     dump_data_dependence_relation (file, ddr);
508 }
509
510 DEBUG_FUNCTION void
511 debug (vec<ddr_p> &ref)
512 {
513   dump_data_dependence_relations (stderr, ref);
514 }
515
516 DEBUG_FUNCTION void
517 debug (vec<ddr_p> *ptr)
518 {
519   if (ptr)
520     debug (*ptr);
521   else
522     fprintf (stderr, "<nil>\n");
523 }
524
525
526 /* Dump to STDERR all the dependence relations from DDRS.  */
527
528 DEBUG_FUNCTION void
529 debug_data_dependence_relations (vec<ddr_p> ddrs)
530 {
531   dump_data_dependence_relations (stderr, ddrs);
532 }
533
534 /* Dumps the distance and direction vectors in FILE.  DDRS contains
535    the dependence relations, and VECT_SIZE is the size of the
536    dependence vectors, or in other words the number of loops in the
537    considered nest.  */
538
539 DEBUG_FUNCTION void
540 dump_dist_dir_vectors (FILE *file, vec<ddr_p> ddrs)
541 {
542   unsigned int i, j;
543   struct data_dependence_relation *ddr;
544   lambda_vector v;
545
546   FOR_EACH_VEC_ELT (ddrs, i, ddr)
547     if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE && DDR_AFFINE_P (ddr))
548       {
549         FOR_EACH_VEC_ELT (DDR_DIST_VECTS (ddr), j, v)
550           {
551             fprintf (file, "DISTANCE_V (");
552             print_lambda_vector (file, v, DDR_NB_LOOPS (ddr));
553             fprintf (file, ")\n");
554           }
555
556         FOR_EACH_VEC_ELT (DDR_DIR_VECTS (ddr), j, v)
557           {
558             fprintf (file, "DIRECTION_V (");
559             print_direction_vector (file, v, DDR_NB_LOOPS (ddr));
560             fprintf (file, ")\n");
561           }
562       }
563
564   fprintf (file, "\n\n");
565 }
566
567 /* Dumps the data dependence relations DDRS in FILE.  */
568
569 DEBUG_FUNCTION void
570 dump_ddrs (FILE *file, vec<ddr_p> ddrs)
571 {
572   unsigned int i;
573   struct data_dependence_relation *ddr;
574
575   FOR_EACH_VEC_ELT (ddrs, i, ddr)
576     dump_data_dependence_relation (file, ddr);
577
578   fprintf (file, "\n\n");
579 }
580
581 DEBUG_FUNCTION void
582 debug_ddrs (vec<ddr_p> ddrs)
583 {
584   dump_ddrs (stderr, ddrs);
585 }
586
587 /* Helper function for split_constant_offset.  Expresses OP0 CODE OP1
588    (the type of the result is TYPE) as VAR + OFF, where OFF is a nonzero
589    constant of type ssizetype, and returns true.  If we cannot do this
590    with OFF nonzero, OFF and VAR are set to NULL_TREE instead and false
591    is returned.  */
592
593 static bool
594 split_constant_offset_1 (tree type, tree op0, enum tree_code code, tree op1,
595                          tree *var, tree *off)
596 {
597   tree var0, var1;
598   tree off0, off1;
599   enum tree_code ocode = code;
600
601   *var = NULL_TREE;
602   *off = NULL_TREE;
603
604   switch (code)
605     {
606     case INTEGER_CST:
607       *var = build_int_cst (type, 0);
608       *off = fold_convert (ssizetype, op0);
609       return true;
610
611     case POINTER_PLUS_EXPR:
612       ocode = PLUS_EXPR;
613       /* FALLTHROUGH */
614     case PLUS_EXPR:
615     case MINUS_EXPR:
616       split_constant_offset (op0, &var0, &off0);
617       split_constant_offset (op1, &var1, &off1);
618       *var = fold_build2 (code, type, var0, var1);
619       *off = size_binop (ocode, off0, off1);
620       return true;
621
622     case MULT_EXPR:
623       if (TREE_CODE (op1) != INTEGER_CST)
624         return false;
625
626       split_constant_offset (op0, &var0, &off0);
627       *var = fold_build2 (MULT_EXPR, type, var0, op1);
628       *off = size_binop (MULT_EXPR, off0, fold_convert (ssizetype, op1));
629       return true;
630
631     case ADDR_EXPR:
632       {
633         tree base, poffset;
634         poly_int64 pbitsize, pbitpos, pbytepos;
635         machine_mode pmode;
636         int punsignedp, preversep, pvolatilep;
637
638         op0 = TREE_OPERAND (op0, 0);
639         base
640           = get_inner_reference (op0, &pbitsize, &pbitpos, &poffset, &pmode,
641                                  &punsignedp, &preversep, &pvolatilep);
642
643         if (!multiple_p (pbitpos, BITS_PER_UNIT, &pbytepos))
644           return false;
645         base = build_fold_addr_expr (base);
646         off0 = ssize_int (pbytepos);
647
648         if (poffset)
649           {
650             split_constant_offset (poffset, &poffset, &off1);
651             off0 = size_binop (PLUS_EXPR, off0, off1);
652             if (POINTER_TYPE_P (TREE_TYPE (base)))
653               base = fold_build_pointer_plus (base, poffset);
654             else
655               base = fold_build2 (PLUS_EXPR, TREE_TYPE (base), base,
656                                   fold_convert (TREE_TYPE (base), poffset));
657           }
658
659         var0 = fold_convert (type, base);
660
661         /* If variable length types are involved, punt, otherwise casts
662            might be converted into ARRAY_REFs in gimplify_conversion.
663            To compute that ARRAY_REF's element size TYPE_SIZE_UNIT, which
664            possibly no longer appears in current GIMPLE, might resurface.
665            This perhaps could run
666            if (CONVERT_EXPR_P (var0))
667              {
668                gimplify_conversion (&var0);
669                // Attempt to fill in any within var0 found ARRAY_REF's
670                // element size from corresponding op embedded ARRAY_REF,
671                // if unsuccessful, just punt.
672              }  */
673         while (POINTER_TYPE_P (type))
674           type = TREE_TYPE (type);
675         if (int_size_in_bytes (type) < 0)
676           return false;
677
678         *var = var0;
679         *off = off0;
680         return true;
681       }
682
683     case SSA_NAME:
684       {
685         if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0))
686           return false;
687
688         gimple *def_stmt = SSA_NAME_DEF_STMT (op0);
689         enum tree_code subcode;
690
691         if (gimple_code (def_stmt) != GIMPLE_ASSIGN)
692           return false;
693
694         var0 = gimple_assign_rhs1 (def_stmt);
695         subcode = gimple_assign_rhs_code (def_stmt);
696         var1 = gimple_assign_rhs2 (def_stmt);
697
698         return split_constant_offset_1 (type, var0, subcode, var1, var, off);
699       }
700     CASE_CONVERT:
701       {
702         /* We must not introduce undefined overflow, and we must not change the value.
703            Hence we're okay if the inner type doesn't overflow to start with
704            (pointer or signed), the outer type also is an integer or pointer
705            and the outer precision is at least as large as the inner.  */
706         tree itype = TREE_TYPE (op0);
707         if ((POINTER_TYPE_P (itype)
708              || (INTEGRAL_TYPE_P (itype) && !TYPE_OVERFLOW_TRAPS (itype)))
709             && TYPE_PRECISION (type) >= TYPE_PRECISION (itype)
710             && (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)))
711           {
712             if (INTEGRAL_TYPE_P (itype) && TYPE_OVERFLOW_WRAPS (itype))
713               {
714                 /* Split the unconverted operand and try to prove that
715                    wrapping isn't a problem.  */
716                 tree tmp_var, tmp_off;
717                 split_constant_offset (op0, &tmp_var, &tmp_off);
718
719                 /* See whether we have an SSA_NAME whose range is known
720                    to be [A, B].  */
721                 if (TREE_CODE (tmp_var) != SSA_NAME)
722                   return false;
723                 wide_int var_min, var_max;
724                 value_range_type vr_type = get_range_info (tmp_var, &var_min,
725                                                            &var_max);
726                 wide_int var_nonzero = get_nonzero_bits (tmp_var);
727                 signop sgn = TYPE_SIGN (itype);
728                 if (intersect_range_with_nonzero_bits (vr_type, &var_min,
729                                                        &var_max, var_nonzero,
730                                                        sgn) != VR_RANGE)
731                   return false;
732
733                 /* See whether the range of OP0 (i.e. TMP_VAR + TMP_OFF)
734                    is known to be [A + TMP_OFF, B + TMP_OFF], with all
735                    operations done in ITYPE.  The addition must overflow
736                    at both ends of the range or at neither.  */
737                 bool overflow[2];
738                 unsigned int prec = TYPE_PRECISION (itype);
739                 wide_int woff = wi::to_wide (tmp_off, prec);
740                 wide_int op0_min = wi::add (var_min, woff, sgn, &overflow[0]);
741                 wi::add (var_max, woff, sgn, &overflow[1]);
742                 if (overflow[0] != overflow[1])
743                   return false;
744
745                 /* Calculate (ssizetype) OP0 - (ssizetype) TMP_VAR.  */
746                 widest_int diff = (widest_int::from (op0_min, sgn)
747                                    - widest_int::from (var_min, sgn));
748                 var0 = tmp_var;
749                 *off = wide_int_to_tree (ssizetype, diff);
750               }
751             else
752               split_constant_offset (op0, &var0, off);
753             *var = fold_convert (type, var0);
754             return true;
755           }
756         return false;
757       }
758
759     default:
760       return false;
761     }
762 }
763
764 /* Expresses EXP as VAR + OFF, where off is a constant.  The type of OFF
765    will be ssizetype.  */
766
767 void
768 split_constant_offset (tree exp, tree *var, tree *off)
769 {
770   tree type = TREE_TYPE (exp), op0, op1, e, o;
771   enum tree_code code;
772
773   *var = exp;
774   *off = ssize_int (0);
775
776   if (tree_is_chrec (exp)
777       || get_gimple_rhs_class (TREE_CODE (exp)) == GIMPLE_TERNARY_RHS)
778     return;
779
780   code = TREE_CODE (exp);
781   extract_ops_from_tree (exp, &code, &op0, &op1);
782   if (split_constant_offset_1 (type, op0, code, op1, &e, &o))
783     {
784       *var = e;
785       *off = o;
786     }
787 }
788
789 /* Returns the address ADDR of an object in a canonical shape (without nop
790    casts, and with type of pointer to the object).  */
791
792 static tree
793 canonicalize_base_object_address (tree addr)
794 {
795   tree orig = addr;
796
797   STRIP_NOPS (addr);
798
799   /* The base address may be obtained by casting from integer, in that case
800      keep the cast.  */
801   if (!POINTER_TYPE_P (TREE_TYPE (addr)))
802     return orig;
803
804   if (TREE_CODE (addr) != ADDR_EXPR)
805     return addr;
806
807   return build_fold_addr_expr (TREE_OPERAND (addr, 0));
808 }
809
810 /* Analyze the behavior of memory reference REF.  There are two modes:
811
812    - BB analysis.  In this case we simply split the address into base,
813      init and offset components, without reference to any containing loop.
814      The resulting base and offset are general expressions and they can
815      vary arbitrarily from one iteration of the containing loop to the next.
816      The step is always zero.
817
818    - loop analysis.  In this case we analyze the reference both wrt LOOP
819      and on the basis that the reference occurs (is "used") in LOOP;
820      see the comment above analyze_scalar_evolution_in_loop for more
821      information about this distinction.  The base, init, offset and
822      step fields are all invariant in LOOP.
823
824    Perform BB analysis if LOOP is null, or if LOOP is the function's
825    dummy outermost loop.  In other cases perform loop analysis.
826
827    Return true if the analysis succeeded and store the results in DRB if so.
828    BB analysis can only fail for bitfield or reversed-storage accesses.  */
829
830 bool
831 dr_analyze_innermost (innermost_loop_behavior *drb, tree ref,
832                       struct loop *loop)
833 {
834   poly_int64 pbitsize, pbitpos;
835   tree base, poffset;
836   machine_mode pmode;
837   int punsignedp, preversep, pvolatilep;
838   affine_iv base_iv, offset_iv;
839   tree init, dinit, step;
840   bool in_loop = (loop && loop->num);
841
842   if (dump_file && (dump_flags & TDF_DETAILS))
843     fprintf (dump_file, "analyze_innermost: ");
844
845   base = get_inner_reference (ref, &pbitsize, &pbitpos, &poffset, &pmode,
846                               &punsignedp, &preversep, &pvolatilep);
847   gcc_assert (base != NULL_TREE);
848
849   poly_int64 pbytepos;
850   if (!multiple_p (pbitpos, BITS_PER_UNIT, &pbytepos))
851     {
852       if (dump_file && (dump_flags & TDF_DETAILS))
853         fprintf (dump_file, "failed: bit offset alignment.\n");
854       return false;
855     }
856
857   if (preversep)
858     {
859       if (dump_file && (dump_flags & TDF_DETAILS))
860         fprintf (dump_file, "failed: reverse storage order.\n");
861       return false;
862     }
863
864   /* Calculate the alignment and misalignment for the inner reference.  */
865   unsigned int HOST_WIDE_INT bit_base_misalignment;
866   unsigned int bit_base_alignment;
867   get_object_alignment_1 (base, &bit_base_alignment, &bit_base_misalignment);
868
869   /* There are no bitfield references remaining in BASE, so the values
870      we got back must be whole bytes.  */
871   gcc_assert (bit_base_alignment % BITS_PER_UNIT == 0
872               && bit_base_misalignment % BITS_PER_UNIT == 0);
873   unsigned int base_alignment = bit_base_alignment / BITS_PER_UNIT;
874   poly_int64 base_misalignment = bit_base_misalignment / BITS_PER_UNIT;
875
876   if (TREE_CODE (base) == MEM_REF)
877     {
878       if (!integer_zerop (TREE_OPERAND (base, 1)))
879         {
880           /* Subtract MOFF from the base and add it to POFFSET instead.
881              Adjust the misalignment to reflect the amount we subtracted.  */
882           poly_offset_int moff = mem_ref_offset (base);
883           base_misalignment -= moff.force_shwi ();
884           tree mofft = wide_int_to_tree (sizetype, moff);
885           if (!poffset)
886             poffset = mofft;
887           else
888             poffset = size_binop (PLUS_EXPR, poffset, mofft);
889         }
890       base = TREE_OPERAND (base, 0);
891     }
892   else
893     base = build_fold_addr_expr (base);
894
895   if (in_loop)
896     {
897       if (!simple_iv (loop, loop, base, &base_iv, true))
898         {
899           if (dump_file && (dump_flags & TDF_DETAILS))
900             fprintf (dump_file, "failed: evolution of base is not affine.\n");
901           return false;
902         }
903     }
904   else
905     {
906       base_iv.base = base;
907       base_iv.step = ssize_int (0);
908       base_iv.no_overflow = true;
909     }
910
911   if (!poffset)
912     {
913       offset_iv.base = ssize_int (0);
914       offset_iv.step = ssize_int (0);
915     }
916   else
917     {
918       if (!in_loop)
919         {
920           offset_iv.base = poffset;
921           offset_iv.step = ssize_int (0);
922         }
923       else if (!simple_iv (loop, loop, poffset, &offset_iv, true))
924         {
925           if (dump_file && (dump_flags & TDF_DETAILS))
926             fprintf (dump_file, "failed: evolution of offset is not affine.\n");
927           return false;
928         }
929     }
930
931   init = ssize_int (pbytepos);
932
933   /* Subtract any constant component from the base and add it to INIT instead.
934      Adjust the misalignment to reflect the amount we subtracted.  */
935   split_constant_offset (base_iv.base, &base_iv.base, &dinit);
936   init = size_binop (PLUS_EXPR, init, dinit);
937   base_misalignment -= TREE_INT_CST_LOW (dinit);
938
939   split_constant_offset (offset_iv.base, &offset_iv.base, &dinit);
940   init = size_binop (PLUS_EXPR, init, dinit);
941
942   step = size_binop (PLUS_EXPR,
943                      fold_convert (ssizetype, base_iv.step),
944                      fold_convert (ssizetype, offset_iv.step));
945
946   base = canonicalize_base_object_address (base_iv.base);
947
948   /* See if get_pointer_alignment can guarantee a higher alignment than
949      the one we calculated above.  */
950   unsigned int HOST_WIDE_INT alt_misalignment;
951   unsigned int alt_alignment;
952   get_pointer_alignment_1 (base, &alt_alignment, &alt_misalignment);
953
954   /* As above, these values must be whole bytes.  */
955   gcc_assert (alt_alignment % BITS_PER_UNIT == 0
956               && alt_misalignment % BITS_PER_UNIT == 0);
957   alt_alignment /= BITS_PER_UNIT;
958   alt_misalignment /= BITS_PER_UNIT;
959
960   if (base_alignment < alt_alignment)
961     {
962       base_alignment = alt_alignment;
963       base_misalignment = alt_misalignment;
964     }
965
966   drb->base_address = base;
967   drb->offset = fold_convert (ssizetype, offset_iv.base);
968   drb->init = init;
969   drb->step = step;
970   if (known_misalignment (base_misalignment, base_alignment,
971                           &drb->base_misalignment))
972     drb->base_alignment = base_alignment;
973   else
974     {
975       drb->base_alignment = known_alignment (base_misalignment);
976       drb->base_misalignment = 0;
977     }
978   drb->offset_alignment = highest_pow2_factor (offset_iv.base);
979   drb->step_alignment = highest_pow2_factor (step);
980
981   if (dump_file && (dump_flags & TDF_DETAILS))
982     fprintf (dump_file, "success.\n");
983
984   return true;
985 }
986
987 /* Return true if OP is a valid component reference for a DR access
988    function.  This accepts a subset of what handled_component_p accepts.  */
989
990 static bool
991 access_fn_component_p (tree op)
992 {
993   switch (TREE_CODE (op))
994     {
995     case REALPART_EXPR:
996     case IMAGPART_EXPR:
997     case ARRAY_REF:
998       return true;
999
1000     case COMPONENT_REF:
1001       return TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0))) == RECORD_TYPE;
1002
1003     default:
1004       return false;
1005     }
1006 }
1007
1008 /* Determines the base object and the list of indices of memory reference
1009    DR, analyzed in LOOP and instantiated before NEST.  */
1010
1011 static void
1012 dr_analyze_indices (struct data_reference *dr, edge nest, loop_p loop)
1013 {
1014   vec<tree> access_fns = vNULL;
1015   tree ref, op;
1016   tree base, off, access_fn;
1017
1018   /* If analyzing a basic-block there are no indices to analyze
1019      and thus no access functions.  */
1020   if (!nest)
1021     {
1022       DR_BASE_OBJECT (dr) = DR_REF (dr);
1023       DR_ACCESS_FNS (dr).create (0);
1024       return;
1025     }
1026
1027   ref = DR_REF (dr);
1028
1029   /* REALPART_EXPR and IMAGPART_EXPR can be handled like accesses
1030      into a two element array with a constant index.  The base is
1031      then just the immediate underlying object.  */
1032   if (TREE_CODE (ref) == REALPART_EXPR)
1033     {
1034       ref = TREE_OPERAND (ref, 0);
1035       access_fns.safe_push (integer_zero_node);
1036     }
1037   else if (TREE_CODE (ref) == IMAGPART_EXPR)
1038     {
1039       ref = TREE_OPERAND (ref, 0);
1040       access_fns.safe_push (integer_one_node);
1041     }
1042
1043   /* Analyze access functions of dimensions we know to be independent.
1044      The list of component references handled here should be kept in
1045      sync with access_fn_component_p.  */
1046   while (handled_component_p (ref))
1047     {
1048       if (TREE_CODE (ref) == ARRAY_REF)
1049         {
1050           op = TREE_OPERAND (ref, 1);
1051           access_fn = analyze_scalar_evolution (loop, op);
1052           access_fn = instantiate_scev (nest, loop, access_fn);
1053           access_fns.safe_push (access_fn);
1054         }
1055       else if (TREE_CODE (ref) == COMPONENT_REF
1056                && TREE_CODE (TREE_TYPE (TREE_OPERAND (ref, 0))) == RECORD_TYPE)
1057         {
1058           /* For COMPONENT_REFs of records (but not unions!) use the
1059              FIELD_DECL offset as constant access function so we can
1060              disambiguate a[i].f1 and a[i].f2.  */
1061           tree off = component_ref_field_offset (ref);
1062           off = size_binop (PLUS_EXPR,
1063                             size_binop (MULT_EXPR,
1064                                         fold_convert (bitsizetype, off),
1065                                         bitsize_int (BITS_PER_UNIT)),
1066                             DECL_FIELD_BIT_OFFSET (TREE_OPERAND (ref, 1)));
1067           access_fns.safe_push (off);
1068         }
1069       else
1070         /* If we have an unhandled component we could not translate
1071            to an access function stop analyzing.  We have determined
1072            our base object in this case.  */
1073         break;
1074
1075       ref = TREE_OPERAND (ref, 0);
1076     }
1077
1078   /* If the address operand of a MEM_REF base has an evolution in the
1079      analyzed nest, add it as an additional independent access-function.  */
1080   if (TREE_CODE (ref) == MEM_REF)
1081     {
1082       op = TREE_OPERAND (ref, 0);
1083       access_fn = analyze_scalar_evolution (loop, op);
1084       access_fn = instantiate_scev (nest, loop, access_fn);
1085       if (TREE_CODE (access_fn) == POLYNOMIAL_CHREC)
1086         {
1087           tree orig_type;
1088           tree memoff = TREE_OPERAND (ref, 1);
1089           base = initial_condition (access_fn);
1090           orig_type = TREE_TYPE (base);
1091           STRIP_USELESS_TYPE_CONVERSION (base);
1092           split_constant_offset (base, &base, &off);
1093           STRIP_USELESS_TYPE_CONVERSION (base);
1094           /* Fold the MEM_REF offset into the evolutions initial
1095              value to make more bases comparable.  */
1096           if (!integer_zerop (memoff))
1097             {
1098               off = size_binop (PLUS_EXPR, off,
1099                                 fold_convert (ssizetype, memoff));
1100               memoff = build_int_cst (TREE_TYPE (memoff), 0);
1101             }
1102           /* Adjust the offset so it is a multiple of the access type
1103              size and thus we separate bases that can possibly be used
1104              to produce partial overlaps (which the access_fn machinery
1105              cannot handle).  */
1106           wide_int rem;
1107           if (TYPE_SIZE_UNIT (TREE_TYPE (ref))
1108               && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (ref))) == INTEGER_CST
1109               && !integer_zerop (TYPE_SIZE_UNIT (TREE_TYPE (ref))))
1110             rem = wi::mod_trunc
1111               (wi::to_wide (off),
1112                wi::to_wide (TYPE_SIZE_UNIT (TREE_TYPE (ref))),
1113                SIGNED);
1114           else
1115             /* If we can't compute the remainder simply force the initial
1116                condition to zero.  */
1117             rem = wi::to_wide (off);
1118           off = wide_int_to_tree (ssizetype, wi::to_wide (off) - rem);
1119           memoff = wide_int_to_tree (TREE_TYPE (memoff), rem);
1120           /* And finally replace the initial condition.  */
1121           access_fn = chrec_replace_initial_condition
1122               (access_fn, fold_convert (orig_type, off));
1123           /* ???  This is still not a suitable base object for
1124              dr_may_alias_p - the base object needs to be an
1125              access that covers the object as whole.  With
1126              an evolution in the pointer this cannot be
1127              guaranteed.
1128              As a band-aid, mark the access so we can special-case
1129              it in dr_may_alias_p.  */
1130           tree old = ref;
1131           ref = fold_build2_loc (EXPR_LOCATION (ref),
1132                                  MEM_REF, TREE_TYPE (ref),
1133                                  base, memoff);
1134           MR_DEPENDENCE_CLIQUE (ref) = MR_DEPENDENCE_CLIQUE (old);
1135           MR_DEPENDENCE_BASE (ref) = MR_DEPENDENCE_BASE (old);
1136           DR_UNCONSTRAINED_BASE (dr) = true;
1137           access_fns.safe_push (access_fn);
1138         }
1139     }
1140   else if (DECL_P (ref))
1141     {
1142       /* Canonicalize DR_BASE_OBJECT to MEM_REF form.  */
1143       ref = build2 (MEM_REF, TREE_TYPE (ref),
1144                     build_fold_addr_expr (ref),
1145                     build_int_cst (reference_alias_ptr_type (ref), 0));
1146     }
1147
1148   DR_BASE_OBJECT (dr) = ref;
1149   DR_ACCESS_FNS (dr) = access_fns;
1150 }
1151
1152 /* Extracts the alias analysis information from the memory reference DR.  */
1153
1154 static void
1155 dr_analyze_alias (struct data_reference *dr)
1156 {
1157   tree ref = DR_REF (dr);
1158   tree base = get_base_address (ref), addr;
1159
1160   if (INDIRECT_REF_P (base)
1161       || TREE_CODE (base) == MEM_REF)
1162     {
1163       addr = TREE_OPERAND (base, 0);
1164       if (TREE_CODE (addr) == SSA_NAME)
1165         DR_PTR_INFO (dr) = SSA_NAME_PTR_INFO (addr);
1166     }
1167 }
1168
1169 /* Frees data reference DR.  */
1170
1171 void
1172 free_data_ref (data_reference_p dr)
1173 {
1174   DR_ACCESS_FNS (dr).release ();
1175   free (dr);
1176 }
1177
1178 /* Analyze memory reference MEMREF, which is accessed in STMT.
1179    The reference is a read if IS_READ is true, otherwise it is a write.
1180    IS_CONDITIONAL_IN_STMT indicates that the reference is conditional
1181    within STMT, i.e. that it might not occur even if STMT is executed
1182    and runs to completion.
1183
1184    Return the data_reference description of MEMREF.  NEST is the outermost
1185    loop in which the reference should be instantiated, LOOP is the loop
1186    in which the data reference should be analyzed.  */
1187
1188 struct data_reference *
1189 create_data_ref (edge nest, loop_p loop, tree memref, gimple *stmt,
1190                  bool is_read, bool is_conditional_in_stmt)
1191 {
1192   struct data_reference *dr;
1193
1194   if (dump_file && (dump_flags & TDF_DETAILS))
1195     {
1196       fprintf (dump_file, "Creating dr for ");
1197       print_generic_expr (dump_file, memref, TDF_SLIM);
1198       fprintf (dump_file, "\n");
1199     }
1200
1201   dr = XCNEW (struct data_reference);
1202   DR_STMT (dr) = stmt;
1203   DR_REF (dr) = memref;
1204   DR_IS_READ (dr) = is_read;
1205   DR_IS_CONDITIONAL_IN_STMT (dr) = is_conditional_in_stmt;
1206
1207   dr_analyze_innermost (&DR_INNERMOST (dr), memref,
1208                         nest != NULL ? loop : NULL);
1209   dr_analyze_indices (dr, nest, loop);
1210   dr_analyze_alias (dr);
1211
1212   if (dump_file && (dump_flags & TDF_DETAILS))
1213     {
1214       unsigned i;
1215       fprintf (dump_file, "\tbase_address: ");
1216       print_generic_expr (dump_file, DR_BASE_ADDRESS (dr), TDF_SLIM);
1217       fprintf (dump_file, "\n\toffset from base address: ");
1218       print_generic_expr (dump_file, DR_OFFSET (dr), TDF_SLIM);
1219       fprintf (dump_file, "\n\tconstant offset from base address: ");
1220       print_generic_expr (dump_file, DR_INIT (dr), TDF_SLIM);
1221       fprintf (dump_file, "\n\tstep: ");
1222       print_generic_expr (dump_file, DR_STEP (dr), TDF_SLIM);
1223       fprintf (dump_file, "\n\tbase alignment: %d", DR_BASE_ALIGNMENT (dr));
1224       fprintf (dump_file, "\n\tbase misalignment: %d",
1225                DR_BASE_MISALIGNMENT (dr));
1226       fprintf (dump_file, "\n\toffset alignment: %d",
1227                DR_OFFSET_ALIGNMENT (dr));
1228       fprintf (dump_file, "\n\tstep alignment: %d", DR_STEP_ALIGNMENT (dr));
1229       fprintf (dump_file, "\n\tbase_object: ");
1230       print_generic_expr (dump_file, DR_BASE_OBJECT (dr), TDF_SLIM);
1231       fprintf (dump_file, "\n");
1232       for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
1233         {
1234           fprintf (dump_file, "\tAccess function %d: ", i);
1235           print_generic_stmt (dump_file, DR_ACCESS_FN (dr, i), TDF_SLIM);
1236         }
1237     }
1238
1239   return dr;
1240 }
1241
1242 /*  A helper function computes order between two tree epxressions T1 and T2.
1243     This is used in comparator functions sorting objects based on the order
1244     of tree expressions.  The function returns -1, 0, or 1.  */
1245
1246 int
1247 data_ref_compare_tree (tree t1, tree t2)
1248 {
1249   int i, cmp;
1250   enum tree_code code;
1251   char tclass;
1252
1253   if (t1 == t2)
1254     return 0;
1255   if (t1 == NULL)
1256     return -1;
1257   if (t2 == NULL)
1258     return 1;
1259
1260   STRIP_USELESS_TYPE_CONVERSION (t1);
1261   STRIP_USELESS_TYPE_CONVERSION (t2);
1262   if (t1 == t2)
1263     return 0;
1264
1265   if (TREE_CODE (t1) != TREE_CODE (t2)
1266       && ! (CONVERT_EXPR_P (t1) && CONVERT_EXPR_P (t2)))
1267     return TREE_CODE (t1) < TREE_CODE (t2) ? -1 : 1;
1268
1269   code = TREE_CODE (t1);
1270   switch (code)
1271     {
1272     case INTEGER_CST:
1273       return tree_int_cst_compare (t1, t2);
1274
1275     case STRING_CST:
1276       if (TREE_STRING_LENGTH (t1) != TREE_STRING_LENGTH (t2))
1277         return TREE_STRING_LENGTH (t1) < TREE_STRING_LENGTH (t2) ? -1 : 1;
1278       return memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1279                      TREE_STRING_LENGTH (t1));
1280
1281     case SSA_NAME:
1282       if (SSA_NAME_VERSION (t1) != SSA_NAME_VERSION (t2))
1283         return SSA_NAME_VERSION (t1) < SSA_NAME_VERSION (t2) ? -1 : 1;
1284       break;
1285
1286     default:
1287       if (POLY_INT_CST_P (t1))
1288         return compare_sizes_for_sort (wi::to_poly_widest (t1),
1289                                        wi::to_poly_widest (t2));
1290
1291       tclass = TREE_CODE_CLASS (code);
1292
1293       /* For decls, compare their UIDs.  */
1294       if (tclass == tcc_declaration)
1295         {
1296           if (DECL_UID (t1) != DECL_UID (t2))
1297             return DECL_UID (t1) < DECL_UID (t2) ? -1 : 1;
1298           break;
1299         }
1300       /* For expressions, compare their operands recursively.  */
1301       else if (IS_EXPR_CODE_CLASS (tclass))
1302         {
1303           for (i = TREE_OPERAND_LENGTH (t1) - 1; i >= 0; --i)
1304             {
1305               cmp = data_ref_compare_tree (TREE_OPERAND (t1, i),
1306                                            TREE_OPERAND (t2, i));
1307               if (cmp != 0)
1308                 return cmp;
1309             }
1310         }
1311       else
1312         gcc_unreachable ();
1313     }
1314
1315   return 0;
1316 }
1317
1318 /* Return TRUE it's possible to resolve data dependence DDR by runtime alias
1319    check.  */
1320
1321 bool
1322 runtime_alias_check_p (ddr_p ddr, struct loop *loop, bool speed_p)
1323 {
1324   if (dump_enabled_p ())
1325     {
1326       dump_printf (MSG_NOTE, "consider run-time aliasing test between ");
1327       dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (DDR_A (ddr)));
1328       dump_printf (MSG_NOTE,  " and ");
1329       dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (DDR_B (ddr)));
1330       dump_printf (MSG_NOTE, "\n");
1331     }
1332
1333   if (!speed_p)
1334     {
1335       if (dump_enabled_p ())
1336         dump_printf (MSG_MISSED_OPTIMIZATION,
1337                      "runtime alias check not supported when optimizing "
1338                      "for size.\n");
1339       return false;
1340     }
1341
1342   /* FORNOW: We don't support versioning with outer-loop in either
1343      vectorization or loop distribution.  */
1344   if (loop != NULL && loop->inner != NULL)
1345     {
1346       if (dump_enabled_p ())
1347         dump_printf (MSG_MISSED_OPTIMIZATION,
1348                      "runtime alias check not supported for outer loop.\n");
1349       return false;
1350     }
1351
1352   return true;
1353 }
1354
1355 /* Operator == between two dr_with_seg_len objects.
1356
1357    This equality operator is used to make sure two data refs
1358    are the same one so that we will consider to combine the
1359    aliasing checks of those two pairs of data dependent data
1360    refs.  */
1361
1362 static bool
1363 operator == (const dr_with_seg_len& d1,
1364              const dr_with_seg_len& d2)
1365 {
1366   return (operand_equal_p (DR_BASE_ADDRESS (d1.dr),
1367                            DR_BASE_ADDRESS (d2.dr), 0)
1368           && data_ref_compare_tree (DR_OFFSET (d1.dr), DR_OFFSET (d2.dr)) == 0
1369           && data_ref_compare_tree (DR_INIT (d1.dr), DR_INIT (d2.dr)) == 0
1370           && data_ref_compare_tree (d1.seg_len, d2.seg_len) == 0
1371           && known_eq (d1.access_size, d2.access_size)
1372           && d1.align == d2.align);
1373 }
1374
1375 /* Comparison function for sorting objects of dr_with_seg_len_pair_t
1376    so that we can combine aliasing checks in one scan.  */
1377
1378 static int
1379 comp_dr_with_seg_len_pair (const void *pa_, const void *pb_)
1380 {
1381   const dr_with_seg_len_pair_t* pa = (const dr_with_seg_len_pair_t *) pa_;
1382   const dr_with_seg_len_pair_t* pb = (const dr_with_seg_len_pair_t *) pb_;
1383   const dr_with_seg_len &a1 = pa->first, &a2 = pa->second;
1384   const dr_with_seg_len &b1 = pb->first, &b2 = pb->second;
1385
1386   /* For DR pairs (a, b) and (c, d), we only consider to merge the alias checks
1387      if a and c have the same basic address snd step, and b and d have the same
1388      address and step.  Therefore, if any a&c or b&d don't have the same address
1389      and step, we don't care the order of those two pairs after sorting.  */
1390   int comp_res;
1391
1392   if ((comp_res = data_ref_compare_tree (DR_BASE_ADDRESS (a1.dr),
1393                                          DR_BASE_ADDRESS (b1.dr))) != 0)
1394     return comp_res;
1395   if ((comp_res = data_ref_compare_tree (DR_BASE_ADDRESS (a2.dr),
1396                                          DR_BASE_ADDRESS (b2.dr))) != 0)
1397     return comp_res;
1398   if ((comp_res = data_ref_compare_tree (DR_STEP (a1.dr),
1399                                          DR_STEP (b1.dr))) != 0)
1400     return comp_res;
1401   if ((comp_res = data_ref_compare_tree (DR_STEP (a2.dr),
1402                                          DR_STEP (b2.dr))) != 0)
1403     return comp_res;
1404   if ((comp_res = data_ref_compare_tree (DR_OFFSET (a1.dr),
1405                                          DR_OFFSET (b1.dr))) != 0)
1406     return comp_res;
1407   if ((comp_res = data_ref_compare_tree (DR_INIT (a1.dr),
1408                                          DR_INIT (b1.dr))) != 0)
1409     return comp_res;
1410   if ((comp_res = data_ref_compare_tree (DR_OFFSET (a2.dr),
1411                                          DR_OFFSET (b2.dr))) != 0)
1412     return comp_res;
1413   if ((comp_res = data_ref_compare_tree (DR_INIT (a2.dr),
1414                                          DR_INIT (b2.dr))) != 0)
1415     return comp_res;
1416
1417   return 0;
1418 }
1419
1420 /* Merge alias checks recorded in ALIAS_PAIRS and remove redundant ones.
1421    FACTOR is number of iterations that each data reference is accessed.
1422
1423    Basically, for each pair of dependent data refs store_ptr_0 & load_ptr_0,
1424    we create an expression:
1425
1426    ((store_ptr_0 + store_segment_length_0) <= load_ptr_0)
1427    || (load_ptr_0 + load_segment_length_0) <= store_ptr_0))
1428
1429    for aliasing checks.  However, in some cases we can decrease the number
1430    of checks by combining two checks into one.  For example, suppose we have
1431    another pair of data refs store_ptr_0 & load_ptr_1, and if the following
1432    condition is satisfied:
1433
1434    load_ptr_0 < load_ptr_1  &&
1435    load_ptr_1 - load_ptr_0 - load_segment_length_0 < store_segment_length_0
1436
1437    (this condition means, in each iteration of vectorized loop, the accessed
1438    memory of store_ptr_0 cannot be between the memory of load_ptr_0 and
1439    load_ptr_1.)
1440
1441    we then can use only the following expression to finish the alising checks
1442    between store_ptr_0 & load_ptr_0 and store_ptr_0 & load_ptr_1:
1443
1444    ((store_ptr_0 + store_segment_length_0) <= load_ptr_0)
1445    || (load_ptr_1 + load_segment_length_1 <= store_ptr_0))
1446
1447    Note that we only consider that load_ptr_0 and load_ptr_1 have the same
1448    basic address.  */
1449
1450 void
1451 prune_runtime_alias_test_list (vec<dr_with_seg_len_pair_t> *alias_pairs,
1452                                poly_uint64)
1453 {
1454   /* Sort the collected data ref pairs so that we can scan them once to
1455      combine all possible aliasing checks.  */
1456   alias_pairs->qsort (comp_dr_with_seg_len_pair);
1457
1458   /* Scan the sorted dr pairs and check if we can combine alias checks
1459      of two neighboring dr pairs.  */
1460   for (size_t i = 1; i < alias_pairs->length (); ++i)
1461     {
1462       /* Deal with two ddrs (dr_a1, dr_b1) and (dr_a2, dr_b2).  */
1463       dr_with_seg_len *dr_a1 = &(*alias_pairs)[i-1].first,
1464                       *dr_b1 = &(*alias_pairs)[i-1].second,
1465                       *dr_a2 = &(*alias_pairs)[i].first,
1466                       *dr_b2 = &(*alias_pairs)[i].second;
1467
1468       /* Remove duplicate data ref pairs.  */
1469       if (*dr_a1 == *dr_a2 && *dr_b1 == *dr_b2)
1470         {
1471           if (dump_enabled_p ())
1472             {
1473               dump_printf (MSG_NOTE, "found equal ranges ");
1474               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_a1->dr));
1475               dump_printf (MSG_NOTE,  ", ");
1476               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_b1->dr));
1477               dump_printf (MSG_NOTE,  " and ");
1478               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_a2->dr));
1479               dump_printf (MSG_NOTE,  ", ");
1480               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_b2->dr));
1481               dump_printf (MSG_NOTE, "\n");
1482             }
1483           alias_pairs->ordered_remove (i--);
1484           continue;
1485         }
1486
1487       if (*dr_a1 == *dr_a2 || *dr_b1 == *dr_b2)
1488         {
1489           /* We consider the case that DR_B1 and DR_B2 are same memrefs,
1490              and DR_A1 and DR_A2 are two consecutive memrefs.  */
1491           if (*dr_a1 == *dr_a2)
1492             {
1493               std::swap (dr_a1, dr_b1);
1494               std::swap (dr_a2, dr_b2);
1495             }
1496
1497           poly_int64 init_a1, init_a2;
1498           /* Only consider cases in which the distance between the initial
1499              DR_A1 and the initial DR_A2 is known at compile time.  */
1500           if (!operand_equal_p (DR_BASE_ADDRESS (dr_a1->dr),
1501                                 DR_BASE_ADDRESS (dr_a2->dr), 0)
1502               || !operand_equal_p (DR_OFFSET (dr_a1->dr),
1503                                    DR_OFFSET (dr_a2->dr), 0)
1504               || !poly_int_tree_p (DR_INIT (dr_a1->dr), &init_a1)
1505               || !poly_int_tree_p (DR_INIT (dr_a2->dr), &init_a2))
1506             continue;
1507
1508           /* Don't combine if we can't tell which one comes first.  */
1509           if (!ordered_p (init_a1, init_a2))
1510             continue;
1511
1512           /* Make sure dr_a1 starts left of dr_a2.  */
1513           if (maybe_gt (init_a1, init_a2))
1514             {
1515               std::swap (*dr_a1, *dr_a2);
1516               std::swap (init_a1, init_a2);
1517             }
1518
1519           /* Work out what the segment length would be if we did combine
1520              DR_A1 and DR_A2:
1521
1522              - If DR_A1 and DR_A2 have equal lengths, that length is
1523                also the combined length.
1524
1525              - If DR_A1 and DR_A2 both have negative "lengths", the combined
1526                length is the lower bound on those lengths.
1527
1528              - If DR_A1 and DR_A2 both have positive lengths, the combined
1529                length is the upper bound on those lengths.
1530
1531              Other cases are unlikely to give a useful combination.
1532
1533              The lengths both have sizetype, so the sign is taken from
1534              the step instead.  */
1535           if (!operand_equal_p (dr_a1->seg_len, dr_a2->seg_len, 0))
1536             {
1537               poly_uint64 seg_len_a1, seg_len_a2;
1538               if (!poly_int_tree_p (dr_a1->seg_len, &seg_len_a1)
1539                   || !poly_int_tree_p (dr_a2->seg_len, &seg_len_a2))
1540                 continue;
1541
1542               tree indicator_a = dr_direction_indicator (dr_a1->dr);
1543               if (TREE_CODE (indicator_a) != INTEGER_CST)
1544                 continue;
1545
1546               tree indicator_b = dr_direction_indicator (dr_a2->dr);
1547               if (TREE_CODE (indicator_b) != INTEGER_CST)
1548                 continue;
1549
1550               int sign_a = tree_int_cst_sgn (indicator_a);
1551               int sign_b = tree_int_cst_sgn (indicator_b);
1552
1553               poly_uint64 new_seg_len;
1554               if (sign_a <= 0 && sign_b <= 0)
1555                 new_seg_len = lower_bound (seg_len_a1, seg_len_a2);
1556               else if (sign_a >= 0 && sign_b >= 0)
1557                 new_seg_len = upper_bound (seg_len_a1, seg_len_a2);
1558               else
1559                 continue;
1560
1561               dr_a1->seg_len = build_int_cst (TREE_TYPE (dr_a1->seg_len),
1562                                               new_seg_len);
1563               dr_a1->align = MIN (dr_a1->align, known_alignment (new_seg_len));
1564             }
1565
1566           /* This is always positive due to the swap above.  */
1567           poly_uint64 diff = init_a2 - init_a1;
1568
1569           /* The new check will start at DR_A1.  Make sure that its access
1570              size encompasses the initial DR_A2.  */
1571           if (maybe_lt (dr_a1->access_size, diff + dr_a2->access_size))
1572             {
1573               dr_a1->access_size = upper_bound (dr_a1->access_size,
1574                                                 diff + dr_a2->access_size);
1575               unsigned int new_align = known_alignment (dr_a1->access_size);
1576               dr_a1->align = MIN (dr_a1->align, new_align);
1577             }
1578           if (dump_enabled_p ())
1579             {
1580               dump_printf (MSG_NOTE, "merging ranges for ");
1581               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_a1->dr));
1582               dump_printf (MSG_NOTE,  ", ");
1583               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_b1->dr));
1584               dump_printf (MSG_NOTE,  " and ");
1585               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_a2->dr));
1586               dump_printf (MSG_NOTE,  ", ");
1587               dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_b2->dr));
1588               dump_printf (MSG_NOTE, "\n");
1589             }
1590           alias_pairs->ordered_remove (i);
1591           i--;
1592         }
1593     }
1594 }
1595
1596 /* Given LOOP's two data references and segment lengths described by DR_A
1597    and DR_B, create expression checking if the two addresses ranges intersect
1598    with each other based on index of the two addresses.  This can only be
1599    done if DR_A and DR_B referring to the same (array) object and the index
1600    is the only difference.  For example:
1601
1602                        DR_A                           DR_B
1603       data-ref         arr[i]                         arr[j]
1604       base_object      arr                            arr
1605       index            {i_0, +, 1}_loop               {j_0, +, 1}_loop
1606
1607    The addresses and their index are like:
1608
1609         |<- ADDR_A    ->|          |<- ADDR_B    ->|
1610      ------------------------------------------------------->
1611         |   |   |   |   |          |   |   |   |   |
1612      ------------------------------------------------------->
1613         i_0 ...         i_0+4      j_0 ...         j_0+4
1614
1615    We can create expression based on index rather than address:
1616
1617      (i_0 + 4 < j_0 || j_0 + 4 < i_0)
1618
1619    Note evolution step of index needs to be considered in comparison.  */
1620
1621 static bool
1622 create_intersect_range_checks_index (struct loop *loop, tree *cond_expr,
1623                                      const dr_with_seg_len& dr_a,
1624                                      const dr_with_seg_len& dr_b)
1625 {
1626   if (integer_zerop (DR_STEP (dr_a.dr))
1627       || integer_zerop (DR_STEP (dr_b.dr))
1628       || DR_NUM_DIMENSIONS (dr_a.dr) != DR_NUM_DIMENSIONS (dr_b.dr))
1629     return false;
1630
1631   poly_uint64 seg_len1, seg_len2;
1632   if (!poly_int_tree_p (dr_a.seg_len, &seg_len1)
1633       || !poly_int_tree_p (dr_b.seg_len, &seg_len2))
1634     return false;
1635
1636   if (!tree_fits_shwi_p (DR_STEP (dr_a.dr)))
1637     return false;
1638
1639   if (!operand_equal_p (DR_BASE_OBJECT (dr_a.dr), DR_BASE_OBJECT (dr_b.dr), 0))
1640     return false;
1641
1642   if (!operand_equal_p (DR_STEP (dr_a.dr), DR_STEP (dr_b.dr), 0))
1643     return false;
1644
1645   gcc_assert (TREE_CODE (DR_STEP (dr_a.dr)) == INTEGER_CST);
1646
1647   bool neg_step = tree_int_cst_compare (DR_STEP (dr_a.dr), size_zero_node) < 0;
1648   unsigned HOST_WIDE_INT abs_step = tree_to_shwi (DR_STEP (dr_a.dr));
1649   if (neg_step)
1650     {
1651       abs_step = -abs_step;
1652       seg_len1 = -seg_len1;
1653       seg_len2 = -seg_len2;
1654     }
1655   else
1656     {
1657       /* Include the access size in the length, so that we only have one
1658          tree addition below.  */
1659       seg_len1 += dr_a.access_size;
1660       seg_len2 += dr_b.access_size;
1661     }
1662
1663   /* Infer the number of iterations with which the memory segment is accessed
1664      by DR.  In other words, alias is checked if memory segment accessed by
1665      DR_A in some iterations intersect with memory segment accessed by DR_B
1666      in the same amount iterations.
1667      Note segnment length is a linear function of number of iterations with
1668      DR_STEP as the coefficient.  */
1669   poly_uint64 niter_len1, niter_len2;
1670   if (!can_div_trunc_p (seg_len1 + abs_step - 1, abs_step, &niter_len1)
1671       || !can_div_trunc_p (seg_len2 + abs_step - 1, abs_step, &niter_len2))
1672     return false;
1673
1674   poly_uint64 niter_access1 = 0, niter_access2 = 0;
1675   if (neg_step)
1676     {
1677       /* Divide each access size by the byte step, rounding up.  */
1678       if (!can_div_trunc_p (dr_a.access_size - abs_step - 1,
1679                             abs_step, &niter_access1)
1680           || !can_div_trunc_p (dr_b.access_size + abs_step - 1,
1681                                abs_step, &niter_access2))
1682         return false;
1683     }
1684
1685   unsigned int i;
1686   for (i = 0; i < DR_NUM_DIMENSIONS (dr_a.dr); i++)
1687     {
1688       tree access1 = DR_ACCESS_FN (dr_a.dr, i);
1689       tree access2 = DR_ACCESS_FN (dr_b.dr, i);
1690       /* Two indices must be the same if they are not scev, or not scev wrto
1691          current loop being vecorized.  */
1692       if (TREE_CODE (access1) != POLYNOMIAL_CHREC
1693           || TREE_CODE (access2) != POLYNOMIAL_CHREC
1694           || CHREC_VARIABLE (access1) != (unsigned)loop->num
1695           || CHREC_VARIABLE (access2) != (unsigned)loop->num)
1696         {
1697           if (operand_equal_p (access1, access2, 0))
1698             continue;
1699
1700           return false;
1701         }
1702       /* The two indices must have the same step.  */
1703       if (!operand_equal_p (CHREC_RIGHT (access1), CHREC_RIGHT (access2), 0))
1704         return false;
1705
1706       tree idx_step = CHREC_RIGHT (access1);
1707       /* Index must have const step, otherwise DR_STEP won't be constant.  */
1708       gcc_assert (TREE_CODE (idx_step) == INTEGER_CST);
1709       /* Index must evaluate in the same direction as DR.  */
1710       gcc_assert (!neg_step || tree_int_cst_sign_bit (idx_step) == 1);
1711
1712       tree min1 = CHREC_LEFT (access1);
1713       tree min2 = CHREC_LEFT (access2);
1714       if (!types_compatible_p (TREE_TYPE (min1), TREE_TYPE (min2)))
1715         return false;
1716
1717       /* Ideally, alias can be checked against loop's control IV, but we
1718          need to prove linear mapping between control IV and reference
1719          index.  Although that should be true, we check against (array)
1720          index of data reference.  Like segment length, index length is
1721          linear function of the number of iterations with index_step as
1722          the coefficient, i.e, niter_len * idx_step.  */
1723       tree idx_len1 = fold_build2 (MULT_EXPR, TREE_TYPE (min1), idx_step,
1724                                    build_int_cst (TREE_TYPE (min1),
1725                                                   niter_len1));
1726       tree idx_len2 = fold_build2 (MULT_EXPR, TREE_TYPE (min2), idx_step,
1727                                    build_int_cst (TREE_TYPE (min2),
1728                                                   niter_len2));
1729       tree max1 = fold_build2 (PLUS_EXPR, TREE_TYPE (min1), min1, idx_len1);
1730       tree max2 = fold_build2 (PLUS_EXPR, TREE_TYPE (min2), min2, idx_len2);
1731       /* Adjust ranges for negative step.  */
1732       if (neg_step)
1733         {
1734           /* IDX_LEN1 and IDX_LEN2 are negative in this case.  */
1735           std::swap (min1, max1);
1736           std::swap (min2, max2);
1737
1738           /* As with the lengths just calculated, we've measured the access
1739              sizes in iterations, so multiply them by the index step.  */
1740           tree idx_access1
1741             = fold_build2 (MULT_EXPR, TREE_TYPE (min1), idx_step,
1742                            build_int_cst (TREE_TYPE (min1), niter_access1));
1743           tree idx_access2
1744             = fold_build2 (MULT_EXPR, TREE_TYPE (min2), idx_step,
1745                            build_int_cst (TREE_TYPE (min2), niter_access2));
1746
1747           /* MINUS_EXPR because the above values are negative.  */
1748           max1 = fold_build2 (MINUS_EXPR, TREE_TYPE (max1), max1, idx_access1);
1749           max2 = fold_build2 (MINUS_EXPR, TREE_TYPE (max2), max2, idx_access2);
1750         }
1751       tree part_cond_expr
1752         = fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
1753             fold_build2 (LE_EXPR, boolean_type_node, max1, min2),
1754             fold_build2 (LE_EXPR, boolean_type_node, max2, min1));
1755       if (*cond_expr)
1756         *cond_expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1757                                   *cond_expr, part_cond_expr);
1758       else
1759         *cond_expr = part_cond_expr;
1760     }
1761   return true;
1762 }
1763
1764 /* If ALIGN is nonzero, set up *SEQ_MIN_OUT and *SEQ_MAX_OUT so that for
1765    every address ADDR accessed by D:
1766
1767      *SEQ_MIN_OUT <= ADDR (== ADDR & -ALIGN) <= *SEQ_MAX_OUT
1768
1769    In this case, every element accessed by D is aligned to at least
1770    ALIGN bytes.
1771
1772    If ALIGN is zero then instead set *SEG_MAX_OUT so that:
1773
1774      *SEQ_MIN_OUT <= ADDR < *SEQ_MAX_OUT.  */
1775
1776 static void
1777 get_segment_min_max (const dr_with_seg_len &d, tree *seg_min_out,
1778                      tree *seg_max_out, HOST_WIDE_INT align)
1779 {
1780   /* Each access has the following pattern:
1781
1782           <- |seg_len| ->
1783           <--- A: -ve step --->
1784           +-----+-------+-----+-------+-----+
1785           | n-1 | ,.... |  0  | ..... | n-1 |
1786           +-----+-------+-----+-------+-----+
1787                         <--- B: +ve step --->
1788                         <- |seg_len| ->
1789                         |
1790                    base address
1791
1792      where "n" is the number of scalar iterations covered by the segment.
1793      (This should be VF for a particular pair if we know that both steps
1794      are the same, otherwise it will be the full number of scalar loop
1795      iterations.)
1796
1797      A is the range of bytes accessed when the step is negative,
1798      B is the range when the step is positive.
1799
1800      If the access size is "access_size" bytes, the lowest addressed byte is:
1801
1802          base + (step < 0 ? seg_len : 0)   [LB]
1803
1804      and the highest addressed byte is always below:
1805
1806          base + (step < 0 ? 0 : seg_len) + access_size   [UB]
1807
1808      Thus:
1809
1810          LB <= ADDR < UB
1811
1812      If ALIGN is nonzero, all three values are aligned to at least ALIGN
1813      bytes, so:
1814
1815          LB <= ADDR <= UB - ALIGN
1816
1817      where "- ALIGN" folds naturally with the "+ access_size" and often
1818      cancels it out.
1819
1820      We don't try to simplify LB and UB beyond this (e.g. by using
1821      MIN and MAX based on whether seg_len rather than the stride is
1822      negative) because it is possible for the absolute size of the
1823      segment to overflow the range of a ssize_t.
1824
1825      Keeping the pointer_plus outside of the cond_expr should allow
1826      the cond_exprs to be shared with other alias checks.  */
1827   tree indicator = dr_direction_indicator (d.dr);
1828   tree neg_step = fold_build2 (LT_EXPR, boolean_type_node,
1829                                fold_convert (ssizetype, indicator),
1830                                ssize_int (0));
1831   tree addr_base = fold_build_pointer_plus (DR_BASE_ADDRESS (d.dr),
1832                                             DR_OFFSET (d.dr));
1833   addr_base = fold_build_pointer_plus (addr_base, DR_INIT (d.dr));
1834   tree seg_len
1835     = fold_convert (sizetype, rewrite_to_non_trapping_overflow (d.seg_len));
1836
1837   tree min_reach = fold_build3 (COND_EXPR, sizetype, neg_step,
1838                                 seg_len, size_zero_node);
1839   tree max_reach = fold_build3 (COND_EXPR, sizetype, neg_step,
1840                                 size_zero_node, seg_len);
1841   max_reach = fold_build2 (PLUS_EXPR, sizetype, max_reach,
1842                            size_int (d.access_size - align));
1843
1844   *seg_min_out = fold_build_pointer_plus (addr_base, min_reach);
1845   *seg_max_out = fold_build_pointer_plus (addr_base, max_reach);
1846 }
1847
1848 /* Given two data references and segment lengths described by DR_A and DR_B,
1849    create expression checking if the two addresses ranges intersect with
1850    each other:
1851
1852      ((DR_A_addr_0 + DR_A_segment_length_0) <= DR_B_addr_0)
1853      || (DR_B_addr_0 + DER_B_segment_length_0) <= DR_A_addr_0))  */
1854
1855 static void
1856 create_intersect_range_checks (struct loop *loop, tree *cond_expr,
1857                                const dr_with_seg_len& dr_a,
1858                                const dr_with_seg_len& dr_b)
1859 {
1860   *cond_expr = NULL_TREE;
1861   if (create_intersect_range_checks_index (loop, cond_expr, dr_a, dr_b))
1862     return;
1863
1864   unsigned HOST_WIDE_INT min_align;
1865   tree_code cmp_code;
1866   if (TREE_CODE (DR_STEP (dr_a.dr)) == INTEGER_CST
1867       && TREE_CODE (DR_STEP (dr_b.dr)) == INTEGER_CST)
1868     {
1869       /* In this case adding access_size to seg_len is likely to give
1870          a simple X * step, where X is either the number of scalar
1871          iterations or the vectorization factor.  We're better off
1872          keeping that, rather than subtracting an alignment from it.
1873
1874          In this case the maximum values are exclusive and so there is
1875          no alias if the maximum of one segment equals the minimum
1876          of another.  */
1877       min_align = 0;
1878       cmp_code = LE_EXPR;
1879     }
1880   else
1881     {
1882       /* Calculate the minimum alignment shared by all four pointers,
1883          then arrange for this alignment to be subtracted from the
1884          exclusive maximum values to get inclusive maximum values.
1885          This "- min_align" is cumulative with a "+ access_size"
1886          in the calculation of the maximum values.  In the best
1887          (and common) case, the two cancel each other out, leaving
1888          us with an inclusive bound based only on seg_len.  In the
1889          worst case we're simply adding a smaller number than before.
1890
1891          Because the maximum values are inclusive, there is an alias
1892          if the maximum value of one segment is equal to the minimum
1893          value of the other.  */
1894       min_align = MIN (dr_a.align, dr_b.align);
1895       cmp_code = LT_EXPR;
1896     }
1897
1898   tree seg_a_min, seg_a_max, seg_b_min, seg_b_max;
1899   get_segment_min_max (dr_a, &seg_a_min, &seg_a_max, min_align);
1900   get_segment_min_max (dr_b, &seg_b_min, &seg_b_max, min_align);
1901
1902   *cond_expr
1903     = fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
1904         fold_build2 (cmp_code, boolean_type_node, seg_a_max, seg_b_min),
1905         fold_build2 (cmp_code, boolean_type_node, seg_b_max, seg_a_min));
1906 }
1907
1908 /* Create a conditional expression that represents the run-time checks for
1909    overlapping of address ranges represented by a list of data references
1910    pairs passed in ALIAS_PAIRS.  Data references are in LOOP.  The returned
1911    COND_EXPR is the conditional expression to be used in the if statement
1912    that controls which version of the loop gets executed at runtime.  */
1913
1914 void
1915 create_runtime_alias_checks (struct loop *loop,
1916                              vec<dr_with_seg_len_pair_t> *alias_pairs,
1917                              tree * cond_expr)
1918 {
1919   tree part_cond_expr;
1920
1921   for (size_t i = 0, s = alias_pairs->length (); i < s; ++i)
1922     {
1923       const dr_with_seg_len& dr_a = (*alias_pairs)[i].first;
1924       const dr_with_seg_len& dr_b = (*alias_pairs)[i].second;
1925
1926       if (dump_enabled_p ())
1927         {
1928           dump_printf (MSG_NOTE, "create runtime check for data references ");
1929           dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_a.dr));
1930           dump_printf (MSG_NOTE, " and ");
1931           dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_REF (dr_b.dr));
1932           dump_printf (MSG_NOTE, "\n");
1933         }
1934
1935       /* Create condition expression for each pair data references.  */
1936       create_intersect_range_checks (loop, &part_cond_expr, dr_a, dr_b);
1937       if (*cond_expr)
1938         *cond_expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1939                                   *cond_expr, part_cond_expr);
1940       else
1941         *cond_expr = part_cond_expr;
1942     }
1943 }
1944
1945 /* Check if OFFSET1 and OFFSET2 (DR_OFFSETs of some data-refs) are identical
1946    expressions.  */
1947 static bool
1948 dr_equal_offsets_p1 (tree offset1, tree offset2)
1949 {
1950   bool res;
1951
1952   STRIP_NOPS (offset1);
1953   STRIP_NOPS (offset2);
1954
1955   if (offset1 == offset2)
1956     return true;
1957
1958   if (TREE_CODE (offset1) != TREE_CODE (offset2)
1959       || (!BINARY_CLASS_P (offset1) && !UNARY_CLASS_P (offset1)))
1960     return false;
1961
1962   res = dr_equal_offsets_p1 (TREE_OPERAND (offset1, 0),
1963                              TREE_OPERAND (offset2, 0));
1964
1965   if (!res || !BINARY_CLASS_P (offset1))
1966     return res;
1967
1968   res = dr_equal_offsets_p1 (TREE_OPERAND (offset1, 1),
1969                              TREE_OPERAND (offset2, 1));
1970
1971   return res;
1972 }
1973
1974 /* Check if DRA and DRB have equal offsets.  */
1975 bool
1976 dr_equal_offsets_p (struct data_reference *dra,
1977                     struct data_reference *drb)
1978 {
1979   tree offset1, offset2;
1980
1981   offset1 = DR_OFFSET (dra);
1982   offset2 = DR_OFFSET (drb);
1983
1984   return dr_equal_offsets_p1 (offset1, offset2);
1985 }
1986
1987 /* Returns true if FNA == FNB.  */
1988
1989 static bool
1990 affine_function_equal_p (affine_fn fna, affine_fn fnb)
1991 {
1992   unsigned i, n = fna.length ();
1993
1994   if (n != fnb.length ())
1995     return false;
1996
1997   for (i = 0; i < n; i++)
1998     if (!operand_equal_p (fna[i], fnb[i], 0))
1999       return false;
2000
2001   return true;
2002 }
2003
2004 /* If all the functions in CF are the same, returns one of them,
2005    otherwise returns NULL.  */
2006
2007 static affine_fn
2008 common_affine_function (conflict_function *cf)
2009 {
2010   unsigned i;
2011   affine_fn comm;
2012
2013   if (!CF_NONTRIVIAL_P (cf))
2014     return affine_fn ();
2015
2016   comm = cf->fns[0];
2017
2018   for (i = 1; i < cf->n; i++)
2019     if (!affine_function_equal_p (comm, cf->fns[i]))
2020       return affine_fn ();
2021
2022   return comm;
2023 }
2024
2025 /* Returns the base of the affine function FN.  */
2026
2027 static tree
2028 affine_function_base (affine_fn fn)
2029 {
2030   return fn[0];
2031 }
2032
2033 /* Returns true if FN is a constant.  */
2034
2035 static bool
2036 affine_function_constant_p (affine_fn fn)
2037 {
2038   unsigned i;
2039   tree coef;
2040
2041   for (i = 1; fn.iterate (i, &coef); i++)
2042     if (!integer_zerop (coef))
2043       return false;
2044
2045   return true;
2046 }
2047
2048 /* Returns true if FN is the zero constant function.  */
2049
2050 static bool
2051 affine_function_zero_p (affine_fn fn)
2052 {
2053   return (integer_zerop (affine_function_base (fn))
2054           && affine_function_constant_p (fn));
2055 }
2056
2057 /* Returns a signed integer type with the largest precision from TA
2058    and TB.  */
2059
2060 static tree
2061 signed_type_for_types (tree ta, tree tb)
2062 {
2063   if (TYPE_PRECISION (ta) > TYPE_PRECISION (tb))
2064     return signed_type_for (ta);
2065   else
2066     return signed_type_for (tb);
2067 }
2068
2069 /* Applies operation OP on affine functions FNA and FNB, and returns the
2070    result.  */
2071
2072 static affine_fn
2073 affine_fn_op (enum tree_code op, affine_fn fna, affine_fn fnb)
2074 {
2075   unsigned i, n, m;
2076   affine_fn ret;
2077   tree coef;
2078
2079   if (fnb.length () > fna.length ())
2080     {
2081       n = fna.length ();
2082       m = fnb.length ();
2083     }
2084   else
2085     {
2086       n = fnb.length ();
2087       m = fna.length ();
2088     }
2089
2090   ret.create (m);
2091   for (i = 0; i < n; i++)
2092     {
2093       tree type = signed_type_for_types (TREE_TYPE (fna[i]),
2094                                          TREE_TYPE (fnb[i]));
2095       ret.quick_push (fold_build2 (op, type, fna[i], fnb[i]));
2096     }
2097
2098   for (; fna.iterate (i, &coef); i++)
2099     ret.quick_push (fold_build2 (op, signed_type_for (TREE_TYPE (coef)),
2100                                  coef, integer_zero_node));
2101   for (; fnb.iterate (i, &coef); i++)
2102     ret.quick_push (fold_build2 (op, signed_type_for (TREE_TYPE (coef)),
2103                                  integer_zero_node, coef));
2104
2105   return ret;
2106 }
2107
2108 /* Returns the sum of affine functions FNA and FNB.  */
2109
2110 static affine_fn
2111 affine_fn_plus (affine_fn fna, affine_fn fnb)
2112 {
2113   return affine_fn_op (PLUS_EXPR, fna, fnb);
2114 }
2115
2116 /* Returns the difference of affine functions FNA and FNB.  */
2117
2118 static affine_fn
2119 affine_fn_minus (affine_fn fna, affine_fn fnb)
2120 {
2121   return affine_fn_op (MINUS_EXPR, fna, fnb);
2122 }
2123
2124 /* Frees affine function FN.  */
2125
2126 static void
2127 affine_fn_free (affine_fn fn)
2128 {
2129   fn.release ();
2130 }
2131
2132 /* Determine for each subscript in the data dependence relation DDR
2133    the distance.  */
2134
2135 static void
2136 compute_subscript_distance (struct data_dependence_relation *ddr)
2137 {
2138   conflict_function *cf_a, *cf_b;
2139   affine_fn fn_a, fn_b, diff;
2140
2141   if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
2142     {
2143       unsigned int i;
2144
2145       for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
2146         {
2147           struct subscript *subscript;
2148
2149           subscript = DDR_SUBSCRIPT (ddr, i);
2150           cf_a = SUB_CONFLICTS_IN_A (subscript);
2151           cf_b = SUB_CONFLICTS_IN_B (subscript);
2152
2153           fn_a = common_affine_function (cf_a);
2154           fn_b = common_affine_function (cf_b);
2155           if (!fn_a.exists () || !fn_b.exists ())
2156             {
2157               SUB_DISTANCE (subscript) = chrec_dont_know;
2158               return;
2159             }
2160           diff = affine_fn_minus (fn_a, fn_b);
2161
2162           if (affine_function_constant_p (diff))
2163             SUB_DISTANCE (subscript) = affine_function_base (diff);
2164           else
2165             SUB_DISTANCE (subscript) = chrec_dont_know;
2166
2167           affine_fn_free (diff);
2168         }
2169     }
2170 }
2171
2172 /* Returns the conflict function for "unknown".  */
2173
2174 static conflict_function *
2175 conflict_fn_not_known (void)
2176 {
2177   conflict_function *fn = XCNEW (conflict_function);
2178   fn->n = NOT_KNOWN;
2179
2180   return fn;
2181 }
2182
2183 /* Returns the conflict function for "independent".  */
2184
2185 static conflict_function *
2186 conflict_fn_no_dependence (void)
2187 {
2188   conflict_function *fn = XCNEW (conflict_function);
2189   fn->n = NO_DEPENDENCE;
2190
2191   return fn;
2192 }
2193
2194 /* Returns true if the address of OBJ is invariant in LOOP.  */
2195
2196 static bool
2197 object_address_invariant_in_loop_p (const struct loop *loop, const_tree obj)
2198 {
2199   while (handled_component_p (obj))
2200     {
2201       if (TREE_CODE (obj) == ARRAY_REF)
2202         {
2203           for (int i = 1; i < 4; ++i)
2204             if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (obj, i),
2205                                                         loop->num))
2206               return false;
2207         }
2208       else if (TREE_CODE (obj) == COMPONENT_REF)
2209         {
2210           if (chrec_contains_symbols_defined_in_loop (TREE_OPERAND (obj, 2),
2211                                                       loop->num))
2212             return false;
2213         }
2214       obj = TREE_OPERAND (obj, 0);
2215     }
2216
2217   if (!INDIRECT_REF_P (obj)
2218       && TREE_CODE (obj) != MEM_REF)
2219     return true;
2220
2221   return !chrec_contains_symbols_defined_in_loop (TREE_OPERAND (obj, 0),
2222                                                   loop->num);
2223 }
2224
2225 /* Returns false if we can prove that data references A and B do not alias,
2226    true otherwise.  If LOOP_NEST is false no cross-iteration aliases are
2227    considered.  */
2228
2229 bool
2230 dr_may_alias_p (const struct data_reference *a, const struct data_reference *b,
2231                 bool loop_nest)
2232 {
2233   tree addr_a = DR_BASE_OBJECT (a);
2234   tree addr_b = DR_BASE_OBJECT (b);
2235
2236   /* If we are not processing a loop nest but scalar code we
2237      do not need to care about possible cross-iteration dependences
2238      and thus can process the full original reference.  Do so,
2239      similar to how loop invariant motion applies extra offset-based
2240      disambiguation.  */
2241   if (!loop_nest)
2242     {
2243       aff_tree off1, off2;
2244       poly_widest_int size1, size2;
2245       get_inner_reference_aff (DR_REF (a), &off1, &size1);
2246       get_inner_reference_aff (DR_REF (b), &off2, &size2);
2247       aff_combination_scale (&off1, -1);
2248       aff_combination_add (&off2, &off1);
2249       if (aff_comb_cannot_overlap_p (&off2, size1, size2))
2250         return false;
2251     }
2252
2253   if ((TREE_CODE (addr_a) == MEM_REF || TREE_CODE (addr_a) == TARGET_MEM_REF)
2254       && (TREE_CODE (addr_b) == MEM_REF || TREE_CODE (addr_b) == TARGET_MEM_REF)
2255       && MR_DEPENDENCE_CLIQUE (addr_a) == MR_DEPENDENCE_CLIQUE (addr_b)
2256       && MR_DEPENDENCE_BASE (addr_a) != MR_DEPENDENCE_BASE (addr_b))
2257     return false;
2258
2259   /* If we had an evolution in a pointer-based MEM_REF BASE_OBJECT we
2260      do not know the size of the base-object.  So we cannot do any
2261      offset/overlap based analysis but have to rely on points-to
2262      information only.  */
2263   if (TREE_CODE (addr_a) == MEM_REF
2264       && (DR_UNCONSTRAINED_BASE (a)
2265           || TREE_CODE (TREE_OPERAND (addr_a, 0)) == SSA_NAME))
2266     {
2267       /* For true dependences we can apply TBAA.  */
2268       if (flag_strict_aliasing
2269           && DR_IS_WRITE (a) && DR_IS_READ (b)
2270           && !alias_sets_conflict_p (get_alias_set (DR_REF (a)),
2271                                      get_alias_set (DR_REF (b))))
2272         return false;
2273       if (TREE_CODE (addr_b) == MEM_REF)
2274         return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
2275                                        TREE_OPERAND (addr_b, 0));
2276       else
2277         return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
2278                                        build_fold_addr_expr (addr_b));
2279     }
2280   else if (TREE_CODE (addr_b) == MEM_REF
2281            && (DR_UNCONSTRAINED_BASE (b)
2282                || TREE_CODE (TREE_OPERAND (addr_b, 0)) == SSA_NAME))
2283     {
2284       /* For true dependences we can apply TBAA.  */
2285       if (flag_strict_aliasing
2286           && DR_IS_WRITE (a) && DR_IS_READ (b)
2287           && !alias_sets_conflict_p (get_alias_set (DR_REF (a)),
2288                                      get_alias_set (DR_REF (b))))
2289         return false;
2290       if (TREE_CODE (addr_a) == MEM_REF)
2291         return ptr_derefs_may_alias_p (TREE_OPERAND (addr_a, 0),
2292                                        TREE_OPERAND (addr_b, 0));
2293       else
2294         return ptr_derefs_may_alias_p (build_fold_addr_expr (addr_a),
2295                                        TREE_OPERAND (addr_b, 0));
2296     }
2297
2298   /* Otherwise DR_BASE_OBJECT is an access that covers the whole object
2299      that is being subsetted in the loop nest.  */
2300   if (DR_IS_WRITE (a) && DR_IS_WRITE (b))
2301     return refs_output_dependent_p (addr_a, addr_b);
2302   else if (DR_IS_READ (a) && DR_IS_WRITE (b))
2303     return refs_anti_dependent_p (addr_a, addr_b);
2304   return refs_may_alias_p (addr_a, addr_b);
2305 }
2306
2307 /* REF_A and REF_B both satisfy access_fn_component_p.  Return true
2308    if it is meaningful to compare their associated access functions
2309    when checking for dependencies.  */
2310
2311 static bool
2312 access_fn_components_comparable_p (tree ref_a, tree ref_b)
2313 {
2314   /* Allow pairs of component refs from the following sets:
2315
2316        { REALPART_EXPR, IMAGPART_EXPR }
2317        { COMPONENT_REF }
2318        { ARRAY_REF }.  */
2319   tree_code code_a = TREE_CODE (ref_a);
2320   tree_code code_b = TREE_CODE (ref_b);
2321   if (code_a == IMAGPART_EXPR)
2322     code_a = REALPART_EXPR;
2323   if (code_b == IMAGPART_EXPR)
2324     code_b = REALPART_EXPR;
2325   if (code_a != code_b)
2326     return false;
2327
2328   if (TREE_CODE (ref_a) == COMPONENT_REF)
2329     /* ??? We cannot simply use the type of operand #0 of the refs here as
2330        the Fortran compiler smuggles type punning into COMPONENT_REFs.
2331        Use the DECL_CONTEXT of the FIELD_DECLs instead.  */
2332     return (DECL_CONTEXT (TREE_OPERAND (ref_a, 1))
2333             == DECL_CONTEXT (TREE_OPERAND (ref_b, 1)));
2334
2335   return types_compatible_p (TREE_TYPE (TREE_OPERAND (ref_a, 0)),
2336                              TREE_TYPE (TREE_OPERAND (ref_b, 0)));
2337 }
2338
2339 /* Initialize a data dependence relation between data accesses A and
2340    B.  NB_LOOPS is the number of loops surrounding the references: the
2341    size of the classic distance/direction vectors.  */
2342
2343 struct data_dependence_relation *
2344 initialize_data_dependence_relation (struct data_reference *a,
2345                                      struct data_reference *b,
2346                                      vec<loop_p> loop_nest)
2347 {
2348   struct data_dependence_relation *res;
2349   unsigned int i;
2350
2351   res = XCNEW (struct data_dependence_relation);
2352   DDR_A (res) = a;
2353   DDR_B (res) = b;
2354   DDR_LOOP_NEST (res).create (0);
2355   DDR_SUBSCRIPTS (res).create (0);
2356   DDR_DIR_VECTS (res).create (0);
2357   DDR_DIST_VECTS (res).create (0);
2358
2359   if (a == NULL || b == NULL)
2360     {
2361       DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2362       return res;
2363     }
2364
2365   /* If the data references do not alias, then they are independent.  */
2366   if (!dr_may_alias_p (a, b, loop_nest.exists ()))
2367     {
2368       DDR_ARE_DEPENDENT (res) = chrec_known;
2369       return res;
2370     }
2371
2372   unsigned int num_dimensions_a = DR_NUM_DIMENSIONS (a);
2373   unsigned int num_dimensions_b = DR_NUM_DIMENSIONS (b);
2374   if (num_dimensions_a == 0 || num_dimensions_b == 0)
2375     {
2376       DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2377       return res;
2378     }
2379
2380   /* For unconstrained bases, the root (highest-indexed) subscript
2381      describes a variation in the base of the original DR_REF rather
2382      than a component access.  We have no type that accurately describes
2383      the new DR_BASE_OBJECT (whose TREE_TYPE describes the type *after*
2384      applying this subscript) so limit the search to the last real
2385      component access.
2386
2387      E.g. for:
2388
2389         void
2390         f (int a[][8], int b[][8])
2391         {
2392           for (int i = 0; i < 8; ++i)
2393             a[i * 2][0] = b[i][0];
2394         }
2395
2396      the a and b accesses have a single ARRAY_REF component reference [0]
2397      but have two subscripts.  */
2398   if (DR_UNCONSTRAINED_BASE (a))
2399     num_dimensions_a -= 1;
2400   if (DR_UNCONSTRAINED_BASE (b))
2401     num_dimensions_b -= 1;
2402
2403   /* These structures describe sequences of component references in
2404      DR_REF (A) and DR_REF (B).  Each component reference is tied to a
2405      specific access function.  */
2406   struct {
2407     /* The sequence starts at DR_ACCESS_FN (A, START_A) of A and
2408        DR_ACCESS_FN (B, START_B) of B (inclusive) and extends to higher
2409        indices.  In C notation, these are the indices of the rightmost
2410        component references; e.g. for a sequence .b.c.d, the start
2411        index is for .d.  */
2412     unsigned int start_a;
2413     unsigned int start_b;
2414
2415     /* The sequence contains LENGTH consecutive access functions from
2416        each DR.  */
2417     unsigned int length;
2418
2419     /* The enclosing objects for the A and B sequences respectively,
2420        i.e. the objects to which DR_ACCESS_FN (A, START_A + LENGTH - 1)
2421        and DR_ACCESS_FN (B, START_B + LENGTH - 1) are applied.  */
2422     tree object_a;
2423     tree object_b;
2424   } full_seq = {}, struct_seq = {};
2425
2426   /* Before each iteration of the loop:
2427
2428      - REF_A is what you get after applying DR_ACCESS_FN (A, INDEX_A) and
2429      - REF_B is what you get after applying DR_ACCESS_FN (B, INDEX_B).  */
2430   unsigned int index_a = 0;
2431   unsigned int index_b = 0;
2432   tree ref_a = DR_REF (a);
2433   tree ref_b = DR_REF (b);
2434
2435   /* Now walk the component references from the final DR_REFs back up to
2436      the enclosing base objects.  Each component reference corresponds
2437      to one access function in the DR, with access function 0 being for
2438      the final DR_REF and the highest-indexed access function being the
2439      one that is applied to the base of the DR.
2440
2441      Look for a sequence of component references whose access functions
2442      are comparable (see access_fn_components_comparable_p).  If more
2443      than one such sequence exists, pick the one nearest the base
2444      (which is the leftmost sequence in C notation).  Store this sequence
2445      in FULL_SEQ.
2446
2447      For example, if we have:
2448
2449         struct foo { struct bar s; ... } (*a)[10], (*b)[10];
2450
2451         A: a[0][i].s.c.d
2452         B: __real b[0][i].s.e[i].f
2453
2454      (where d is the same type as the real component of f) then the access
2455      functions would be:
2456
2457                          0   1   2   3
2458         A:              .d  .c  .s [i]
2459
2460                  0   1   2   3   4   5
2461         B:  __real  .f [i]  .e  .s [i]
2462
2463      The A0/B2 column isn't comparable, since .d is a COMPONENT_REF
2464      and [i] is an ARRAY_REF.  However, the A1/B3 column contains two
2465      COMPONENT_REF accesses for struct bar, so is comparable.  Likewise
2466      the A2/B4 column contains two COMPONENT_REF accesses for struct foo,
2467      so is comparable.  The A3/B5 column contains two ARRAY_REFs that
2468      index foo[10] arrays, so is again comparable.  The sequence is
2469      therefore:
2470
2471         A: [1, 3]  (i.e. [i].s.c)
2472         B: [3, 5]  (i.e. [i].s.e)
2473
2474      Also look for sequences of component references whose access
2475      functions are comparable and whose enclosing objects have the same
2476      RECORD_TYPE.  Store this sequence in STRUCT_SEQ.  In the above
2477      example, STRUCT_SEQ would be:
2478
2479         A: [1, 2]  (i.e. s.c)
2480         B: [3, 4]  (i.e. s.e)  */
2481   while (index_a < num_dimensions_a && index_b < num_dimensions_b)
2482     {
2483       /* REF_A and REF_B must be one of the component access types
2484          allowed by dr_analyze_indices.  */
2485       gcc_checking_assert (access_fn_component_p (ref_a));
2486       gcc_checking_assert (access_fn_component_p (ref_b));
2487
2488       /* Get the immediately-enclosing objects for REF_A and REF_B,
2489          i.e. the references *before* applying DR_ACCESS_FN (A, INDEX_A)
2490          and DR_ACCESS_FN (B, INDEX_B).  */
2491       tree object_a = TREE_OPERAND (ref_a, 0);
2492       tree object_b = TREE_OPERAND (ref_b, 0);
2493
2494       tree type_a = TREE_TYPE (object_a);
2495       tree type_b = TREE_TYPE (object_b);
2496       if (access_fn_components_comparable_p (ref_a, ref_b))
2497         {
2498           /* This pair of component accesses is comparable for dependence
2499              analysis, so we can include DR_ACCESS_FN (A, INDEX_A) and
2500              DR_ACCESS_FN (B, INDEX_B) in the sequence.  */
2501           if (full_seq.start_a + full_seq.length != index_a
2502               || full_seq.start_b + full_seq.length != index_b)
2503             {
2504               /* The accesses don't extend the current sequence,
2505                  so start a new one here.  */
2506               full_seq.start_a = index_a;
2507               full_seq.start_b = index_b;
2508               full_seq.length = 0;
2509             }
2510
2511           /* Add this pair of references to the sequence.  */
2512           full_seq.length += 1;
2513           full_seq.object_a = object_a;
2514           full_seq.object_b = object_b;
2515
2516           /* If the enclosing objects are structures (and thus have the
2517              same RECORD_TYPE), record the new sequence in STRUCT_SEQ.  */
2518           if (TREE_CODE (type_a) == RECORD_TYPE)
2519             struct_seq = full_seq;
2520
2521           /* Move to the next containing reference for both A and B.  */
2522           ref_a = object_a;
2523           ref_b = object_b;
2524           index_a += 1;
2525           index_b += 1;
2526           continue;
2527         }
2528
2529       /* Try to approach equal type sizes.  */
2530       if (!COMPLETE_TYPE_P (type_a)
2531           || !COMPLETE_TYPE_P (type_b)
2532           || !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type_a))
2533           || !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type_b)))
2534         break;
2535
2536       unsigned HOST_WIDE_INT size_a = tree_to_uhwi (TYPE_SIZE_UNIT (type_a));
2537       unsigned HOST_WIDE_INT size_b = tree_to_uhwi (TYPE_SIZE_UNIT (type_b));
2538       if (size_a <= size_b)
2539         {
2540           index_a += 1;
2541           ref_a = object_a;
2542         }
2543       if (size_b <= size_a)
2544         {
2545           index_b += 1;
2546           ref_b = object_b;
2547         }
2548     }
2549
2550   /* See whether FULL_SEQ ends at the base and whether the two bases
2551      are equal.  We do not care about TBAA or alignment info so we can
2552      use OEP_ADDRESS_OF to avoid false negatives.  */
2553   tree base_a = DR_BASE_OBJECT (a);
2554   tree base_b = DR_BASE_OBJECT (b);
2555   bool same_base_p = (full_seq.start_a + full_seq.length == num_dimensions_a
2556                       && full_seq.start_b + full_seq.length == num_dimensions_b
2557                       && DR_UNCONSTRAINED_BASE (a) == DR_UNCONSTRAINED_BASE (b)
2558                       && operand_equal_p (base_a, base_b, OEP_ADDRESS_OF)
2559                       && types_compatible_p (TREE_TYPE (base_a),
2560                                              TREE_TYPE (base_b))
2561                       && (!loop_nest.exists ()
2562                           || (object_address_invariant_in_loop_p
2563                               (loop_nest[0], base_a))));
2564
2565   /* If the bases are the same, we can include the base variation too.
2566      E.g. the b accesses in:
2567
2568        for (int i = 0; i < n; ++i)
2569          b[i + 4][0] = b[i][0];
2570
2571      have a definite dependence distance of 4, while for:
2572
2573        for (int i = 0; i < n; ++i)
2574          a[i + 4][0] = b[i][0];
2575
2576      the dependence distance depends on the gap between a and b.
2577
2578      If the bases are different then we can only rely on the sequence
2579      rooted at a structure access, since arrays are allowed to overlap
2580      arbitrarily and change shape arbitrarily.  E.g. we treat this as
2581      valid code:
2582
2583        int a[256];
2584        ...
2585        ((int (*)[4][3]) &a[1])[i][0] += ((int (*)[4][3]) &a[2])[i][0];
2586
2587      where two lvalues with the same int[4][3] type overlap, and where
2588      both lvalues are distinct from the object's declared type.  */
2589   if (same_base_p)
2590     {
2591       if (DR_UNCONSTRAINED_BASE (a))
2592         full_seq.length += 1;
2593     }
2594   else
2595     full_seq = struct_seq;
2596
2597   /* Punt if we didn't find a suitable sequence.  */
2598   if (full_seq.length == 0)
2599     {
2600       DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2601       return res;
2602     }
2603
2604   if (!same_base_p)
2605     {
2606       /* Partial overlap is possible for different bases when strict aliasing
2607          is not in effect.  It's also possible if either base involves a union
2608          access; e.g. for:
2609
2610            struct s1 { int a[2]; };
2611            struct s2 { struct s1 b; int c; };
2612            struct s3 { int d; struct s1 e; };
2613            union u { struct s2 f; struct s3 g; } *p, *q;
2614
2615          the s1 at "p->f.b" (base "p->f") partially overlaps the s1 at
2616          "p->g.e" (base "p->g") and might partially overlap the s1 at
2617          "q->g.e" (base "q->g").  */
2618       if (!flag_strict_aliasing
2619           || ref_contains_union_access_p (full_seq.object_a)
2620           || ref_contains_union_access_p (full_seq.object_b))
2621         {
2622           DDR_ARE_DEPENDENT (res) = chrec_dont_know;
2623           return res;
2624         }
2625
2626       DDR_COULD_BE_INDEPENDENT_P (res) = true;
2627       if (!loop_nest.exists ()
2628           || (object_address_invariant_in_loop_p (loop_nest[0],
2629                                                   full_seq.object_a)
2630               && object_address_invariant_in_loop_p (loop_nest[0],
2631                                                      full_seq.object_b)))
2632         {
2633           DDR_OBJECT_A (res) = full_seq.object_a;
2634           DDR_OBJECT_B (res) = full_seq.object_b;
2635         }
2636     }
2637
2638   DDR_AFFINE_P (res) = true;
2639   DDR_ARE_DEPENDENT (res) = NULL_TREE;
2640   DDR_SUBSCRIPTS (res).create (full_seq.length);
2641   DDR_LOOP_NEST (res) = loop_nest;
2642   DDR_INNER_LOOP (res) = 0;
2643   DDR_SELF_REFERENCE (res) = false;
2644
2645   for (i = 0; i < full_seq.length; ++i)
2646     {
2647       struct subscript *subscript;
2648
2649       subscript = XNEW (struct subscript);
2650       SUB_ACCESS_FN (subscript, 0) = DR_ACCESS_FN (a, full_seq.start_a + i);
2651       SUB_ACCESS_FN (subscript, 1) = DR_ACCESS_FN (b, full_seq.start_b + i);
2652       SUB_CONFLICTS_IN_A (subscript) = conflict_fn_not_known ();
2653       SUB_CONFLICTS_IN_B (subscript) = conflict_fn_not_known ();
2654       SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
2655       SUB_DISTANCE (subscript) = chrec_dont_know;
2656       DDR_SUBSCRIPTS (res).safe_push (subscript);
2657     }
2658
2659   return res;
2660 }
2661
2662 /* Frees memory used by the conflict function F.  */
2663
2664 static void
2665 free_conflict_function (conflict_function *f)
2666 {
2667   unsigned i;
2668
2669   if (CF_NONTRIVIAL_P (f))
2670     {
2671       for (i = 0; i < f->n; i++)
2672         affine_fn_free (f->fns[i]);
2673     }
2674   free (f);
2675 }
2676
2677 /* Frees memory used by SUBSCRIPTS.  */
2678
2679 static void
2680 free_subscripts (vec<subscript_p> subscripts)
2681 {
2682   unsigned i;
2683   subscript_p s;
2684
2685   FOR_EACH_VEC_ELT (subscripts, i, s)
2686     {
2687       free_conflict_function (s->conflicting_iterations_in_a);
2688       free_conflict_function (s->conflicting_iterations_in_b);
2689       free (s);
2690     }
2691   subscripts.release ();
2692 }
2693
2694 /* Set DDR_ARE_DEPENDENT to CHREC and finalize the subscript overlap
2695    description.  */
2696
2697 static inline void
2698 finalize_ddr_dependent (struct data_dependence_relation *ddr,
2699                         tree chrec)
2700 {
2701   DDR_ARE_DEPENDENT (ddr) = chrec;
2702   free_subscripts (DDR_SUBSCRIPTS (ddr));
2703   DDR_SUBSCRIPTS (ddr).create (0);
2704 }
2705
2706 /* The dependence relation DDR cannot be represented by a distance
2707    vector.  */
2708
2709 static inline void
2710 non_affine_dependence_relation (struct data_dependence_relation *ddr)
2711 {
2712   if (dump_file && (dump_flags & TDF_DETAILS))
2713     fprintf (dump_file, "(Dependence relation cannot be represented by distance vector.) \n");
2714
2715   DDR_AFFINE_P (ddr) = false;
2716 }
2717
2718 \f
2719
2720 /* This section contains the classic Banerjee tests.  */
2721
2722 /* Returns true iff CHREC_A and CHREC_B are not dependent on any index
2723    variables, i.e., if the ZIV (Zero Index Variable) test is true.  */
2724
2725 static inline bool
2726 ziv_subscript_p (const_tree chrec_a, const_tree chrec_b)
2727 {
2728   return (evolution_function_is_constant_p (chrec_a)
2729           && evolution_function_is_constant_p (chrec_b));
2730 }
2731
2732 /* Returns true iff CHREC_A and CHREC_B are dependent on an index
2733    variable, i.e., if the SIV (Single Index Variable) test is true.  */
2734
2735 static bool
2736 siv_subscript_p (const_tree chrec_a, const_tree chrec_b)
2737 {
2738   if ((evolution_function_is_constant_p (chrec_a)
2739        && evolution_function_is_univariate_p (chrec_b))
2740       || (evolution_function_is_constant_p (chrec_b)
2741           && evolution_function_is_univariate_p (chrec_a)))
2742     return true;
2743
2744   if (evolution_function_is_univariate_p (chrec_a)
2745       && evolution_function_is_univariate_p (chrec_b))
2746     {
2747       switch (TREE_CODE (chrec_a))
2748         {
2749         case POLYNOMIAL_CHREC:
2750           switch (TREE_CODE (chrec_b))
2751             {
2752             case POLYNOMIAL_CHREC:
2753               if (CHREC_VARIABLE (chrec_a) != CHREC_VARIABLE (chrec_b))
2754                 return false;
2755               /* FALLTHRU */
2756
2757             default:
2758               return true;
2759             }
2760
2761         default:
2762           return true;
2763         }
2764     }
2765
2766   return false;
2767 }
2768
2769 /* Creates a conflict function with N dimensions.  The affine functions
2770    in each dimension follow.  */
2771
2772 static conflict_function *
2773 conflict_fn (unsigned n, ...)
2774 {
2775   unsigned i;
2776   conflict_function *ret = XCNEW (conflict_function);
2777   va_list ap;
2778
2779   gcc_assert (n > 0 && n <= MAX_DIM);
2780   va_start (ap, n);
2781
2782   ret->n = n;
2783   for (i = 0; i < n; i++)
2784     ret->fns[i] = va_arg (ap, affine_fn);
2785   va_end (ap);
2786
2787   return ret;
2788 }
2789
2790 /* Returns constant affine function with value CST.  */
2791
2792 static affine_fn
2793 affine_fn_cst (tree cst)
2794 {
2795   affine_fn fn;
2796   fn.create (1);
2797   fn.quick_push (cst);
2798   return fn;
2799 }
2800
2801 /* Returns affine function with single variable, CST + COEF * x_DIM.  */
2802
2803 static affine_fn
2804 affine_fn_univar (tree cst, unsigned dim, tree coef)
2805 {
2806   affine_fn fn;
2807   fn.create (dim + 1);
2808   unsigned i;
2809
2810   gcc_assert (dim > 0);
2811   fn.quick_push (cst);
2812   for (i = 1; i < dim; i++)
2813     fn.quick_push (integer_zero_node);
2814   fn.quick_push (coef);
2815   return fn;
2816 }
2817
2818 /* Analyze a ZIV (Zero Index Variable) subscript.  *OVERLAPS_A and
2819    *OVERLAPS_B are initialized to the functions that describe the
2820    relation between the elements accessed twice by CHREC_A and
2821    CHREC_B.  For k >= 0, the following property is verified:
2822
2823    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
2824
2825 static void
2826 analyze_ziv_subscript (tree chrec_a,
2827                        tree chrec_b,
2828                        conflict_function **overlaps_a,
2829                        conflict_function **overlaps_b,
2830                        tree *last_conflicts)
2831 {
2832   tree type, difference;
2833   dependence_stats.num_ziv++;
2834
2835   if (dump_file && (dump_flags & TDF_DETAILS))
2836     fprintf (dump_file, "(analyze_ziv_subscript \n");
2837
2838   type = signed_type_for_types (TREE_TYPE (chrec_a), TREE_TYPE (chrec_b));
2839   chrec_a = chrec_convert (type, chrec_a, NULL);
2840   chrec_b = chrec_convert (type, chrec_b, NULL);
2841   difference = chrec_fold_minus (type, chrec_a, chrec_b);
2842
2843   switch (TREE_CODE (difference))
2844     {
2845     case INTEGER_CST:
2846       if (integer_zerop (difference))
2847         {
2848           /* The difference is equal to zero: the accessed index
2849              overlaps for each iteration in the loop.  */
2850           *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2851           *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
2852           *last_conflicts = chrec_dont_know;
2853           dependence_stats.num_ziv_dependent++;
2854         }
2855       else
2856         {
2857           /* The accesses do not overlap.  */
2858           *overlaps_a = conflict_fn_no_dependence ();
2859           *overlaps_b = conflict_fn_no_dependence ();
2860           *last_conflicts = integer_zero_node;
2861           dependence_stats.num_ziv_independent++;
2862         }
2863       break;
2864
2865     default:
2866       /* We're not sure whether the indexes overlap.  For the moment,
2867          conservatively answer "don't know".  */
2868       if (dump_file && (dump_flags & TDF_DETAILS))
2869         fprintf (dump_file, "ziv test failed: difference is non-integer.\n");
2870
2871       *overlaps_a = conflict_fn_not_known ();
2872       *overlaps_b = conflict_fn_not_known ();
2873       *last_conflicts = chrec_dont_know;
2874       dependence_stats.num_ziv_unimplemented++;
2875       break;
2876     }
2877
2878   if (dump_file && (dump_flags & TDF_DETAILS))
2879     fprintf (dump_file, ")\n");
2880 }
2881
2882 /* Similar to max_stmt_executions_int, but returns the bound as a tree,
2883    and only if it fits to the int type.  If this is not the case, or the
2884    bound  on the number of iterations of LOOP could not be derived, returns
2885    chrec_dont_know.  */
2886
2887 static tree
2888 max_stmt_executions_tree (struct loop *loop)
2889 {
2890   widest_int nit;
2891
2892   if (!max_stmt_executions (loop, &nit))
2893     return chrec_dont_know;
2894
2895   if (!wi::fits_to_tree_p (nit, unsigned_type_node))
2896     return chrec_dont_know;
2897
2898   return wide_int_to_tree (unsigned_type_node, nit);
2899 }
2900
2901 /* Determine whether the CHREC is always positive/negative.  If the expression
2902    cannot be statically analyzed, return false, otherwise set the answer into
2903    VALUE.  */
2904
2905 static bool
2906 chrec_is_positive (tree chrec, bool *value)
2907 {
2908   bool value0, value1, value2;
2909   tree end_value, nb_iter;
2910
2911   switch (TREE_CODE (chrec))
2912     {
2913     case POLYNOMIAL_CHREC:
2914       if (!chrec_is_positive (CHREC_LEFT (chrec), &value0)
2915           || !chrec_is_positive (CHREC_RIGHT (chrec), &value1))
2916         return false;
2917
2918       /* FIXME -- overflows.  */
2919       if (value0 == value1)
2920         {
2921           *value = value0;
2922           return true;
2923         }
2924
2925       /* Otherwise the chrec is under the form: "{-197, +, 2}_1",
2926          and the proof consists in showing that the sign never
2927          changes during the execution of the loop, from 0 to
2928          loop->nb_iterations.  */
2929       if (!evolution_function_is_affine_p (chrec))
2930         return false;
2931
2932       nb_iter = number_of_latch_executions (get_chrec_loop (chrec));
2933       if (chrec_contains_undetermined (nb_iter))
2934         return false;
2935
2936 #if 0
2937       /* TODO -- If the test is after the exit, we may decrease the number of
2938          iterations by one.  */
2939       if (after_exit)
2940         nb_iter = chrec_fold_minus (type, nb_iter, build_int_cst (type, 1));
2941 #endif
2942
2943       end_value = chrec_apply (CHREC_VARIABLE (chrec), chrec, nb_iter);
2944
2945       if (!chrec_is_positive (end_value, &value2))
2946         return false;
2947
2948       *value = value0;
2949       return value0 == value1;
2950
2951     case INTEGER_CST:
2952       switch (tree_int_cst_sgn (chrec))
2953         {
2954         case -1:
2955           *value = false;
2956           break;
2957         case 1:
2958           *value = true;
2959           break;
2960         default:
2961           return false;
2962         }
2963       return true;
2964
2965     default:
2966       return false;
2967     }
2968 }
2969
2970
2971 /* Analyze a SIV (Single Index Variable) subscript where CHREC_A is a
2972    constant, and CHREC_B is an affine function.  *OVERLAPS_A and
2973    *OVERLAPS_B are initialized to the functions that describe the
2974    relation between the elements accessed twice by CHREC_A and
2975    CHREC_B.  For k >= 0, the following property is verified:
2976
2977    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
2978
2979 static void
2980 analyze_siv_subscript_cst_affine (tree chrec_a,
2981                                   tree chrec_b,
2982                                   conflict_function **overlaps_a,
2983                                   conflict_function **overlaps_b,
2984                                   tree *last_conflicts)
2985 {
2986   bool value0, value1, value2;
2987   tree type, difference, tmp;
2988
2989   type = signed_type_for_types (TREE_TYPE (chrec_a), TREE_TYPE (chrec_b));
2990   chrec_a = chrec_convert (type, chrec_a, NULL);
2991   chrec_b = chrec_convert (type, chrec_b, NULL);
2992   difference = chrec_fold_minus (type, initial_condition (chrec_b), chrec_a);
2993
2994   /* Special case overlap in the first iteration.  */
2995   if (integer_zerop (difference))
2996     {
2997       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
2998       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
2999       *last_conflicts = integer_one_node;
3000       return;
3001     }
3002
3003   if (!chrec_is_positive (initial_condition (difference), &value0))
3004     {
3005       if (dump_file && (dump_flags & TDF_DETAILS))
3006         fprintf (dump_file, "siv test failed: chrec is not positive.\n");
3007
3008       dependence_stats.num_siv_unimplemented++;
3009       *overlaps_a = conflict_fn_not_known ();
3010       *overlaps_b = conflict_fn_not_known ();
3011       *last_conflicts = chrec_dont_know;
3012       return;
3013     }
3014   else
3015     {
3016       if (value0 == false)
3017         {
3018           if (TREE_CODE (chrec_b) != POLYNOMIAL_CHREC
3019               || !chrec_is_positive (CHREC_RIGHT (chrec_b), &value1))
3020             {
3021               if (dump_file && (dump_flags & TDF_DETAILS))
3022                 fprintf (dump_file, "siv test failed: chrec not positive.\n");
3023
3024               *overlaps_a = conflict_fn_not_known ();
3025               *overlaps_b = conflict_fn_not_known ();
3026               *last_conflicts = chrec_dont_know;
3027               dependence_stats.num_siv_unimplemented++;
3028               return;
3029             }
3030           else
3031             {
3032               if (value1 == true)
3033                 {
3034                   /* Example:
3035                      chrec_a = 12
3036                      chrec_b = {10, +, 1}
3037                   */
3038
3039                   if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
3040                     {
3041                       HOST_WIDE_INT numiter;
3042                       struct loop *loop = get_chrec_loop (chrec_b);
3043
3044                       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3045                       tmp = fold_build2 (EXACT_DIV_EXPR, type,
3046                                          fold_build1 (ABS_EXPR, type, difference),
3047                                          CHREC_RIGHT (chrec_b));
3048                       *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
3049                       *last_conflicts = integer_one_node;
3050
3051
3052                       /* Perform weak-zero siv test to see if overlap is
3053                          outside the loop bounds.  */
3054                       numiter = max_stmt_executions_int (loop);
3055
3056                       if (numiter >= 0
3057                           && compare_tree_int (tmp, numiter) > 0)
3058                         {
3059                           free_conflict_function (*overlaps_a);
3060                           free_conflict_function (*overlaps_b);
3061                           *overlaps_a = conflict_fn_no_dependence ();
3062                           *overlaps_b = conflict_fn_no_dependence ();
3063                           *last_conflicts = integer_zero_node;
3064                           dependence_stats.num_siv_independent++;
3065                           return;
3066                         }
3067                       dependence_stats.num_siv_dependent++;
3068                       return;
3069                     }
3070
3071                   /* When the step does not divide the difference, there are
3072                      no overlaps.  */
3073                   else
3074                     {
3075                       *overlaps_a = conflict_fn_no_dependence ();
3076                       *overlaps_b = conflict_fn_no_dependence ();
3077                       *last_conflicts = integer_zero_node;
3078                       dependence_stats.num_siv_independent++;
3079                       return;
3080                     }
3081                 }
3082
3083               else
3084                 {
3085                   /* Example:
3086                      chrec_a = 12
3087                      chrec_b = {10, +, -1}
3088
3089                      In this case, chrec_a will not overlap with chrec_b.  */
3090                   *overlaps_a = conflict_fn_no_dependence ();
3091                   *overlaps_b = conflict_fn_no_dependence ();
3092                   *last_conflicts = integer_zero_node;
3093                   dependence_stats.num_siv_independent++;
3094                   return;
3095                 }
3096             }
3097         }
3098       else
3099         {
3100           if (TREE_CODE (chrec_b) != POLYNOMIAL_CHREC
3101               || !chrec_is_positive (CHREC_RIGHT (chrec_b), &value2))
3102             {
3103               if (dump_file && (dump_flags & TDF_DETAILS))
3104                 fprintf (dump_file, "siv test failed: chrec not positive.\n");
3105
3106               *overlaps_a = conflict_fn_not_known ();
3107               *overlaps_b = conflict_fn_not_known ();
3108               *last_conflicts = chrec_dont_know;
3109               dependence_stats.num_siv_unimplemented++;
3110               return;
3111             }
3112           else
3113             {
3114               if (value2 == false)
3115                 {
3116                   /* Example:
3117                      chrec_a = 3
3118                      chrec_b = {10, +, -1}
3119                   */
3120                   if (tree_fold_divides_p (CHREC_RIGHT (chrec_b), difference))
3121                     {
3122                       HOST_WIDE_INT numiter;
3123                       struct loop *loop = get_chrec_loop (chrec_b);
3124
3125                       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3126                       tmp = fold_build2 (EXACT_DIV_EXPR, type, difference,
3127                                          CHREC_RIGHT (chrec_b));
3128                       *overlaps_b = conflict_fn (1, affine_fn_cst (tmp));
3129                       *last_conflicts = integer_one_node;
3130
3131                       /* Perform weak-zero siv test to see if overlap is
3132                          outside the loop bounds.  */
3133                       numiter = max_stmt_executions_int (loop);
3134
3135                       if (numiter >= 0
3136                           && compare_tree_int (tmp, numiter) > 0)
3137                         {
3138                           free_conflict_function (*overlaps_a);
3139                           free_conflict_function (*overlaps_b);
3140                           *overlaps_a = conflict_fn_no_dependence ();
3141                           *overlaps_b = conflict_fn_no_dependence ();
3142                           *last_conflicts = integer_zero_node;
3143                           dependence_stats.num_siv_independent++;
3144                           return;
3145                         }
3146                       dependence_stats.num_siv_dependent++;
3147                       return;
3148                     }
3149
3150                   /* When the step does not divide the difference, there
3151                      are no overlaps.  */
3152                   else
3153                     {
3154                       *overlaps_a = conflict_fn_no_dependence ();
3155                       *overlaps_b = conflict_fn_no_dependence ();
3156                       *last_conflicts = integer_zero_node;
3157                       dependence_stats.num_siv_independent++;
3158                       return;
3159                     }
3160                 }
3161               else
3162                 {
3163                   /* Example:
3164                      chrec_a = 3
3165                      chrec_b = {4, +, 1}
3166
3167                      In this case, chrec_a will not overlap with chrec_b.  */
3168                   *overlaps_a = conflict_fn_no_dependence ();
3169                   *overlaps_b = conflict_fn_no_dependence ();
3170                   *last_conflicts = integer_zero_node;
3171                   dependence_stats.num_siv_independent++;
3172                   return;
3173                 }
3174             }
3175         }
3176     }
3177 }
3178
3179 /* Helper recursive function for initializing the matrix A.  Returns
3180    the initial value of CHREC.  */
3181
3182 static tree
3183 initialize_matrix_A (lambda_matrix A, tree chrec, unsigned index, int mult)
3184 {
3185   gcc_assert (chrec);
3186
3187   switch (TREE_CODE (chrec))
3188     {
3189     case POLYNOMIAL_CHREC:
3190       A[index][0] = mult * int_cst_value (CHREC_RIGHT (chrec));
3191       return initialize_matrix_A (A, CHREC_LEFT (chrec), index + 1, mult);
3192
3193     case PLUS_EXPR:
3194     case MULT_EXPR:
3195     case MINUS_EXPR:
3196       {
3197         tree op0 = initialize_matrix_A (A, TREE_OPERAND (chrec, 0), index, mult);
3198         tree op1 = initialize_matrix_A (A, TREE_OPERAND (chrec, 1), index, mult);
3199
3200         return chrec_fold_op (TREE_CODE (chrec), chrec_type (chrec), op0, op1);
3201       }
3202
3203     CASE_CONVERT:
3204       {
3205         tree op = initialize_matrix_A (A, TREE_OPERAND (chrec, 0), index, mult);
3206         return chrec_convert (chrec_type (chrec), op, NULL);
3207       }
3208
3209     case BIT_NOT_EXPR:
3210       {
3211         /* Handle ~X as -1 - X.  */
3212         tree op = initialize_matrix_A (A, TREE_OPERAND (chrec, 0), index, mult);
3213         return chrec_fold_op (MINUS_EXPR, chrec_type (chrec),
3214                               build_int_cst (TREE_TYPE (chrec), -1), op);
3215       }
3216
3217     case INTEGER_CST:
3218       return chrec;
3219
3220     default:
3221       gcc_unreachable ();
3222       return NULL_TREE;
3223     }
3224 }
3225
3226 #define FLOOR_DIV(x,y) ((x) / (y))
3227
3228 /* Solves the special case of the Diophantine equation:
3229    | {0, +, STEP_A}_x (OVERLAPS_A) = {0, +, STEP_B}_y (OVERLAPS_B)
3230
3231    Computes the descriptions OVERLAPS_A and OVERLAPS_B.  NITER is the
3232    number of iterations that loops X and Y run.  The overlaps will be
3233    constructed as evolutions in dimension DIM.  */
3234
3235 static void
3236 compute_overlap_steps_for_affine_univar (HOST_WIDE_INT niter,
3237                                          HOST_WIDE_INT step_a,
3238                                          HOST_WIDE_INT step_b,
3239                                          affine_fn *overlaps_a,
3240                                          affine_fn *overlaps_b,
3241                                          tree *last_conflicts, int dim)
3242 {
3243   if (((step_a > 0 && step_b > 0)
3244        || (step_a < 0 && step_b < 0)))
3245     {
3246       HOST_WIDE_INT step_overlaps_a, step_overlaps_b;
3247       HOST_WIDE_INT gcd_steps_a_b, last_conflict, tau2;
3248
3249       gcd_steps_a_b = gcd (step_a, step_b);
3250       step_overlaps_a = step_b / gcd_steps_a_b;
3251       step_overlaps_b = step_a / gcd_steps_a_b;
3252
3253       if (niter > 0)
3254         {
3255           tau2 = FLOOR_DIV (niter, step_overlaps_a);
3256           tau2 = MIN (tau2, FLOOR_DIV (niter, step_overlaps_b));
3257           last_conflict = tau2;
3258           *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
3259         }
3260       else
3261         *last_conflicts = chrec_dont_know;
3262
3263       *overlaps_a = affine_fn_univar (integer_zero_node, dim,
3264                                       build_int_cst (NULL_TREE,
3265                                                      step_overlaps_a));
3266       *overlaps_b = affine_fn_univar (integer_zero_node, dim,
3267                                       build_int_cst (NULL_TREE,
3268                                                      step_overlaps_b));
3269     }
3270
3271   else
3272     {
3273       *overlaps_a = affine_fn_cst (integer_zero_node);
3274       *overlaps_b = affine_fn_cst (integer_zero_node);
3275       *last_conflicts = integer_zero_node;
3276     }
3277 }
3278
3279 /* Solves the special case of a Diophantine equation where CHREC_A is
3280    an affine bivariate function, and CHREC_B is an affine univariate
3281    function.  For example,
3282
3283    | {{0, +, 1}_x, +, 1335}_y = {0, +, 1336}_z
3284
3285    has the following overlapping functions:
3286
3287    | x (t, u, v) = {{0, +, 1336}_t, +, 1}_v
3288    | y (t, u, v) = {{0, +, 1336}_u, +, 1}_v
3289    | z (t, u, v) = {{{0, +, 1}_t, +, 1335}_u, +, 1}_v
3290
3291    FORNOW: This is a specialized implementation for a case occurring in
3292    a common benchmark.  Implement the general algorithm.  */
3293
3294 static void
3295 compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b,
3296                                       conflict_function **overlaps_a,
3297                                       conflict_function **overlaps_b,
3298                                       tree *last_conflicts)
3299 {
3300   bool xz_p, yz_p, xyz_p;
3301   HOST_WIDE_INT step_x, step_y, step_z;
3302   HOST_WIDE_INT niter_x, niter_y, niter_z, niter;
3303   affine_fn overlaps_a_xz, overlaps_b_xz;
3304   affine_fn overlaps_a_yz, overlaps_b_yz;
3305   affine_fn overlaps_a_xyz, overlaps_b_xyz;
3306   affine_fn ova1, ova2, ovb;
3307   tree last_conflicts_xz, last_conflicts_yz, last_conflicts_xyz;
3308
3309   step_x = int_cst_value (CHREC_RIGHT (CHREC_LEFT (chrec_a)));
3310   step_y = int_cst_value (CHREC_RIGHT (chrec_a));
3311   step_z = int_cst_value (CHREC_RIGHT (chrec_b));
3312
3313   niter_x = max_stmt_executions_int (get_chrec_loop (CHREC_LEFT (chrec_a)));
3314   niter_y = max_stmt_executions_int (get_chrec_loop (chrec_a));
3315   niter_z = max_stmt_executions_int (get_chrec_loop (chrec_b));
3316
3317   if (niter_x < 0 || niter_y < 0 || niter_z < 0)
3318     {
3319       if (dump_file && (dump_flags & TDF_DETAILS))
3320         fprintf (dump_file, "overlap steps test failed: no iteration counts.\n");
3321
3322       *overlaps_a = conflict_fn_not_known ();
3323       *overlaps_b = conflict_fn_not_known ();
3324       *last_conflicts = chrec_dont_know;
3325       return;
3326     }
3327
3328   niter = MIN (niter_x, niter_z);
3329   compute_overlap_steps_for_affine_univar (niter, step_x, step_z,
3330                                            &overlaps_a_xz,
3331                                            &overlaps_b_xz,
3332                                            &last_conflicts_xz, 1);
3333   niter = MIN (niter_y, niter_z);
3334   compute_overlap_steps_for_affine_univar (niter, step_y, step_z,
3335                                            &overlaps_a_yz,
3336                                            &overlaps_b_yz,
3337                                            &last_conflicts_yz, 2);
3338   niter = MIN (niter_x, niter_z);
3339   niter = MIN (niter_y, niter);
3340   compute_overlap_steps_for_affine_univar (niter, step_x + step_y, step_z,
3341                                            &overlaps_a_xyz,
3342                                            &overlaps_b_xyz,
3343                                            &last_conflicts_xyz, 3);
3344
3345   xz_p = !integer_zerop (last_conflicts_xz);
3346   yz_p = !integer_zerop (last_conflicts_yz);
3347   xyz_p = !integer_zerop (last_conflicts_xyz);
3348
3349   if (xz_p || yz_p || xyz_p)
3350     {
3351       ova1 = affine_fn_cst (integer_zero_node);
3352       ova2 = affine_fn_cst (integer_zero_node);
3353       ovb = affine_fn_cst (integer_zero_node);
3354       if (xz_p)
3355         {
3356           affine_fn t0 = ova1;
3357           affine_fn t2 = ovb;
3358
3359           ova1 = affine_fn_plus (ova1, overlaps_a_xz);
3360           ovb = affine_fn_plus (ovb, overlaps_b_xz);
3361           affine_fn_free (t0);
3362           affine_fn_free (t2);
3363           *last_conflicts = last_conflicts_xz;
3364         }
3365       if (yz_p)
3366         {
3367           affine_fn t0 = ova2;
3368           affine_fn t2 = ovb;
3369
3370           ova2 = affine_fn_plus (ova2, overlaps_a_yz);
3371           ovb = affine_fn_plus (ovb, overlaps_b_yz);
3372           affine_fn_free (t0);
3373           affine_fn_free (t2);
3374           *last_conflicts = last_conflicts_yz;
3375         }
3376       if (xyz_p)
3377         {
3378           affine_fn t0 = ova1;
3379           affine_fn t2 = ova2;
3380           affine_fn t4 = ovb;
3381
3382           ova1 = affine_fn_plus (ova1, overlaps_a_xyz);
3383           ova2 = affine_fn_plus (ova2, overlaps_a_xyz);
3384           ovb = affine_fn_plus (ovb, overlaps_b_xyz);
3385           affine_fn_free (t0);
3386           affine_fn_free (t2);
3387           affine_fn_free (t4);
3388           *last_conflicts = last_conflicts_xyz;
3389         }
3390       *overlaps_a = conflict_fn (2, ova1, ova2);
3391       *overlaps_b = conflict_fn (1, ovb);
3392     }
3393   else
3394     {
3395       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3396       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3397       *last_conflicts = integer_zero_node;
3398     }
3399
3400   affine_fn_free (overlaps_a_xz);
3401   affine_fn_free (overlaps_b_xz);
3402   affine_fn_free (overlaps_a_yz);
3403   affine_fn_free (overlaps_b_yz);
3404   affine_fn_free (overlaps_a_xyz);
3405   affine_fn_free (overlaps_b_xyz);
3406 }
3407
3408 /* Copy the elements of vector VEC1 with length SIZE to VEC2.  */
3409
3410 static void
3411 lambda_vector_copy (lambda_vector vec1, lambda_vector vec2,
3412                     int size)
3413 {
3414   memcpy (vec2, vec1, size * sizeof (*vec1));
3415 }
3416
3417 /* Copy the elements of M x N matrix MAT1 to MAT2.  */
3418
3419 static void
3420 lambda_matrix_copy (lambda_matrix mat1, lambda_matrix mat2,
3421                     int m, int n)
3422 {
3423   int i;
3424
3425   for (i = 0; i < m; i++)
3426     lambda_vector_copy (mat1[i], mat2[i], n);
3427 }
3428
3429 /* Store the N x N identity matrix in MAT.  */
3430
3431 static void
3432 lambda_matrix_id (lambda_matrix mat, int size)
3433 {
3434   int i, j;
3435
3436   for (i = 0; i < size; i++)
3437     for (j = 0; j < size; j++)
3438       mat[i][j] = (i == j) ? 1 : 0;
3439 }
3440
3441 /* Return the first nonzero element of vector VEC1 between START and N.
3442    We must have START <= N.   Returns N if VEC1 is the zero vector.  */
3443
3444 static int
3445 lambda_vector_first_nz (lambda_vector vec1, int n, int start)
3446 {
3447   int j = start;
3448   while (j < n && vec1[j] == 0)
3449     j++;
3450   return j;
3451 }
3452
3453 /* Add a multiple of row R1 of matrix MAT with N columns to row R2:
3454    R2 = R2 + CONST1 * R1.  */
3455
3456 static void
3457 lambda_matrix_row_add (lambda_matrix mat, int n, int r1, int r2, int const1)
3458 {
3459   int i;
3460
3461   if (const1 == 0)
3462     return;
3463
3464   for (i = 0; i < n; i++)
3465     mat[r2][i] += const1 * mat[r1][i];
3466 }
3467
3468 /* Multiply vector VEC1 of length SIZE by a constant CONST1,
3469    and store the result in VEC2.  */
3470
3471 static void
3472 lambda_vector_mult_const (lambda_vector vec1, lambda_vector vec2,
3473                           int size, int const1)
3474 {
3475   int i;
3476
3477   if (const1 == 0)
3478     lambda_vector_clear (vec2, size);
3479   else
3480     for (i = 0; i < size; i++)
3481       vec2[i] = const1 * vec1[i];
3482 }
3483
3484 /* Negate vector VEC1 with length SIZE and store it in VEC2.  */
3485
3486 static void
3487 lambda_vector_negate (lambda_vector vec1, lambda_vector vec2,
3488                       int size)
3489 {
3490   lambda_vector_mult_const (vec1, vec2, size, -1);
3491 }
3492
3493 /* Negate row R1 of matrix MAT which has N columns.  */
3494
3495 static void
3496 lambda_matrix_row_negate (lambda_matrix mat, int n, int r1)
3497 {
3498   lambda_vector_negate (mat[r1], mat[r1], n);
3499 }
3500
3501 /* Return true if two vectors are equal.  */
3502
3503 static bool
3504 lambda_vector_equal (lambda_vector vec1, lambda_vector vec2, int size)
3505 {
3506   int i;
3507   for (i = 0; i < size; i++)
3508     if (vec1[i] != vec2[i])
3509       return false;
3510   return true;
3511 }
3512
3513 /* Given an M x N integer matrix A, this function determines an M x
3514    M unimodular matrix U, and an M x N echelon matrix S such that
3515    "U.A = S".  This decomposition is also known as "right Hermite".
3516
3517    Ref: Algorithm 2.1 page 33 in "Loop Transformations for
3518    Restructuring Compilers" Utpal Banerjee.  */
3519
3520 static void
3521 lambda_matrix_right_hermite (lambda_matrix A, int m, int n,
3522                              lambda_matrix S, lambda_matrix U)
3523 {
3524   int i, j, i0 = 0;
3525
3526   lambda_matrix_copy (A, S, m, n);
3527   lambda_matrix_id (U, m);
3528
3529   for (j = 0; j < n; j++)
3530     {
3531       if (lambda_vector_first_nz (S[j], m, i0) < m)
3532         {
3533           ++i0;
3534           for (i = m - 1; i >= i0; i--)
3535             {
3536               while (S[i][j] != 0)
3537                 {
3538                   int sigma, factor, a, b;
3539
3540                   a = S[i-1][j];
3541                   b = S[i][j];
3542                   sigma = (a * b < 0) ? -1: 1;
3543                   a = abs (a);
3544                   b = abs (b);
3545                   factor = sigma * (a / b);
3546
3547                   lambda_matrix_row_add (S, n, i, i-1, -factor);
3548                   std::swap (S[i], S[i-1]);
3549
3550                   lambda_matrix_row_add (U, m, i, i-1, -factor);
3551                   std::swap (U[i], U[i-1]);
3552                 }
3553             }
3554         }
3555     }
3556 }
3557
3558 /* Determines the overlapping elements due to accesses CHREC_A and
3559    CHREC_B, that are affine functions.  This function cannot handle
3560    symbolic evolution functions, ie. when initial conditions are
3561    parameters, because it uses lambda matrices of integers.  */
3562
3563 static void
3564 analyze_subscript_affine_affine (tree chrec_a,
3565                                  tree chrec_b,
3566                                  conflict_function **overlaps_a,
3567                                  conflict_function **overlaps_b,
3568                                  tree *last_conflicts)
3569 {
3570   unsigned nb_vars_a, nb_vars_b, dim;
3571   HOST_WIDE_INT init_a, init_b, gamma, gcd_alpha_beta;
3572   lambda_matrix A, U, S;
3573   struct obstack scratch_obstack;
3574
3575   if (eq_evolutions_p (chrec_a, chrec_b))
3576     {
3577       /* The accessed index overlaps for each iteration in the
3578          loop.  */
3579       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
3580       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
3581       *last_conflicts = chrec_dont_know;
3582       return;
3583     }
3584   if (dump_file && (dump_flags & TDF_DETAILS))
3585     fprintf (dump_file, "(analyze_subscript_affine_affine \n");
3586
3587   /* For determining the initial intersection, we have to solve a
3588      Diophantine equation.  This is the most time consuming part.
3589
3590      For answering to the question: "Is there a dependence?" we have
3591      to prove that there exists a solution to the Diophantine
3592      equation, and that the solution is in the iteration domain,
3593      i.e. the solution is positive or zero, and that the solution
3594      happens before the upper bound loop.nb_iterations.  Otherwise
3595      there is no dependence.  This function outputs a description of
3596      the iterations that hold the intersections.  */
3597
3598   nb_vars_a = nb_vars_in_chrec (chrec_a);
3599   nb_vars_b = nb_vars_in_chrec (chrec_b);
3600
3601   gcc_obstack_init (&scratch_obstack);
3602
3603   dim = nb_vars_a + nb_vars_b;
3604   U = lambda_matrix_new (dim, dim, &scratch_obstack);
3605   A = lambda_matrix_new (dim, 1, &scratch_obstack);
3606   S = lambda_matrix_new (dim, 1, &scratch_obstack);
3607
3608   init_a = int_cst_value (initialize_matrix_A (A, chrec_a, 0, 1));
3609   init_b = int_cst_value (initialize_matrix_A (A, chrec_b, nb_vars_a, -1));
3610   gamma = init_b - init_a;
3611
3612   /* Don't do all the hard work of solving the Diophantine equation
3613      when we already know the solution: for example,
3614      | {3, +, 1}_1
3615      | {3, +, 4}_2
3616      | gamma = 3 - 3 = 0.
3617      Then the first overlap occurs during the first iterations:
3618      | {3, +, 1}_1 ({0, +, 4}_x) = {3, +, 4}_2 ({0, +, 1}_x)
3619   */
3620   if (gamma == 0)
3621     {
3622       if (nb_vars_a == 1 && nb_vars_b == 1)
3623         {
3624           HOST_WIDE_INT step_a, step_b;
3625           HOST_WIDE_INT niter, niter_a, niter_b;
3626           affine_fn ova, ovb;
3627
3628           niter_a = max_stmt_executions_int (get_chrec_loop (chrec_a));
3629           niter_b = max_stmt_executions_int (get_chrec_loop (chrec_b));
3630           niter = MIN (niter_a, niter_b);
3631           step_a = int_cst_value (CHREC_RIGHT (chrec_a));
3632           step_b = int_cst_value (CHREC_RIGHT (chrec_b));
3633
3634           compute_overlap_steps_for_affine_univar (niter, step_a, step_b,
3635                                                    &ova, &ovb,
3636                                                    last_conflicts, 1);
3637           *overlaps_a = conflict_fn (1, ova);
3638           *overlaps_b = conflict_fn (1, ovb);
3639         }
3640
3641       else if (nb_vars_a == 2 && nb_vars_b == 1)
3642         compute_overlap_steps_for_affine_1_2
3643           (chrec_a, chrec_b, overlaps_a, overlaps_b, last_conflicts);
3644
3645       else if (nb_vars_a == 1 && nb_vars_b == 2)
3646         compute_overlap_steps_for_affine_1_2
3647           (chrec_b, chrec_a, overlaps_b, overlaps_a, last_conflicts);
3648
3649       else
3650         {
3651           if (dump_file && (dump_flags & TDF_DETAILS))
3652             fprintf (dump_file, "affine-affine test failed: too many variables.\n");
3653           *overlaps_a = conflict_fn_not_known ();
3654           *overlaps_b = conflict_fn_not_known ();
3655           *last_conflicts = chrec_dont_know;
3656         }
3657       goto end_analyze_subs_aa;
3658     }
3659
3660   /* U.A = S */
3661   lambda_matrix_right_hermite (A, dim, 1, S, U);
3662
3663   if (S[0][0] < 0)
3664     {
3665       S[0][0] *= -1;
3666       lambda_matrix_row_negate (U, dim, 0);
3667     }
3668   gcd_alpha_beta = S[0][0];
3669
3670   /* Something went wrong: for example in {1, +, 0}_5 vs. {0, +, 0}_5,
3671      but that is a quite strange case.  Instead of ICEing, answer
3672      don't know.  */
3673   if (gcd_alpha_beta == 0)
3674     {
3675       *overlaps_a = conflict_fn_not_known ();
3676       *overlaps_b = conflict_fn_not_known ();
3677       *last_conflicts = chrec_dont_know;
3678       goto end_analyze_subs_aa;
3679     }
3680
3681   /* The classic "gcd-test".  */
3682   if (!int_divides_p (gcd_alpha_beta, gamma))
3683     {
3684       /* The "gcd-test" has determined that there is no integer
3685          solution, i.e. there is no dependence.  */
3686       *overlaps_a = conflict_fn_no_dependence ();
3687       *overlaps_b = conflict_fn_no_dependence ();
3688       *last_conflicts = integer_zero_node;
3689     }
3690
3691   /* Both access functions are univariate.  This includes SIV and MIV cases.  */
3692   else if (nb_vars_a == 1 && nb_vars_b == 1)
3693     {
3694       /* Both functions should have the same evolution sign.  */
3695       if (((A[0][0] > 0 && -A[1][0] > 0)
3696            || (A[0][0] < 0 && -A[1][0] < 0)))
3697         {
3698           /* The solutions are given by:
3699              |
3700              | [GAMMA/GCD_ALPHA_BETA  t].[u11 u12]  = [x0]
3701              |                           [u21 u22]    [y0]
3702
3703              For a given integer t.  Using the following variables,
3704
3705              | i0 = u11 * gamma / gcd_alpha_beta
3706              | j0 = u12 * gamma / gcd_alpha_beta
3707              | i1 = u21
3708              | j1 = u22
3709
3710              the solutions are:
3711
3712              | x0 = i0 + i1 * t,
3713              | y0 = j0 + j1 * t.  */
3714           HOST_WIDE_INT i0, j0, i1, j1;
3715
3716           i0 = U[0][0] * gamma / gcd_alpha_beta;
3717           j0 = U[0][1] * gamma / gcd_alpha_beta;
3718           i1 = U[1][0];
3719           j1 = U[1][1];
3720
3721           if ((i1 == 0 && i0 < 0)
3722               || (j1 == 0 && j0 < 0))
3723             {
3724               /* There is no solution.
3725                  FIXME: The case "i0 > nb_iterations, j0 > nb_iterations"
3726                  falls in here, but for the moment we don't look at the
3727                  upper bound of the iteration domain.  */
3728               *overlaps_a = conflict_fn_no_dependence ();
3729               *overlaps_b = conflict_fn_no_dependence ();
3730               *last_conflicts = integer_zero_node;
3731               goto end_analyze_subs_aa;
3732             }
3733
3734           if (i1 > 0 && j1 > 0)
3735             {
3736               HOST_WIDE_INT niter_a
3737                 = max_stmt_executions_int (get_chrec_loop (chrec_a));
3738               HOST_WIDE_INT niter_b
3739                 = max_stmt_executions_int (get_chrec_loop (chrec_b));
3740               HOST_WIDE_INT niter = MIN (niter_a, niter_b);
3741
3742               /* (X0, Y0) is a solution of the Diophantine equation:
3743                  "chrec_a (X0) = chrec_b (Y0)".  */
3744               HOST_WIDE_INT tau1 = MAX (CEIL (-i0, i1),
3745                                         CEIL (-j0, j1));
3746               HOST_WIDE_INT x0 = i1 * tau1 + i0;
3747               HOST_WIDE_INT y0 = j1 * tau1 + j0;
3748
3749               /* (X1, Y1) is the smallest positive solution of the eq
3750                  "chrec_a (X1) = chrec_b (Y1)", i.e. this is where the
3751                  first conflict occurs.  */
3752               HOST_WIDE_INT min_multiple = MIN (x0 / i1, y0 / j1);
3753               HOST_WIDE_INT x1 = x0 - i1 * min_multiple;
3754               HOST_WIDE_INT y1 = y0 - j1 * min_multiple;
3755
3756               if (niter > 0)
3757                 {
3758                   HOST_WIDE_INT tau2 = MIN (FLOOR_DIV (niter_a - i0, i1),
3759                                             FLOOR_DIV (niter_b - j0, j1));
3760                   HOST_WIDE_INT last_conflict = tau2 - (x1 - i0)/i1;
3761
3762                   /* If the overlap occurs outside of the bounds of the
3763                      loop, there is no dependence.  */
3764                   if (x1 >= niter_a || y1 >= niter_b)
3765                     {
3766                       *overlaps_a = conflict_fn_no_dependence ();
3767                       *overlaps_b = conflict_fn_no_dependence ();
3768                       *last_conflicts = integer_zero_node;
3769                       goto end_analyze_subs_aa;
3770                     }
3771                   else
3772                     *last_conflicts = build_int_cst (NULL_TREE, last_conflict);
3773                 }
3774               else
3775                 *last_conflicts = chrec_dont_know;
3776
3777               *overlaps_a
3778                 = conflict_fn (1,
3779                                affine_fn_univar (build_int_cst (NULL_TREE, x1),
3780                                                  1,
3781                                                  build_int_cst (NULL_TREE, i1)));
3782               *overlaps_b
3783                 = conflict_fn (1,
3784                                affine_fn_univar (build_int_cst (NULL_TREE, y1),
3785                                                  1,
3786                                                  build_int_cst (NULL_TREE, j1)));
3787             }
3788           else
3789             {
3790               /* FIXME: For the moment, the upper bound of the
3791                  iteration domain for i and j is not checked.  */
3792               if (dump_file && (dump_flags & TDF_DETAILS))
3793                 fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3794               *overlaps_a = conflict_fn_not_known ();
3795               *overlaps_b = conflict_fn_not_known ();
3796               *last_conflicts = chrec_dont_know;
3797             }
3798         }
3799       else
3800         {
3801           if (dump_file && (dump_flags & TDF_DETAILS))
3802             fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3803           *overlaps_a = conflict_fn_not_known ();
3804           *overlaps_b = conflict_fn_not_known ();
3805           *last_conflicts = chrec_dont_know;
3806         }
3807     }
3808   else
3809     {
3810       if (dump_file && (dump_flags & TDF_DETAILS))
3811         fprintf (dump_file, "affine-affine test failed: unimplemented.\n");
3812       *overlaps_a = conflict_fn_not_known ();
3813       *overlaps_b = conflict_fn_not_known ();
3814       *last_conflicts = chrec_dont_know;
3815     }
3816
3817 end_analyze_subs_aa:
3818   obstack_free (&scratch_obstack, NULL);
3819   if (dump_file && (dump_flags & TDF_DETAILS))
3820     {
3821       fprintf (dump_file, "  (overlaps_a = ");
3822       dump_conflict_function (dump_file, *overlaps_a);
3823       fprintf (dump_file, ")\n  (overlaps_b = ");
3824       dump_conflict_function (dump_file, *overlaps_b);
3825       fprintf (dump_file, "))\n");
3826     }
3827 }
3828
3829 /* Returns true when analyze_subscript_affine_affine can be used for
3830    determining the dependence relation between chrec_a and chrec_b,
3831    that contain symbols.  This function modifies chrec_a and chrec_b
3832    such that the analysis result is the same, and such that they don't
3833    contain symbols, and then can safely be passed to the analyzer.
3834
3835    Example: The analysis of the following tuples of evolutions produce
3836    the same results: {x+1, +, 1}_1 vs. {x+3, +, 1}_1, and {-2, +, 1}_1
3837    vs. {0, +, 1}_1
3838
3839    {x+1, +, 1}_1 ({2, +, 1}_1) = {x+3, +, 1}_1 ({0, +, 1}_1)
3840    {-2, +, 1}_1 ({2, +, 1}_1) = {0, +, 1}_1 ({0, +, 1}_1)
3841 */
3842
3843 static bool
3844 can_use_analyze_subscript_affine_affine (tree *chrec_a, tree *chrec_b)
3845 {
3846   tree diff, type, left_a, left_b, right_b;
3847
3848   if (chrec_contains_symbols (CHREC_RIGHT (*chrec_a))
3849       || chrec_contains_symbols (CHREC_RIGHT (*chrec_b)))
3850     /* FIXME: For the moment not handled.  Might be refined later.  */
3851     return false;
3852
3853   type = chrec_type (*chrec_a);
3854   left_a = CHREC_LEFT (*chrec_a);
3855   left_b = chrec_convert (type, CHREC_LEFT (*chrec_b), NULL);
3856   diff = chrec_fold_minus (type, left_a, left_b);
3857
3858   if (!evolution_function_is_constant_p (diff))
3859     return false;
3860
3861   if (dump_file && (dump_flags & TDF_DETAILS))
3862     fprintf (dump_file, "can_use_subscript_aff_aff_for_symbolic \n");
3863
3864   *chrec_a = build_polynomial_chrec (CHREC_VARIABLE (*chrec_a),
3865                                      diff, CHREC_RIGHT (*chrec_a));
3866   right_b = chrec_convert (type, CHREC_RIGHT (*chrec_b), NULL);
3867   *chrec_b = build_polynomial_chrec (CHREC_VARIABLE (*chrec_b),
3868                                      build_int_cst (type, 0),
3869                                      right_b);
3870   return true;
3871 }
3872
3873 /* Analyze a SIV (Single Index Variable) subscript.  *OVERLAPS_A and
3874    *OVERLAPS_B are initialized to the functions that describe the
3875    relation between the elements accessed twice by CHREC_A and
3876    CHREC_B.  For k >= 0, the following property is verified:
3877
3878    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
3879
3880 static void
3881 analyze_siv_subscript (tree chrec_a,
3882                        tree chrec_b,
3883                        conflict_function **overlaps_a,
3884                        conflict_function **overlaps_b,
3885                        tree *last_conflicts,
3886                        int loop_nest_num)
3887 {
3888   dependence_stats.num_siv++;
3889
3890   if (dump_file && (dump_flags & TDF_DETAILS))
3891     fprintf (dump_file, "(analyze_siv_subscript \n");
3892
3893   if (evolution_function_is_constant_p (chrec_a)
3894       && evolution_function_is_affine_in_loop (chrec_b, loop_nest_num))
3895     analyze_siv_subscript_cst_affine (chrec_a, chrec_b,
3896                                       overlaps_a, overlaps_b, last_conflicts);
3897
3898   else if (evolution_function_is_affine_in_loop (chrec_a, loop_nest_num)
3899            && evolution_function_is_constant_p (chrec_b))
3900     analyze_siv_subscript_cst_affine (chrec_b, chrec_a,
3901                                       overlaps_b, overlaps_a, last_conflicts);
3902
3903   else if (evolution_function_is_affine_in_loop (chrec_a, loop_nest_num)
3904            && evolution_function_is_affine_in_loop (chrec_b, loop_nest_num))
3905     {
3906       if (!chrec_contains_symbols (chrec_a)
3907           && !chrec_contains_symbols (chrec_b))
3908         {
3909           analyze_subscript_affine_affine (chrec_a, chrec_b,
3910                                            overlaps_a, overlaps_b,
3911                                            last_conflicts);
3912
3913           if (CF_NOT_KNOWN_P (*overlaps_a)
3914               || CF_NOT_KNOWN_P (*overlaps_b))
3915             dependence_stats.num_siv_unimplemented++;
3916           else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3917                    || CF_NO_DEPENDENCE_P (*overlaps_b))
3918             dependence_stats.num_siv_independent++;
3919           else
3920             dependence_stats.num_siv_dependent++;
3921         }
3922       else if (can_use_analyze_subscript_affine_affine (&chrec_a,
3923                                                         &chrec_b))
3924         {
3925           analyze_subscript_affine_affine (chrec_a, chrec_b,
3926                                            overlaps_a, overlaps_b,
3927                                            last_conflicts);
3928
3929           if (CF_NOT_KNOWN_P (*overlaps_a)
3930               || CF_NOT_KNOWN_P (*overlaps_b))
3931             dependence_stats.num_siv_unimplemented++;
3932           else if (CF_NO_DEPENDENCE_P (*overlaps_a)
3933                    || CF_NO_DEPENDENCE_P (*overlaps_b))
3934             dependence_stats.num_siv_independent++;
3935           else
3936             dependence_stats.num_siv_dependent++;
3937         }
3938       else
3939         goto siv_subscript_dontknow;
3940     }
3941
3942   else
3943     {
3944     siv_subscript_dontknow:;
3945       if (dump_file && (dump_flags & TDF_DETAILS))
3946         fprintf (dump_file, "  siv test failed: unimplemented");
3947       *overlaps_a = conflict_fn_not_known ();
3948       *overlaps_b = conflict_fn_not_known ();
3949       *last_conflicts = chrec_dont_know;
3950       dependence_stats.num_siv_unimplemented++;
3951     }
3952
3953   if (dump_file && (dump_flags & TDF_DETAILS))
3954     fprintf (dump_file, ")\n");
3955 }
3956
3957 /* Returns false if we can prove that the greatest common divisor of the steps
3958    of CHREC does not divide CST, false otherwise.  */
3959
3960 static bool
3961 gcd_of_steps_may_divide_p (const_tree chrec, const_tree cst)
3962 {
3963   HOST_WIDE_INT cd = 0, val;
3964   tree step;
3965
3966   if (!tree_fits_shwi_p (cst))
3967     return true;
3968   val = tree_to_shwi (cst);
3969
3970   while (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
3971     {
3972       step = CHREC_RIGHT (chrec);
3973       if (!tree_fits_shwi_p (step))
3974         return true;
3975       cd = gcd (cd, tree_to_shwi (step));
3976       chrec = CHREC_LEFT (chrec);
3977     }
3978
3979   return val % cd == 0;
3980 }
3981
3982 /* Analyze a MIV (Multiple Index Variable) subscript with respect to
3983    LOOP_NEST.  *OVERLAPS_A and *OVERLAPS_B are initialized to the
3984    functions that describe the relation between the elements accessed
3985    twice by CHREC_A and CHREC_B.  For k >= 0, the following property
3986    is verified:
3987
3988    CHREC_A (*OVERLAPS_A (k)) = CHREC_B (*OVERLAPS_B (k)).  */
3989
3990 static void
3991 analyze_miv_subscript (tree chrec_a,
3992                        tree chrec_b,
3993                        conflict_function **overlaps_a,
3994                        conflict_function **overlaps_b,
3995                        tree *last_conflicts,
3996                        struct loop *loop_nest)
3997 {
3998   tree type, difference;
3999
4000   dependence_stats.num_miv++;
4001   if (dump_file && (dump_flags & TDF_DETAILS))
4002     fprintf (dump_file, "(analyze_miv_subscript \n");
4003
4004   type = signed_type_for_types (TREE_TYPE (chrec_a), TREE_TYPE (chrec_b));
4005   chrec_a = chrec_convert (type, chrec_a, NULL);
4006   chrec_b = chrec_convert (type, chrec_b, NULL);
4007   difference = chrec_fold_minus (type, chrec_a, chrec_b);
4008
4009   if (eq_evolutions_p (chrec_a, chrec_b))
4010     {
4011       /* Access functions are the same: all the elements are accessed
4012          in the same order.  */
4013       *overlaps_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
4014       *overlaps_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
4015       *last_conflicts = max_stmt_executions_tree (get_chrec_loop (chrec_a));
4016       dependence_stats.num_miv_dependent++;
4017     }
4018
4019   else if (evolution_function_is_constant_p (difference)
4020            && evolution_function_is_affine_multivariate_p (chrec_a,
4021                                                            loop_nest->num)
4022            && !gcd_of_steps_may_divide_p (chrec_a, difference))
4023     {
4024       /* testsuite/.../ssa-chrec-33.c
4025          {{21, +, 2}_1, +, -2}_2  vs.  {{20, +, 2}_1, +, -2}_2
4026
4027          The difference is 1, and all the evolution steps are multiples
4028          of 2, consequently there are no overlapping elements.  */
4029       *overlaps_a = conflict_fn_no_dependence ();
4030       *overlaps_b = conflict_fn_no_dependence ();
4031       *last_conflicts = integer_zero_node;
4032       dependence_stats.num_miv_independent++;
4033     }
4034
4035   else if (evolution_function_is_affine_multivariate_p (chrec_a, loop_nest->num)
4036            && !chrec_contains_symbols (chrec_a)
4037            && evolution_function_is_affine_multivariate_p (chrec_b, loop_nest->num)
4038            && !chrec_contains_symbols (chrec_b))
4039     {
4040       /* testsuite/.../ssa-chrec-35.c
4041          {0, +, 1}_2  vs.  {0, +, 1}_3
4042          the overlapping elements are respectively located at iterations:
4043          {0, +, 1}_x and {0, +, 1}_x,
4044          in other words, we have the equality:
4045          {0, +, 1}_2 ({0, +, 1}_x) = {0, +, 1}_3 ({0, +, 1}_x)
4046
4047          Other examples:
4048          {{0, +, 1}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y) =
4049          {0, +, 1}_1 ({{0, +, 1}_x, +, 2}_y)
4050
4051          {{0, +, 2}_1, +, 3}_2 ({0, +, 1}_y, {0, +, 1}_x) =
4052          {{0, +, 3}_1, +, 2}_2 ({0, +, 1}_x, {0, +, 1}_y)
4053       */
4054       analyze_subscript_affine_affine (chrec_a, chrec_b,
4055                                        overlaps_a, overlaps_b, last_conflicts);
4056
4057       if (CF_NOT_KNOWN_P (*overlaps_a)
4058           || CF_NOT_KNOWN_P (*overlaps_b))
4059         dependence_stats.num_miv_unimplemented++;
4060       else if (CF_NO_DEPENDENCE_P (*overlaps_a)
4061                || CF_NO_DEPENDENCE_P (*overlaps_b))
4062         dependence_stats.num_miv_independent++;
4063       else
4064         dependence_stats.num_miv_dependent++;
4065     }
4066
4067   else
4068     {
4069       /* When the analysis is too difficult, answer "don't know".  */
4070       if (dump_file && (dump_flags & TDF_DETAILS))
4071         fprintf (dump_file, "analyze_miv_subscript test failed: unimplemented.\n");
4072
4073       *overlaps_a = conflict_fn_not_known ();
4074       *overlaps_b = conflict_fn_not_known ();
4075       *last_conflicts = chrec_dont_know;
4076       dependence_stats.num_miv_unimplemented++;
4077     }
4078
4079   if (dump_file && (dump_flags & TDF_DETAILS))
4080     fprintf (dump_file, ")\n");
4081 }
4082
4083 /* Determines the iterations for which CHREC_A is equal to CHREC_B in
4084    with respect to LOOP_NEST.  OVERLAP_ITERATIONS_A and
4085    OVERLAP_ITERATIONS_B are initialized with two functions that
4086    describe the iterations that contain conflicting elements.
4087
4088    Remark: For an integer k >= 0, the following equality is true:
4089
4090    CHREC_A (OVERLAP_ITERATIONS_A (k)) == CHREC_B (OVERLAP_ITERATIONS_B (k)).
4091 */
4092
4093 static void
4094 analyze_overlapping_iterations (tree chrec_a,
4095                                 tree chrec_b,
4096                                 conflict_function **overlap_iterations_a,
4097                                 conflict_function **overlap_iterations_b,
4098                                 tree *last_conflicts, struct loop *loop_nest)
4099 {
4100   unsigned int lnn = loop_nest->num;
4101
4102   dependence_stats.num_subscript_tests++;
4103
4104   if (dump_file && (dump_flags & TDF_DETAILS))
4105     {
4106       fprintf (dump_file, "(analyze_overlapping_iterations \n");
4107       fprintf (dump_file, "  (chrec_a = ");
4108       print_generic_expr (dump_file, chrec_a);
4109       fprintf (dump_file, ")\n  (chrec_b = ");
4110       print_generic_expr (dump_file, chrec_b);
4111       fprintf (dump_file, ")\n");
4112     }
4113
4114   if (chrec_a == NULL_TREE
4115       || chrec_b == NULL_TREE
4116       || chrec_contains_undetermined (chrec_a)
4117       || chrec_contains_undetermined (chrec_b))
4118     {
4119       dependence_stats.num_subscript_undetermined++;
4120
4121       *overlap_iterations_a = conflict_fn_not_known ();
4122       *overlap_iterations_b = conflict_fn_not_known ();
4123     }
4124
4125   /* If they are the same chrec, and are affine, they overlap
4126      on every iteration.  */
4127   else if (eq_evolutions_p (chrec_a, chrec_b)
4128            && (evolution_function_is_affine_multivariate_p (chrec_a, lnn)
4129                || operand_equal_p (chrec_a, chrec_b, 0)))
4130     {
4131       dependence_stats.num_same_subscript_function++;
4132       *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node));
4133       *overlap_iterations_b = conflict_fn (1, affine_fn_cst (integer_zero_node));
4134       *last_conflicts = chrec_dont_know;
4135     }
4136
4137   /* If they aren't the same, and aren't affine, we can't do anything
4138      yet.  */
4139   else if ((chrec_contains_symbols (chrec_a)
4140             || chrec_contains_symbols (chrec_b))
4141            && (!evolution_function_is_affine_multivariate_p (chrec_a, lnn)
4142                || !evolution_function_is_affine_multivariate_p (chrec_b, lnn)))
4143     {
4144       dependence_stats.num_subscript_undetermined++;
4145       *overlap_iterations_a = conflict_fn_not_known ();
4146       *overlap_iterations_b = conflict_fn_not_known ();
4147     }
4148
4149   else if (ziv_subscript_p (chrec_a, chrec_b))
4150     analyze_ziv_subscript (chrec_a, chrec_b,
4151                            overlap_iterations_a, overlap_iterations_b,
4152                            last_conflicts);
4153
4154   else if (siv_subscript_p (chrec_a, chrec_b))
4155     analyze_siv_subscript (chrec_a, chrec_b,
4156                            overlap_iterations_a, overlap_iterations_b,
4157                            last_conflicts, lnn);
4158
4159   else
4160     analyze_miv_subscript (chrec_a, chrec_b,
4161                            overlap_iterations_a, overlap_iterations_b,
4162                            last_conflicts, loop_nest);
4163
4164   if (dump_file && (dump_flags & TDF_DETAILS))
4165     {
4166       fprintf (dump_file, "  (overlap_iterations_a = ");
4167       dump_conflict_function (dump_file, *overlap_iterations_a);
4168       fprintf (dump_file, ")\n  (overlap_iterations_b = ");
4169       dump_conflict_function (dump_file, *overlap_iterations_b);
4170       fprintf (dump_file, "))\n");
4171     }
4172 }
4173
4174 /* Helper function for uniquely inserting distance vectors.  */
4175
4176 static void
4177 save_dist_v (struct data_dependence_relation *ddr, lambda_vector dist_v)
4178 {
4179   unsigned i;
4180   lambda_vector v;
4181
4182   FOR_EACH_VEC_ELT (DDR_DIST_VECTS (ddr), i, v)
4183     if (lambda_vector_equal (v, dist_v, DDR_NB_LOOPS (ddr)))
4184       return;
4185
4186   DDR_DIST_VECTS (ddr).safe_push (dist_v);
4187 }
4188
4189 /* Helper function for uniquely inserting direction vectors.  */
4190
4191 static void
4192 save_dir_v (struct data_dependence_relation *ddr, lambda_vector dir_v)
4193 {
4194   unsigned i;
4195   lambda_vector v;
4196
4197   FOR_EACH_VEC_ELT (DDR_DIR_VECTS (ddr), i, v)
4198     if (lambda_vector_equal (v, dir_v, DDR_NB_LOOPS (ddr)))
4199       return;
4200
4201   DDR_DIR_VECTS (ddr).safe_push (dir_v);
4202 }
4203
4204 /* Add a distance of 1 on all the loops outer than INDEX.  If we
4205    haven't yet determined a distance for this outer loop, push a new
4206    distance vector composed of the previous distance, and a distance
4207    of 1 for this outer loop.  Example:
4208
4209    | loop_1
4210    |   loop_2
4211    |     A[10]
4212    |   endloop_2
4213    | endloop_1
4214
4215    Saved vectors are of the form (dist_in_1, dist_in_2).  First, we
4216    save (0, 1), then we have to save (1, 0).  */
4217
4218 static void
4219 add_outer_distances (struct data_dependence_relation *ddr,
4220                      lambda_vector dist_v, int index)
4221 {
4222   /* For each outer loop where init_v is not set, the accesses are
4223      in dependence of distance 1 in the loop.  */
4224   while (--index >= 0)
4225     {
4226       lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4227       lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
4228       save_v[index] = 1;
4229       save_dist_v (ddr, save_v);
4230     }
4231 }
4232
4233 /* Return false when fail to represent the data dependence as a
4234    distance vector.  A_INDEX is the index of the first reference
4235    (0 for DDR_A, 1 for DDR_B) and B_INDEX is the index of the
4236    second reference.  INIT_B is set to true when a component has been
4237    added to the distance vector DIST_V.  INDEX_CARRY is then set to
4238    the index in DIST_V that carries the dependence.  */
4239
4240 static bool
4241 build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
4242                              unsigned int a_index, unsigned int b_index,
4243                              lambda_vector dist_v, bool *init_b,
4244                              int *index_carry)
4245 {
4246   unsigned i;
4247   lambda_vector init_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4248
4249   for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
4250     {
4251       tree access_fn_a, access_fn_b;
4252       struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
4253
4254       if (chrec_contains_undetermined (SUB_DISTANCE (subscript)))
4255         {
4256           non_affine_dependence_relation (ddr);
4257           return false;
4258         }
4259
4260       access_fn_a = SUB_ACCESS_FN (subscript, a_index);
4261       access_fn_b = SUB_ACCESS_FN (subscript, b_index);
4262
4263       if (TREE_CODE (access_fn_a) == POLYNOMIAL_CHREC
4264           && TREE_CODE (access_fn_b) == POLYNOMIAL_CHREC)
4265         {
4266           HOST_WIDE_INT dist;
4267           int index;
4268           int var_a = CHREC_VARIABLE (access_fn_a);
4269           int var_b = CHREC_VARIABLE (access_fn_b);
4270
4271           if (var_a != var_b
4272               || chrec_contains_undetermined (SUB_DISTANCE (subscript)))
4273             {
4274               non_affine_dependence_relation (ddr);
4275               return false;
4276             }
4277
4278           dist = int_cst_value (SUB_DISTANCE (subscript));
4279           index = index_in_loop_nest (var_a, DDR_LOOP_NEST (ddr));
4280           *index_carry = MIN (index, *index_carry);
4281
4282           /* This is the subscript coupling test.  If we have already
4283              recorded a distance for this loop (a distance coming from
4284              another subscript), it should be the same.  For example,
4285              in the following code, there is no dependence:
4286
4287              | loop i = 0, N, 1
4288              |   T[i+1][i] = ...
4289              |   ... = T[i][i]
4290              | endloop
4291           */
4292           if (init_v[index] != 0 && dist_v[index] != dist)
4293             {
4294               finalize_ddr_dependent (ddr, chrec_known);
4295               return false;
4296             }
4297
4298           dist_v[index] = dist;
4299           init_v[index] = 1;
4300           *init_b = true;
4301         }
4302       else if (!operand_equal_p (access_fn_a, access_fn_b, 0))
4303         {
4304           /* This can be for example an affine vs. constant dependence
4305              (T[i] vs. T[3]) that is not an affine dependence and is
4306              not representable as a distance vector.  */
4307           non_affine_dependence_relation (ddr);
4308           return false;
4309         }
4310     }
4311
4312   return true;
4313 }
4314
4315 /* Return true when the DDR contains only constant access functions.  */
4316
4317 static bool
4318 constant_access_functions (const struct data_dependence_relation *ddr)
4319 {
4320   unsigned i;
4321   subscript *sub;
4322
4323   FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
4324     if (!evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 0))
4325         || !evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 1)))
4326       return false;
4327
4328   return true;
4329 }
4330
4331 /* Helper function for the case where DDR_A and DDR_B are the same
4332    multivariate access function with a constant step.  For an example
4333    see pr34635-1.c.  */
4334
4335 static void
4336 add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
4337 {
4338   int x_1, x_2;
4339   tree c_1 = CHREC_LEFT (c_2);
4340   tree c_0 = CHREC_LEFT (c_1);
4341   lambda_vector dist_v;
4342   HOST_WIDE_INT v1, v2, cd;
4343
4344   /* Polynomials with more than 2 variables are not handled yet.  When
4345      the evolution steps are parameters, it is not possible to
4346      represent the dependence using classical distance vectors.  */
4347   if (TREE_CODE (c_0) != INTEGER_CST
4348       || TREE_CODE (CHREC_RIGHT (c_1)) != INTEGER_CST
4349       || TREE_CODE (CHREC_RIGHT (c_2)) != INTEGER_CST)
4350     {
4351       DDR_AFFINE_P (ddr) = false;
4352       return;
4353     }
4354
4355   x_2 = index_in_loop_nest (CHREC_VARIABLE (c_2), DDR_LOOP_NEST (ddr));
4356   x_1 = index_in_loop_nest (CHREC_VARIABLE (c_1), DDR_LOOP_NEST (ddr));
4357
4358   /* For "{{0, +, 2}_1, +, 3}_2" the distance vector is (3, -2).  */
4359   dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4360   v1 = int_cst_value (CHREC_RIGHT (c_1));
4361   v2 = int_cst_value (CHREC_RIGHT (c_2));
4362   cd = gcd (v1, v2);
4363   v1 /= cd;
4364   v2 /= cd;
4365
4366   if (v2 < 0)
4367     {
4368       v2 = -v2;
4369       v1 = -v1;
4370     }
4371
4372   dist_v[x_1] = v2;
4373   dist_v[x_2] = -v1;
4374   save_dist_v (ddr, dist_v);
4375
4376   add_outer_distances (ddr, dist_v, x_1);
4377 }
4378
4379 /* Helper function for the case where DDR_A and DDR_B are the same
4380    access functions.  */
4381
4382 static void
4383 add_other_self_distances (struct data_dependence_relation *ddr)
4384 {
4385   lambda_vector dist_v;
4386   unsigned i;
4387   int index_carry = DDR_NB_LOOPS (ddr);
4388   subscript *sub;
4389
4390   FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
4391     {
4392       tree access_fun = SUB_ACCESS_FN (sub, 0);
4393
4394       if (TREE_CODE (access_fun) == POLYNOMIAL_CHREC)
4395         {
4396           if (!evolution_function_is_univariate_p (access_fun))
4397             {
4398               if (DDR_NUM_SUBSCRIPTS (ddr) != 1)
4399                 {
4400                   DDR_ARE_DEPENDENT (ddr) = chrec_dont_know;
4401                   return;
4402                 }
4403
4404               access_fun = SUB_ACCESS_FN (DDR_SUBSCRIPT (ddr, 0), 0);
4405
4406               if (TREE_CODE (CHREC_LEFT (access_fun)) == POLYNOMIAL_CHREC)
4407                 add_multivariate_self_dist (ddr, access_fun);
4408               else
4409                 /* The evolution step is not constant: it varies in
4410                    the outer loop, so this cannot be represented by a
4411                    distance vector.  For example in pr34635.c the
4412                    evolution is {0, +, {0, +, 4}_1}_2.  */
4413                 DDR_AFFINE_P (ddr) = false;
4414
4415               return;
4416             }
4417
4418           index_carry = MIN (index_carry,
4419                              index_in_loop_nest (CHREC_VARIABLE (access_fun),
4420                                                  DDR_LOOP_NEST (ddr)));
4421         }
4422     }
4423
4424   dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4425   add_outer_distances (ddr, dist_v, index_carry);
4426 }
4427
4428 static void
4429 insert_innermost_unit_dist_vector (struct data_dependence_relation *ddr)
4430 {
4431   lambda_vector dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4432
4433   dist_v[DDR_INNER_LOOP (ddr)] = 1;
4434   save_dist_v (ddr, dist_v);
4435 }
4436
4437 /* Adds a unit distance vector to DDR when there is a 0 overlap.  This
4438    is the case for example when access functions are the same and
4439    equal to a constant, as in:
4440
4441    | loop_1
4442    |   A[3] = ...
4443    |   ... = A[3]
4444    | endloop_1
4445
4446    in which case the distance vectors are (0) and (1).  */
4447
4448 static void
4449 add_distance_for_zero_overlaps (struct data_dependence_relation *ddr)
4450 {
4451   unsigned i, j;
4452
4453   for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
4454     {
4455       subscript_p sub = DDR_SUBSCRIPT (ddr, i);
4456       conflict_function *ca = SUB_CONFLICTS_IN_A (sub);
4457       conflict_function *cb = SUB_CONFLICTS_IN_B (sub);
4458
4459       for (j = 0; j < ca->n; j++)
4460         if (affine_function_zero_p (ca->fns[j]))
4461           {
4462             insert_innermost_unit_dist_vector (ddr);
4463             return;
4464           }
4465
4466       for (j = 0; j < cb->n; j++)
4467         if (affine_function_zero_p (cb->fns[j]))
4468           {
4469             insert_innermost_unit_dist_vector (ddr);
4470             return;
4471           }
4472     }
4473 }
4474
4475 /* Return true when the DDR contains two data references that have the
4476    same access functions.  */
4477
4478 static inline bool
4479 same_access_functions (const struct data_dependence_relation *ddr)
4480 {
4481   unsigned i;
4482   subscript *sub;
4483
4484   FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
4485     if (!eq_evolutions_p (SUB_ACCESS_FN (sub, 0),
4486                           SUB_ACCESS_FN (sub, 1)))
4487       return false;
4488
4489   return true;
4490 }
4491
4492 /* Compute the classic per loop distance vector.  DDR is the data
4493    dependence relation to build a vector from.  Return false when fail
4494    to represent the data dependence as a distance vector.  */
4495
4496 static bool
4497 build_classic_dist_vector (struct data_dependence_relation *ddr,
4498                            struct loop *loop_nest)
4499 {
4500   bool init_b = false;
4501   int index_carry = DDR_NB_LOOPS (ddr);
4502   lambda_vector dist_v;
4503
4504   if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
4505     return false;
4506
4507   if (same_access_functions (ddr))
4508     {
4509       /* Save the 0 vector.  */
4510       dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4511       save_dist_v (ddr, dist_v);
4512
4513       if (constant_access_functions (ddr))
4514         add_distance_for_zero_overlaps (ddr);
4515
4516       if (DDR_NB_LOOPS (ddr) > 1)
4517         add_other_self_distances (ddr);
4518
4519       return true;
4520     }
4521
4522   dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4523   if (!build_classic_dist_vector_1 (ddr, 0, 1, dist_v, &init_b, &index_carry))
4524     return false;
4525
4526   /* Save the distance vector if we initialized one.  */
4527   if (init_b)
4528     {
4529       /* Verify a basic constraint: classic distance vectors should
4530          always be lexicographically positive.
4531
4532          Data references are collected in the order of execution of
4533          the program, thus for the following loop
4534
4535          | for (i = 1; i < 100; i++)
4536          |   for (j = 1; j < 100; j++)
4537          |     {
4538          |       t = T[j+1][i-1];  // A
4539          |       T[j][i] = t + 2;  // B
4540          |     }
4541
4542          references are collected following the direction of the wind:
4543          A then B.  The data dependence tests are performed also
4544          following this order, such that we're looking at the distance
4545          separating the elements accessed by A from the elements later
4546          accessed by B.  But in this example, the distance returned by
4547          test_dep (A, B) is lexicographically negative (-1, 1), that
4548          means that the access A occurs later than B with respect to
4549          the outer loop, ie. we're actually looking upwind.  In this
4550          case we solve test_dep (B, A) looking downwind to the
4551          lexicographically positive solution, that returns the
4552          distance vector (1, -1).  */
4553       if (!lambda_vector_lexico_pos (dist_v, DDR_NB_LOOPS (ddr)))
4554         {
4555           lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4556           if (!subscript_dependence_tester_1 (ddr, 1, 0, loop_nest))
4557             return false;
4558           compute_subscript_distance (ddr);
4559           if (!build_classic_dist_vector_1 (ddr, 1, 0, save_v, &init_b,
4560                                             &index_carry))
4561             return false;
4562           save_dist_v (ddr, save_v);
4563           DDR_REVERSED_P (ddr) = true;
4564
4565           /* In this case there is a dependence forward for all the
4566              outer loops:
4567
4568              | for (k = 1; k < 100; k++)
4569              |  for (i = 1; i < 100; i++)
4570              |   for (j = 1; j < 100; j++)
4571              |     {
4572              |       t = T[j+1][i-1];  // A
4573              |       T[j][i] = t + 2;  // B
4574              |     }
4575
4576              the vectors are:
4577              (0,  1, -1)
4578              (1,  1, -1)
4579              (1, -1,  1)
4580           */
4581           if (DDR_NB_LOOPS (ddr) > 1)
4582             {
4583               add_outer_distances (ddr, save_v, index_carry);
4584               add_outer_distances (ddr, dist_v, index_carry);
4585             }
4586         }
4587       else
4588         {
4589           lambda_vector save_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4590           lambda_vector_copy (dist_v, save_v, DDR_NB_LOOPS (ddr));
4591
4592           if (DDR_NB_LOOPS (ddr) > 1)
4593             {
4594               lambda_vector opposite_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4595
4596               if (!subscript_dependence_tester_1 (ddr, 1, 0, loop_nest))
4597                 return false;
4598               compute_subscript_distance (ddr);
4599               if (!build_classic_dist_vector_1 (ddr, 1, 0, opposite_v, &init_b,
4600                                                 &index_carry))
4601                 return false;
4602
4603               save_dist_v (ddr, save_v);
4604               add_outer_distances (ddr, dist_v, index_carry);
4605               add_outer_distances (ddr, opposite_v, index_carry);
4606             }
4607           else
4608             save_dist_v (ddr, save_v);
4609         }
4610     }
4611   else
4612     {
4613       /* There is a distance of 1 on all the outer loops: Example:
4614          there is a dependence of distance 1 on loop_1 for the array A.
4615
4616          | loop_1
4617          |   A[5] = ...
4618          | endloop
4619       */
4620       add_outer_distances (ddr, dist_v,
4621                            lambda_vector_first_nz (dist_v,
4622                                                    DDR_NB_LOOPS (ddr), 0));
4623     }
4624
4625   if (dump_file && (dump_flags & TDF_DETAILS))
4626     {
4627       unsigned i;
4628
4629       fprintf (dump_file, "(build_classic_dist_vector\n");
4630       for (i = 0; i < DDR_NUM_DIST_VECTS (ddr); i++)
4631         {
4632           fprintf (dump_file, "  dist_vector = (");
4633           print_lambda_vector (dump_file, DDR_DIST_VECT (ddr, i),
4634                                DDR_NB_LOOPS (ddr));
4635           fprintf (dump_file, "  )\n");
4636         }
4637       fprintf (dump_file, ")\n");
4638     }
4639
4640   return true;
4641 }
4642
4643 /* Return the direction for a given distance.
4644    FIXME: Computing dir this way is suboptimal, since dir can catch
4645    cases that dist is unable to represent.  */
4646
4647 static inline enum data_dependence_direction
4648 dir_from_dist (int dist)
4649 {
4650   if (dist > 0)
4651     return dir_positive;
4652   else if (dist < 0)
4653     return dir_negative;
4654   else
4655     return dir_equal;
4656 }
4657
4658 /* Compute the classic per loop direction vector.  DDR is the data
4659    dependence relation to build a vector from.  */
4660
4661 static void
4662 build_classic_dir_vector (struct data_dependence_relation *ddr)
4663 {
4664   unsigned i, j;
4665   lambda_vector dist_v;
4666
4667   FOR_EACH_VEC_ELT (DDR_DIST_VECTS (ddr), i, dist_v)
4668     {
4669       lambda_vector dir_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
4670
4671       for (j = 0; j < DDR_NB_LOOPS (ddr); j++)
4672         dir_v[j] = dir_from_dist (dist_v[j]);
4673
4674       save_dir_v (ddr, dir_v);
4675     }
4676 }
4677
4678 /* Helper function.  Returns true when there is a dependence between the
4679    data references.  A_INDEX is the index of the first reference (0 for
4680    DDR_A, 1 for DDR_B) and B_INDEX is the index of the second reference.  */
4681
4682 static bool
4683 subscript_dependence_tester_1 (struct data_dependence_relation *ddr,
4684                                unsigned int a_index, unsigned int b_index,
4685                                struct loop *loop_nest)
4686 {
4687   unsigned int i;
4688   tree last_conflicts;
4689   struct subscript *subscript;
4690   tree res = NULL_TREE;
4691
4692   for (i = 0; DDR_SUBSCRIPTS (ddr).iterate (i, &subscript); i++)
4693     {
4694       conflict_function *overlaps_a, *overlaps_b;
4695
4696       analyze_overlapping_iterations (SUB_ACCESS_FN (subscript, a_index),
4697                                       SUB_ACCESS_FN (subscript, b_index),
4698                                       &overlaps_a, &overlaps_b,
4699                                       &last_conflicts, loop_nest);
4700
4701       if (SUB_CONFLICTS_IN_A (subscript))
4702         free_conflict_function (SUB_CONFLICTS_IN_A (subscript));
4703       if (SUB_CONFLICTS_IN_B (subscript))
4704         free_conflict_function (SUB_CONFLICTS_IN_B (subscript));
4705
4706       SUB_CONFLICTS_IN_A (subscript) = overlaps_a;
4707       SUB_CONFLICTS_IN_B (subscript) = overlaps_b;
4708       SUB_LAST_CONFLICT (subscript) = last_conflicts;
4709
4710       /* If there is any undetermined conflict function we have to
4711          give a conservative answer in case we cannot prove that
4712          no dependence exists when analyzing another subscript.  */
4713       if (CF_NOT_KNOWN_P (overlaps_a)
4714           || CF_NOT_KNOWN_P (overlaps_b))
4715         {
4716           res = chrec_dont_know;
4717           continue;
4718         }
4719
4720       /* When there is a subscript with no dependence we can stop.  */
4721       else if (CF_NO_DEPENDENCE_P (overlaps_a)
4722                || CF_NO_DEPENDENCE_P (overlaps_b))
4723         {
4724           res = chrec_known;
4725           break;
4726         }
4727     }
4728
4729   if (res == NULL_TREE)
4730     return true;
4731
4732   if (res == chrec_known)
4733     dependence_stats.num_dependence_independent++;
4734   else
4735     dependence_stats.num_dependence_undetermined++;
4736   finalize_ddr_dependent (ddr, res);
4737   return false;
4738 }
4739
4740 /* Computes the conflicting iterations in LOOP_NEST, and initialize DDR.  */
4741
4742 static void
4743 subscript_dependence_tester (struct data_dependence_relation *ddr,
4744                              struct loop *loop_nest)
4745 {
4746   if (subscript_dependence_tester_1 (ddr, 0, 1, loop_nest))
4747     dependence_stats.num_dependence_dependent++;
4748
4749   compute_subscript_distance (ddr);
4750   if (build_classic_dist_vector (ddr, loop_nest))
4751     build_classic_dir_vector (ddr);
4752 }
4753
4754 /* Returns true when all the access functions of A are affine or
4755    constant with respect to LOOP_NEST.  */
4756
4757 static bool
4758 access_functions_are_affine_or_constant_p (const struct data_reference *a,
4759                                            const struct loop *loop_nest)
4760 {
4761   unsigned int i;
4762   vec<tree> fns = DR_ACCESS_FNS (a);
4763   tree t;
4764
4765   FOR_EACH_VEC_ELT (fns, i, t)
4766     if (!evolution_function_is_invariant_p (t, loop_nest->num)
4767         && !evolution_function_is_affine_multivariate_p (t, loop_nest->num))
4768       return false;
4769
4770   return true;
4771 }
4772
4773 /* This computes the affine dependence relation between A and B with
4774    respect to LOOP_NEST.  CHREC_KNOWN is used for representing the
4775    independence between two accesses, while CHREC_DONT_KNOW is used
4776    for representing the unknown relation.
4777
4778    Note that it is possible to stop the computation of the dependence
4779    relation the first time we detect a CHREC_KNOWN element for a given
4780    subscript.  */
4781
4782 void
4783 compute_affine_dependence (struct data_dependence_relation *ddr,
4784                            struct loop *loop_nest)
4785 {
4786   struct data_reference *dra = DDR_A (ddr);
4787   struct data_reference *drb = DDR_B (ddr);
4788
4789   if (dump_file && (dump_flags & TDF_DETAILS))
4790     {
4791       fprintf (dump_file, "(compute_affine_dependence\n");
4792       fprintf (dump_file, "  stmt_a: ");
4793       print_gimple_stmt (dump_file, DR_STMT (dra), 0, TDF_SLIM);
4794       fprintf (dump_file, "  stmt_b: ");
4795       print_gimple_stmt (dump_file, DR_STMT (drb), 0, TDF_SLIM);
4796     }
4797
4798   /* Analyze only when the dependence relation is not yet known.  */
4799   if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
4800     {
4801       dependence_stats.num_dependence_tests++;
4802
4803       if (access_functions_are_affine_or_constant_p (dra, loop_nest)
4804           && access_functions_are_affine_or_constant_p (drb, loop_nest))
4805         subscript_dependence_tester (ddr, loop_nest);
4806
4807       /* As a last case, if the dependence cannot be determined, or if
4808          the dependence is considered too difficult to determine, answer
4809          "don't know".  */
4810       else
4811         {
4812           dependence_stats.num_dependence_undetermined++;
4813
4814           if (dump_file && (dump_flags & TDF_DETAILS))
4815             {
4816               fprintf (dump_file, "Data ref a:\n");
4817               dump_data_reference (dump_file, dra);
4818               fprintf (dump_file, "Data ref b:\n");
4819               dump_data_reference (dump_file, drb);
4820               fprintf (dump_file, "affine dependence test not usable: access function not affine or constant.\n");
4821             }
4822           finalize_ddr_dependent (ddr, chrec_dont_know);
4823         }
4824     }
4825
4826   if (dump_file && (dump_flags & TDF_DETAILS))
4827     {
4828       if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
4829         fprintf (dump_file, ") -> no dependence\n");
4830       else if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
4831         fprintf (dump_file, ") -> dependence analysis failed\n");
4832       else
4833         fprintf (dump_file, ")\n");
4834     }
4835 }
4836
4837 /* Compute in DEPENDENCE_RELATIONS the data dependence graph for all
4838    the data references in DATAREFS, in the LOOP_NEST.  When
4839    COMPUTE_SELF_AND_RR is FALSE, don't compute read-read and self
4840    relations.  Return true when successful, i.e. data references number
4841    is small enough to be handled.  */
4842
4843 bool
4844 compute_all_dependences (vec<data_reference_p> datarefs,
4845                          vec<ddr_p> *dependence_relations,
4846                          vec<loop_p> loop_nest,
4847                          bool compute_self_and_rr)
4848 {
4849   struct data_dependence_relation *ddr;
4850   struct data_reference *a, *b;
4851   unsigned int i, j;
4852
4853   if ((int) datarefs.length ()
4854       > PARAM_VALUE (PARAM_LOOP_MAX_DATAREFS_FOR_DATADEPS))
4855     {
4856       struct data_dependence_relation *ddr;
4857
4858       /* Insert a single relation into dependence_relations:
4859          chrec_dont_know.  */
4860       ddr = initialize_data_dependence_relation (NULL, NULL, loop_nest);
4861       dependence_relations->safe_push (ddr);
4862       return false;
4863     }
4864
4865   FOR_EACH_VEC_ELT (datarefs, i, a)
4866     for (j = i + 1; datarefs.iterate (j, &b); j++)
4867       if (DR_IS_WRITE (a) || DR_IS_WRITE (b) || compute_self_and_rr)
4868         {
4869           ddr = initialize_data_dependence_relation (a, b, loop_nest);
4870           dependence_relations->safe_push (ddr);
4871           if (loop_nest.exists ())
4872             compute_affine_dependence (ddr, loop_nest[0]);
4873         }
4874
4875   if (compute_self_and_rr)
4876     FOR_EACH_VEC_ELT (datarefs, i, a)
4877       {
4878         ddr = initialize_data_dependence_relation (a, a, loop_nest);
4879         dependence_relations->safe_push (ddr);
4880         if (loop_nest.exists ())
4881           compute_affine_dependence (ddr, loop_nest[0]);
4882       }
4883
4884   return true;
4885 }
4886
4887 /* Describes a location of a memory reference.  */
4888
4889 struct data_ref_loc
4890 {
4891   /* The memory reference.  */
4892   tree ref;
4893
4894   /* True if the memory reference is read.  */
4895   bool is_read;
4896
4897   /* True if the data reference is conditional within the containing
4898      statement, i.e. if it might not occur even when the statement
4899      is executed and runs to completion.  */
4900   bool is_conditional_in_stmt;
4901 };
4902
4903
4904 /* Stores the locations of memory references in STMT to REFERENCES.  Returns
4905    true if STMT clobbers memory, false otherwise.  */
4906
4907 static bool
4908 get_references_in_stmt (gimple *stmt, vec<data_ref_loc, va_heap> *references)
4909 {
4910   bool clobbers_memory = false;
4911   data_ref_loc ref;
4912   tree op0, op1;
4913   enum gimple_code stmt_code = gimple_code (stmt);
4914
4915   /* ASM_EXPR and CALL_EXPR may embed arbitrary side effects.
4916      As we cannot model data-references to not spelled out
4917      accesses give up if they may occur.  */
4918   if (stmt_code == GIMPLE_CALL
4919       && !(gimple_call_flags (stmt) & ECF_CONST))
4920     {
4921       /* Allow IFN_GOMP_SIMD_LANE in their own loops.  */
4922       if (gimple_call_internal_p (stmt))
4923         switch (gimple_call_internal_fn (stmt))
4924           {
4925           case IFN_GOMP_SIMD_LANE:
4926             {
4927               struct loop *loop = gimple_bb (stmt)->loop_father;
4928               tree uid = gimple_call_arg (stmt, 0);
4929               gcc_assert (TREE_CODE (uid) == SSA_NAME);
4930               if (loop == NULL
4931                   || loop->simduid != SSA_NAME_VAR (uid))
4932                 clobbers_memory = true;
4933               break;
4934             }
4935           case IFN_MASK_LOAD:
4936           case IFN_MASK_STORE:
4937             break;
4938           default:
4939             clobbers_memory = true;
4940             break;
4941           }
4942       else
4943         clobbers_memory = true;
4944     }
4945   else if (stmt_code == GIMPLE_ASM
4946            && (gimple_asm_volatile_p (as_a <gasm *> (stmt))
4947                || gimple_vuse (stmt)))
4948     clobbers_memory = true;
4949
4950   if (!gimple_vuse (stmt))
4951     return clobbers_memory;
4952
4953   if (stmt_code == GIMPLE_ASSIGN)
4954     {
4955       tree base;
4956       op0 = gimple_assign_lhs (stmt);
4957       op1 = gimple_assign_rhs1 (stmt);
4958
4959       if (DECL_P (op1)
4960           || (REFERENCE_CLASS_P (op1)
4961               && (base = get_base_address (op1))
4962               && TREE_CODE (base) != SSA_NAME
4963               && !is_gimple_min_invariant (base)))
4964         {
4965           ref.ref = op1;
4966           ref.is_read = true;
4967           ref.is_conditional_in_stmt = false;
4968           references->safe_push (ref);
4969         }
4970     }
4971   else if (stmt_code == GIMPLE_CALL)
4972     {
4973       unsigned i, n;
4974       tree ptr, type;
4975       unsigned int align;
4976
4977       ref.is_read = false;
4978       if (gimple_call_internal_p (stmt))
4979         switch (gimple_call_internal_fn (stmt))
4980           {
4981           case IFN_MASK_LOAD:
4982             if (gimple_call_lhs (stmt) == NULL_TREE)
4983               break;
4984             ref.is_read = true;
4985             /* FALLTHRU */
4986           case IFN_MASK_STORE:
4987             ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)), 0);
4988             align = tree_to_shwi (gimple_call_arg (stmt, 1));
4989             if (ref.is_read)
4990               type = TREE_TYPE (gimple_call_lhs (stmt));
4991             else
4992               type = TREE_TYPE (gimple_call_arg (stmt, 3));
4993             if (TYPE_ALIGN (type) != align)
4994               type = build_aligned_type (type, align);
4995             ref.is_conditional_in_stmt = true;
4996             ref.ref = fold_build2 (MEM_REF, type, gimple_call_arg (stmt, 0),
4997                                    ptr);
4998             references->safe_push (ref);
4999             return false;
5000           default:
5001             break;
5002           }
5003
5004       op0 = gimple_call_lhs (stmt);
5005       n = gimple_call_num_args (stmt);
5006       for (i = 0; i < n; i++)
5007         {
5008           op1 = gimple_call_arg (stmt, i);
5009
5010           if (DECL_P (op1)
5011               || (REFERENCE_CLASS_P (op1) && get_base_address (op1)))
5012             {
5013               ref.ref = op1;
5014               ref.is_read = true;
5015               ref.is_conditional_in_stmt = false;
5016               references->safe_push (ref);
5017             }
5018         }
5019     }
5020   else
5021     return clobbers_memory;
5022
5023   if (op0
5024       && (DECL_P (op0)
5025           || (REFERENCE_CLASS_P (op0) && get_base_address (op0))))
5026     {
5027       ref.ref = op0;
5028       ref.is_read = false;
5029       ref.is_conditional_in_stmt = false;
5030       references->safe_push (ref);
5031     }
5032   return clobbers_memory;
5033 }
5034
5035
5036 /* Returns true if the loop-nest has any data reference.  */
5037
5038 bool
5039 loop_nest_has_data_refs (loop_p loop)
5040 {
5041   basic_block *bbs = get_loop_body (loop);
5042   auto_vec<data_ref_loc, 3> references;
5043
5044   for (unsigned i = 0; i < loop->num_nodes; i++)
5045     {
5046       basic_block bb = bbs[i];
5047       gimple_stmt_iterator bsi;
5048
5049       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
5050         {
5051           gimple *stmt = gsi_stmt (bsi);
5052           get_references_in_stmt (stmt, &references);
5053           if (references.length ())
5054             {
5055               free (bbs);
5056               return true;
5057             }
5058         }
5059     }
5060   free (bbs);
5061   return false;
5062 }
5063
5064 /* Stores the data references in STMT to DATAREFS.  If there is an unanalyzable
5065    reference, returns false, otherwise returns true.  NEST is the outermost
5066    loop of the loop nest in which the references should be analyzed.  */
5067
5068 bool
5069 find_data_references_in_stmt (struct loop *nest, gimple *stmt,
5070                               vec<data_reference_p> *datarefs)
5071 {
5072   unsigned i;
5073   auto_vec<data_ref_loc, 2> references;
5074   data_ref_loc *ref;
5075   bool ret = true;
5076   data_reference_p dr;
5077
5078   if (get_references_in_stmt (stmt, &references))
5079     return false;
5080
5081   FOR_EACH_VEC_ELT (references, i, ref)
5082     {
5083       dr = create_data_ref (nest ? loop_preheader_edge (nest) : NULL,
5084                             loop_containing_stmt (stmt), ref->ref,
5085                             stmt, ref->is_read, ref->is_conditional_in_stmt);
5086       gcc_assert (dr != NULL);
5087       datarefs->safe_push (dr);
5088     }
5089
5090   return ret;
5091 }
5092
5093 /* Stores the data references in STMT to DATAREFS.  If there is an
5094    unanalyzable reference, returns false, otherwise returns true.
5095    NEST is the outermost loop of the loop nest in which the references
5096    should be instantiated, LOOP is the loop in which the references
5097    should be analyzed.  */
5098
5099 bool
5100 graphite_find_data_references_in_stmt (edge nest, loop_p loop, gimple *stmt,
5101                                        vec<data_reference_p> *datarefs)
5102 {
5103   unsigned i;
5104   auto_vec<data_ref_loc, 2> references;
5105   data_ref_loc *ref;
5106   bool ret = true;
5107   data_reference_p dr;
5108
5109   if (get_references_in_stmt (stmt, &references))
5110     return false;
5111
5112   FOR_EACH_VEC_ELT (references, i, ref)
5113     {
5114       dr = create_data_ref (nest, loop, ref->ref, stmt, ref->is_read,
5115                             ref->is_conditional_in_stmt);
5116       gcc_assert (dr != NULL);
5117       datarefs->safe_push (dr);
5118     }
5119
5120   return ret;
5121 }
5122
5123 /* Search the data references in LOOP, and record the information into
5124    DATAREFS.  Returns chrec_dont_know when failing to analyze a
5125    difficult case, returns NULL_TREE otherwise.  */
5126
5127 tree
5128 find_data_references_in_bb (struct loop *loop, basic_block bb,
5129                             vec<data_reference_p> *datarefs)
5130 {
5131   gimple_stmt_iterator bsi;
5132
5133   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
5134     {
5135       gimple *stmt = gsi_stmt (bsi);
5136
5137       if (!find_data_references_in_stmt (loop, stmt, datarefs))
5138         {
5139           struct data_reference *res;
5140           res = XCNEW (struct data_reference);
5141           datarefs->safe_push (res);
5142
5143           return chrec_dont_know;
5144         }
5145     }
5146
5147   return NULL_TREE;
5148 }
5149
5150 /* Search the data references in LOOP, and record the information into
5151    DATAREFS.  Returns chrec_dont_know when failing to analyze a
5152    difficult case, returns NULL_TREE otherwise.
5153
5154    TODO: This function should be made smarter so that it can handle address
5155    arithmetic as if they were array accesses, etc.  */
5156
5157 tree
5158 find_data_references_in_loop (struct loop *loop,
5159                               vec<data_reference_p> *datarefs)
5160 {
5161   basic_block bb, *bbs;
5162   unsigned int i;
5163
5164   bbs = get_loop_body_in_dom_order (loop);
5165
5166   for (i = 0; i < loop->num_nodes; i++)
5167     {
5168       bb = bbs[i];
5169
5170       if (find_data_references_in_bb (loop, bb, datarefs) == chrec_dont_know)
5171         {
5172           free (bbs);
5173           return chrec_dont_know;
5174         }
5175     }
5176   free (bbs);
5177
5178   return NULL_TREE;
5179 }
5180
5181 /* Return the alignment in bytes that DRB is guaranteed to have at all
5182    times.  */
5183
5184 unsigned int
5185 dr_alignment (innermost_loop_behavior *drb)
5186 {
5187   /* Get the alignment of BASE_ADDRESS + INIT.  */
5188   unsigned int alignment = drb->base_alignment;
5189   unsigned int misalignment = (drb->base_misalignment
5190                                + TREE_INT_CST_LOW (drb->init));
5191   if (misalignment != 0)
5192     alignment = MIN (alignment, misalignment & -misalignment);
5193
5194   /* Cap it to the alignment of OFFSET.  */
5195   if (!integer_zerop (drb->offset))
5196     alignment = MIN (alignment, drb->offset_alignment);
5197
5198   /* Cap it to the alignment of STEP.  */
5199   if (!integer_zerop (drb->step))
5200     alignment = MIN (alignment, drb->step_alignment);
5201
5202   return alignment;
5203 }
5204
5205 /* If BASE is a pointer-typed SSA name, try to find the object that it
5206    is based on.  Return this object X on success and store the alignment
5207    in bytes of BASE - &X in *ALIGNMENT_OUT.  */
5208
5209 static tree
5210 get_base_for_alignment_1 (tree base, unsigned int *alignment_out)
5211 {
5212   if (TREE_CODE (base) != SSA_NAME || !POINTER_TYPE_P (TREE_TYPE (base)))
5213     return NULL_TREE;
5214
5215   gimple *def = SSA_NAME_DEF_STMT (base);
5216   base = analyze_scalar_evolution (loop_containing_stmt (def), base);
5217
5218   /* Peel chrecs and record the minimum alignment preserved by
5219      all steps.  */
5220   unsigned int alignment = MAX_OFILE_ALIGNMENT / BITS_PER_UNIT;
5221   while (TREE_CODE (base) == POLYNOMIAL_CHREC)
5222     {
5223       unsigned int step_alignment = highest_pow2_factor (CHREC_RIGHT (base));
5224       alignment = MIN (alignment, step_alignment);
5225       base = CHREC_LEFT (base);
5226     }
5227
5228   /* Punt if the expression is too complicated to handle.  */
5229   if (tree_contains_chrecs (base, NULL) || !POINTER_TYPE_P (TREE_TYPE (base)))
5230     return NULL_TREE;
5231
5232   /* The only useful cases are those for which a dereference folds to something
5233      other than an INDIRECT_REF.  */
5234   tree ref_type = TREE_TYPE (TREE_TYPE (base));
5235   tree ref = fold_indirect_ref_1 (UNKNOWN_LOCATION, ref_type, base);
5236   if (!ref)
5237     return NULL_TREE;
5238
5239   /* Analyze the base to which the steps we peeled were applied.  */
5240   poly_int64 bitsize, bitpos, bytepos;
5241   machine_mode mode;
5242   int unsignedp, reversep, volatilep;
5243   tree offset;
5244   base = get_inner_reference (ref, &bitsize, &bitpos, &offset, &mode,
5245                               &unsignedp, &reversep, &volatilep);
5246   if (!base || !multiple_p (bitpos, BITS_PER_UNIT, &bytepos))
5247     return NULL_TREE;
5248
5249   /* Restrict the alignment to that guaranteed by the offsets.  */
5250   unsigned int bytepos_alignment = known_alignment (bytepos);
5251   if (bytepos_alignment != 0)
5252     alignment = MIN (alignment, bytepos_alignment);
5253   if (offset)
5254     {
5255       unsigned int offset_alignment = highest_pow2_factor (offset);
5256       alignment = MIN (alignment, offset_alignment);
5257     }
5258
5259   *alignment_out = alignment;
5260   return base;
5261 }
5262
5263 /* Return the object whose alignment would need to be changed in order
5264    to increase the alignment of ADDR.  Store the maximum achievable
5265    alignment in *MAX_ALIGNMENT.  */
5266
5267 tree
5268 get_base_for_alignment (tree addr, unsigned int *max_alignment)
5269 {
5270   tree base = get_base_for_alignment_1 (addr, max_alignment);
5271   if (base)
5272     return base;
5273
5274   if (TREE_CODE (addr) == ADDR_EXPR)
5275     addr = TREE_OPERAND (addr, 0);
5276   *max_alignment = MAX_OFILE_ALIGNMENT / BITS_PER_UNIT;
5277   return addr;
5278 }
5279
5280 /* Recursive helper function.  */
5281
5282 static bool
5283 find_loop_nest_1 (struct loop *loop, vec<loop_p> *loop_nest)
5284 {
5285   /* Inner loops of the nest should not contain siblings.  Example:
5286      when there are two consecutive loops,
5287
5288      | loop_0
5289      |   loop_1
5290      |     A[{0, +, 1}_1]
5291      |   endloop_1
5292      |   loop_2
5293      |     A[{0, +, 1}_2]
5294      |   endloop_2
5295      | endloop_0
5296
5297      the dependence relation cannot be captured by the distance
5298      abstraction.  */
5299   if (loop->next)
5300     return false;
5301
5302   loop_nest->safe_push (loop);
5303   if (loop->inner)
5304     return find_loop_nest_1 (loop->inner, loop_nest);
5305   return true;
5306 }
5307
5308 /* Return false when the LOOP is not well nested.  Otherwise return
5309    true and insert in LOOP_NEST the loops of the nest.  LOOP_NEST will
5310    contain the loops from the outermost to the innermost, as they will
5311    appear in the classic distance vector.  */
5312
5313 bool
5314 find_loop_nest (struct loop *loop, vec<loop_p> *loop_nest)
5315 {
5316   loop_nest->safe_push (loop);
5317   if (loop->inner)
5318     return find_loop_nest_1 (loop->inner, loop_nest);
5319   return true;
5320 }
5321
5322 /* Returns true when the data dependences have been computed, false otherwise.
5323    Given a loop nest LOOP, the following vectors are returned:
5324    DATAREFS is initialized to all the array elements contained in this loop,
5325    DEPENDENCE_RELATIONS contains the relations between the data references.
5326    Compute read-read and self relations if
5327    COMPUTE_SELF_AND_READ_READ_DEPENDENCES is TRUE.  */
5328
5329 bool
5330 compute_data_dependences_for_loop (struct loop *loop,
5331                                    bool compute_self_and_read_read_dependences,
5332                                    vec<loop_p> *loop_nest,
5333                                    vec<data_reference_p> *datarefs,
5334                                    vec<ddr_p> *dependence_relations)
5335 {
5336   bool res = true;
5337
5338   memset (&dependence_stats, 0, sizeof (dependence_stats));
5339
5340   /* If the loop nest is not well formed, or one of the data references
5341      is not computable, give up without spending time to compute other
5342      dependences.  */
5343   if (!loop
5344       || !find_loop_nest (loop, loop_nest)
5345       || find_data_references_in_loop (loop, datarefs) == chrec_dont_know
5346       || !compute_all_dependences (*datarefs, dependence_relations, *loop_nest,
5347                                    compute_self_and_read_read_dependences))
5348     res = false;
5349
5350   if (dump_file && (dump_flags & TDF_STATS))
5351     {
5352       fprintf (dump_file, "Dependence tester statistics:\n");
5353
5354       fprintf (dump_file, "Number of dependence tests: %d\n",
5355                dependence_stats.num_dependence_tests);
5356       fprintf (dump_file, "Number of dependence tests classified dependent: %d\n",
5357                dependence_stats.num_dependence_dependent);
5358       fprintf (dump_file, "Number of dependence tests classified independent: %d\n",
5359                dependence_stats.num_dependence_independent);
5360       fprintf (dump_file, "Number of undetermined dependence tests: %d\n",
5361                dependence_stats.num_dependence_undetermined);
5362
5363       fprintf (dump_file, "Number of subscript tests: %d\n",
5364                dependence_stats.num_subscript_tests);
5365       fprintf (dump_file, "Number of undetermined subscript tests: %d\n",
5366                dependence_stats.num_subscript_undetermined);
5367       fprintf (dump_file, "Number of same subscript function: %d\n",
5368                dependence_stats.num_same_subscript_function);
5369
5370       fprintf (dump_file, "Number of ziv tests: %d\n",
5371                dependence_stats.num_ziv);
5372       fprintf (dump_file, "Number of ziv tests returning dependent: %d\n",
5373                dependence_stats.num_ziv_dependent);
5374       fprintf (dump_file, "Number of ziv tests returning independent: %d\n",
5375                dependence_stats.num_ziv_independent);
5376       fprintf (dump_file, "Number of ziv tests unimplemented: %d\n",
5377                dependence_stats.num_ziv_unimplemented);
5378
5379       fprintf (dump_file, "Number of siv tests: %d\n",
5380                dependence_stats.num_siv);
5381       fprintf (dump_file, "Number of siv tests returning dependent: %d\n",
5382                dependence_stats.num_siv_dependent);
5383       fprintf (dump_file, "Number of siv tests returning independent: %d\n",
5384                dependence_stats.num_siv_independent);
5385       fprintf (dump_file, "Number of siv tests unimplemented: %d\n",
5386                dependence_stats.num_siv_unimplemented);
5387
5388       fprintf (dump_file, "Number of miv tests: %d\n",
5389                dependence_stats.num_miv);
5390       fprintf (dump_file, "Number of miv tests returning dependent: %d\n",
5391                dependence_stats.num_miv_dependent);
5392       fprintf (dump_file, "Number of miv tests returning independent: %d\n",
5393                dependence_stats.num_miv_independent);
5394       fprintf (dump_file, "Number of miv tests unimplemented: %d\n",
5395                dependence_stats.num_miv_unimplemented);
5396     }
5397
5398   return res;
5399 }
5400
5401 /* Free the memory used by a data dependence relation DDR.  */
5402
5403 void
5404 free_dependence_relation (struct data_dependence_relation *ddr)
5405 {
5406   if (ddr == NULL)
5407     return;
5408
5409   if (DDR_SUBSCRIPTS (ddr).exists ())
5410     free_subscripts (DDR_SUBSCRIPTS (ddr));
5411   DDR_DIST_VECTS (ddr).release ();
5412   DDR_DIR_VECTS (ddr).release ();
5413
5414   free (ddr);
5415 }
5416
5417 /* Free the memory used by the data dependence relations from
5418    DEPENDENCE_RELATIONS.  */
5419
5420 void
5421 free_dependence_relations (vec<ddr_p> dependence_relations)
5422 {
5423   unsigned int i;
5424   struct data_dependence_relation *ddr;
5425
5426   FOR_EACH_VEC_ELT (dependence_relations, i, ddr)
5427     if (ddr)
5428       free_dependence_relation (ddr);
5429
5430   dependence_relations.release ();
5431 }
5432
5433 /* Free the memory used by the data references from DATAREFS.  */
5434
5435 void
5436 free_data_refs (vec<data_reference_p> datarefs)
5437 {
5438   unsigned int i;
5439   struct data_reference *dr;
5440
5441   FOR_EACH_VEC_ELT (datarefs, i, dr)
5442     free_data_ref (dr);
5443   datarefs.release ();
5444 }
5445
5446 /* Common routine implementing both dr_direction_indicator and
5447    dr_zero_step_indicator.  Return USEFUL_MIN if the indicator is known
5448    to be >= USEFUL_MIN and -1 if the indicator is known to be negative.
5449    Return the step as the indicator otherwise.  */
5450
5451 static tree
5452 dr_step_indicator (struct data_reference *dr, int useful_min)
5453 {
5454   tree step = DR_STEP (dr);
5455   STRIP_NOPS (step);
5456   /* Look for cases where the step is scaled by a positive constant
5457      integer, which will often be the access size.  If the multiplication
5458      doesn't change the sign (due to overflow effects) then we can
5459      test the unscaled value instead.  */
5460   if (TREE_CODE (step) == MULT_EXPR
5461       && TREE_CODE (TREE_OPERAND (step, 1)) == INTEGER_CST
5462       && tree_int_cst_sgn (TREE_OPERAND (step, 1)) > 0)
5463     {
5464       tree factor = TREE_OPERAND (step, 1);
5465       step = TREE_OPERAND (step, 0);
5466
5467       /* Strip widening and truncating conversions as well as nops.  */
5468       if (CONVERT_EXPR_P (step)
5469           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (step, 0))))
5470         step = TREE_OPERAND (step, 0);
5471       tree type = TREE_TYPE (step);
5472
5473       /* Get the range of step values that would not cause overflow.  */
5474       widest_int minv = (wi::to_widest (TYPE_MIN_VALUE (ssizetype))
5475                          / wi::to_widest (factor));
5476       widest_int maxv = (wi::to_widest (TYPE_MAX_VALUE (ssizetype))
5477                          / wi::to_widest (factor));
5478
5479       /* Get the range of values that the unconverted step actually has.  */
5480       wide_int step_min, step_max;
5481       if (TREE_CODE (step) != SSA_NAME
5482           || get_range_info (step, &step_min, &step_max) != VR_RANGE)
5483         {
5484           step_min = wi::to_wide (TYPE_MIN_VALUE (type));
5485           step_max = wi::to_wide (TYPE_MAX_VALUE (type));
5486         }
5487
5488       /* Check whether the unconverted step has an acceptable range.  */
5489       signop sgn = TYPE_SIGN (type);
5490       if (wi::les_p (minv, widest_int::from (step_min, sgn))
5491           && wi::ges_p (maxv, widest_int::from (step_max, sgn)))
5492         {
5493           if (wi::ge_p (step_min, useful_min, sgn))
5494             return ssize_int (useful_min);
5495           else if (wi::lt_p (step_max, 0, sgn))
5496             return ssize_int (-1);
5497           else
5498             return fold_convert (ssizetype, step);
5499         }
5500     }
5501   return DR_STEP (dr);
5502 }
5503
5504 /* Return a value that is negative iff DR has a negative step.  */
5505
5506 tree
5507 dr_direction_indicator (struct data_reference *dr)
5508 {
5509   return dr_step_indicator (dr, 0);
5510 }
5511
5512 /* Return a value that is zero iff DR has a zero step.  */
5513
5514 tree
5515 dr_zero_step_indicator (struct data_reference *dr)
5516 {
5517   return dr_step_indicator (dr, 1);
5518 }
5519
5520 /* Return true if DR is known to have a nonnegative (but possibly zero)
5521    step.  */
5522
5523 bool
5524 dr_known_forward_stride_p (struct data_reference *dr)
5525 {
5526   tree indicator = dr_direction_indicator (dr);
5527   tree neg_step_val = fold_binary (LT_EXPR, boolean_type_node,
5528                                    fold_convert (ssizetype, indicator),
5529                                    ssize_int (0));
5530   return neg_step_val && integer_zerop (neg_step_val);
5531 }