xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/graphite-scop-detection.c (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /* Detection of Static Control Parts (SCoP) for Graphite.
2    Copyright (C) 2009-2019 Free Software Foundation, Inc.
3    Contributed by Sebastian Pop <sebastian.pop@amd.com> and
4    Tobias Grosser <grosser@fim.uni-passau.de>.
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12 
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 #define USES_ISL
23 
24 #include "config.h"
25 
26 #ifdef HAVE_isl
27 
28 #include "system.h"
29 #include "coretypes.h"
30 #include "backend.h"
31 #include "cfghooks.h"
32 #include "domwalk.h"
33 #include "params.h"
34 #include "tree.h"
35 #include "gimple.h"
36 #include "ssa.h"
37 #include "fold-const.h"
38 #include "gimple-iterator.h"
39 #include "tree-cfg.h"
40 #include "tree-ssa-loop-manip.h"
41 #include "tree-ssa-loop-niter.h"
42 #include "tree-ssa-loop.h"
43 #include "tree-into-ssa.h"
44 #include "tree-ssa.h"
45 #include "cfgloop.h"
46 #include "tree-data-ref.h"
47 #include "tree-scalar-evolution.h"
48 #include "tree-pass.h"
49 #include "tree-ssa-propagate.h"
50 #include "gimple-pretty-print.h"
51 #include "cfganal.h"
52 #include "graphite.h"
53 
54 class debug_printer
55 {
56 private:
57   FILE *dump_file;
58 
59 public:
60   void
61   set_dump_file (FILE *f)
62   {
63     gcc_assert (f);
64     dump_file = f;
65   }
66 
67   friend debug_printer &
68   operator<< (debug_printer &output, int i)
69   {
70     fprintf (output.dump_file, "%d", i);
71     return output;
72   }
73   friend debug_printer &
74   operator<< (debug_printer &output, const char *s)
75   {
76     fprintf (output.dump_file, "%s", s);
77     return output;
78   }
79 } dp;
80 
81 #define DEBUG_PRINT(args) do \
82     {								\
83       if (dump_file && (dump_flags & TDF_DETAILS)) { args; }	\
84     } while (0)
85 
86 /* Pretty print to FILE all the SCoPs in DOT format and mark them with
87    different colors.  If there are not enough colors, paint the
88    remaining SCoPs in gray.
89 
90    Special nodes:
91    - "*" after the node number denotes the entry of a SCoP,
92    - "#" after the node number denotes the exit of a SCoP,
93    - "()" around the node number denotes the entry or the
94      exit nodes of the SCOP.  These are not part of SCoP.  */
95 
96 DEBUG_FUNCTION void
97 dot_all_sese (FILE *file, vec<sese_l>& scops)
98 {
99   /* Disable debugging while printing graph.  */
100   dump_flags_t tmp_dump_flags = dump_flags;
101   dump_flags = TDF_NONE;
102 
103   fprintf (file, "digraph all {\n");
104 
105   basic_block bb;
106   FOR_ALL_BB_FN (bb, cfun)
107     {
108       int part_of_scop = false;
109 
110       /* Use HTML for every bb label.  So we are able to print bbs
111 	 which are part of two different SCoPs, with two different
112 	 background colors.  */
113       fprintf (file, "%d [label=<\n  <TABLE BORDER=\"0\" CELLBORDER=\"1\" ",
114 	       bb->index);
115       fprintf (file, "CELLSPACING=\"0\">\n");
116 
117       /* Select color for SCoP.  */
118       sese_l *region;
119       int i;
120       FOR_EACH_VEC_ELT (scops, i, region)
121 	{
122 	  bool sese_in_region = bb_in_sese_p (bb, *region);
123 	  if (sese_in_region || (region->exit->dest == bb)
124 	      || (region->entry->dest == bb))
125 	    {
126 	      const char *color;
127 	      switch (i % 17)
128 		{
129 		case 0: /* red */
130 		  color = "#e41a1c";
131 		  break;
132 		case 1: /* blue */
133 		  color = "#377eb8";
134 		  break;
135 		case 2: /* green */
136 		  color = "#4daf4a";
137 		  break;
138 		case 3: /* purple */
139 		  color = "#984ea3";
140 		  break;
141 		case 4: /* orange */
142 		  color = "#ff7f00";
143 		  break;
144 		case 5: /* yellow */
145 		  color = "#ffff33";
146 		  break;
147 		case 6: /* brown */
148 		  color = "#a65628";
149 		  break;
150 		case 7: /* rose */
151 		  color = "#f781bf";
152 		  break;
153 		case 8:
154 		  color = "#8dd3c7";
155 		  break;
156 		case 9:
157 		  color = "#ffffb3";
158 		  break;
159 		case 10:
160 		  color = "#bebada";
161 		  break;
162 		case 11:
163 		  color = "#fb8072";
164 		  break;
165 		case 12:
166 		  color = "#80b1d3";
167 		  break;
168 		case 13:
169 		  color = "#fdb462";
170 		  break;
171 		case 14:
172 		  color = "#b3de69";
173 		  break;
174 		case 15:
175 		  color = "#fccde5";
176 		  break;
177 		case 16:
178 		  color = "#bc80bd";
179 		  break;
180 		default: /* gray */
181 		  color = "#999999";
182 		}
183 
184 	      fprintf (file, "    <TR><TD WIDTH=\"50\" BGCOLOR=\"%s\">",
185 		       color);
186 
187 	      if (!sese_in_region)
188 		fprintf (file, " (");
189 
190 	      if (bb == region->entry->dest && bb == region->exit->dest)
191 		fprintf (file, " %d*# ", bb->index);
192 	      else if (bb == region->entry->dest)
193 		fprintf (file, " %d* ", bb->index);
194 	      else if (bb == region->exit->dest)
195 		fprintf (file, " %d# ", bb->index);
196 	      else
197 		fprintf (file, " %d ", bb->index);
198 
199 	      fprintf (file, "{lp_%d}", bb->loop_father->num);
200 
201 	      if (!sese_in_region)
202 		fprintf (file, ")");
203 
204 	      fprintf (file, "</TD></TR>\n");
205 	      part_of_scop = true;
206 	    }
207 	}
208 
209 	if (!part_of_scop)
210 	  {
211 	    fprintf (file, "    <TR><TD WIDTH=\"50\" BGCOLOR=\"#ffffff\">");
212 	    fprintf (file, " %d {lp_%d} </TD></TR>\n", bb->index,
213 		     bb->loop_father->num);
214 	  }
215 	fprintf (file, "  </TABLE>>, shape=box, style=\"setlinewidth(0)\"]\n");
216     }
217 
218     FOR_ALL_BB_FN (bb, cfun)
219       {
220 	edge e;
221 	edge_iterator ei;
222 	FOR_EACH_EDGE (e, ei, bb->succs)
223 	  fprintf (file, "%d -> %d;\n", bb->index, e->dest->index);
224       }
225 
226   fputs ("}\n\n", file);
227 
228   /* Enable debugging again.  */
229   dump_flags = tmp_dump_flags;
230 }
231 
232 /* Display SCoP on stderr.  */
233 
234 DEBUG_FUNCTION void
235 dot_sese (sese_l& scop)
236 {
237   vec<sese_l> scops;
238   scops.create (1);
239 
240   if (scop)
241     scops.safe_push (scop);
242 
243   dot_all_sese (stderr, scops);
244 
245   scops.release ();
246 }
247 
248 DEBUG_FUNCTION void
249 dot_cfg ()
250 {
251   vec<sese_l> scops;
252   scops.create (1);
253   dot_all_sese (stderr, scops);
254   scops.release ();
255 }
256 
257 /* Returns a COND_EXPR statement when BB has a single predecessor, the
258    edge between BB and its predecessor is not a loop exit edge, and
259    the last statement of the single predecessor is a COND_EXPR.  */
260 
261 static gcond *
262 single_pred_cond_non_loop_exit (basic_block bb)
263 {
264   if (single_pred_p (bb))
265     {
266       edge e = single_pred_edge (bb);
267       basic_block pred = e->src;
268       gimple *stmt;
269 
270       if (loop_depth (pred->loop_father) > loop_depth (bb->loop_father))
271 	return NULL;
272 
273       stmt = last_stmt (pred);
274 
275       if (stmt && gimple_code (stmt) == GIMPLE_COND)
276 	return as_a<gcond *> (stmt);
277     }
278 
279   return NULL;
280 }
281 
282 namespace
283 {
284 
285 /* Build the maximal scop containing LOOPs and add it to SCOPS.  */
286 
287 class scop_detection
288 {
289 public:
290   scop_detection () : scops (vNULL) {}
291 
292   ~scop_detection ()
293   {
294     scops.release ();
295   }
296 
297   /* A marker for invalid sese_l.  */
298   static sese_l invalid_sese;
299 
300   /* Return the SCOPS in this SCOP_DETECTION.  */
301 
302   vec<sese_l>
303   get_scops ()
304   {
305     return scops;
306   }
307 
308   /* Return an sese_l around the LOOP.  */
309 
310   sese_l get_sese (loop_p loop);
311 
312   /* Merge scops at same loop depth and returns the new sese.
313      Returns a new SESE when merge was successful, INVALID_SESE otherwise.  */
314 
315   sese_l merge_sese (sese_l first, sese_l second) const;
316 
317   /* Build scop outer->inner if possible.  */
318 
319   void build_scop_depth (loop_p loop);
320 
321   /* Return true when BEGIN is the preheader edge of a loop with a single exit
322      END.  */
323 
324   static bool region_has_one_loop (sese_l s);
325 
326   /* Add to SCOPS a scop starting at SCOP_BEGIN and ending at SCOP_END.  */
327 
328   void add_scop (sese_l s);
329 
330   /* Returns true if S1 subsumes/surrounds S2.  */
331   static bool subsumes (sese_l s1, sese_l s2);
332 
333   /* Remove a SCoP which is subsumed by S1.  */
334   void remove_subscops (sese_l s1);
335 
336   /* Returns true if S1 intersects with S2.  Since we already know that S1 does
337      not subsume S2 or vice-versa, we only check for entry bbs.  */
338 
339   static bool intersects (sese_l s1, sese_l s2);
340 
341   /* Remove one of the scops when it intersects with any other.  */
342 
343   void remove_intersecting_scops (sese_l s1);
344 
345   /* Return true when a statement in SCOP cannot be represented by Graphite.  */
346 
347   bool harmful_loop_in_region (sese_l scop) const;
348 
349   /* Return true only when STMT is simple enough for being handled by Graphite.
350      This depends on SCOP, as the parameters are initialized relatively to
351      this basic block, the linear functions are initialized based on the
352      outermost loop containing STMT inside the SCOP.  BB is the place where we
353      try to evaluate the STMT.  */
354 
355   bool stmt_simple_for_scop_p (sese_l scop, gimple *stmt,
356 			       basic_block bb) const;
357 
358   /* Something like "n * m" is not allowed.  */
359 
360   static bool graphite_can_represent_init (tree e);
361 
362   /* Return true when SCEV can be represented in the polyhedral model.
363 
364      An expression can be represented, if it can be expressed as an
365      affine expression.  For loops (i, j) and parameters (m, n) all
366      affine expressions are of the form:
367 
368      x1 * i + x2 * j + x3 * m + x4 * n + x5 * 1 where x1..x5 element of Z
369 
370      1 i + 20 j + (-2) m + 25
371 
372      Something like "i * n" or "n * m" is not allowed.  */
373 
374   static bool graphite_can_represent_scev (sese_l scop, tree scev);
375 
376   /* Return true when EXPR can be represented in the polyhedral model.
377 
378      This means an expression can be represented, if it is linear with respect
379      to the loops and the strides are non parametric.  LOOP is the place where
380      the expr will be evaluated.  SCOP defines the region we analyse.  */
381 
382   static bool graphite_can_represent_expr (sese_l scop, loop_p loop,
383 					   tree expr);
384 
385   /* Return true if the data references of STMT can be represented by Graphite.
386      We try to analyze the data references in a loop contained in the SCOP.  */
387 
388   static bool stmt_has_simple_data_refs_p (sese_l scop, gimple *stmt);
389 
390   /* Remove the close phi node at GSI and replace its rhs with the rhs
391      of PHI.  */
392 
393   static void remove_duplicate_close_phi (gphi *phi, gphi_iterator *gsi);
394 
395   /* Returns true when Graphite can represent LOOP in SCOP.
396      FIXME: For the moment, graphite cannot be used on loops that iterate using
397      induction variables that wrap.  */
398 
399   static bool can_represent_loop (loop_p loop, sese_l scop);
400 
401   /* Returns the number of pbbs that are in loops contained in SCOP.  */
402 
403   static int nb_pbbs_in_loops (scop_p scop);
404 
405 private:
406   vec<sese_l> scops;
407 };
408 
409 sese_l scop_detection::invalid_sese (NULL, NULL);
410 
411 /* Return an sese_l around the LOOP.  */
412 
413 sese_l
414 scop_detection::get_sese (loop_p loop)
415 {
416   if (!loop)
417     return invalid_sese;
418 
419   edge scop_begin = loop_preheader_edge (loop);
420   edge scop_end = single_exit (loop);
421   if (!scop_end || (scop_end->flags & (EDGE_COMPLEX|EDGE_FAKE)))
422     return invalid_sese;
423 
424   return sese_l (scop_begin, scop_end);
425 }
426 
427 /* Merge scops at same loop depth and returns the new sese.
428    Returns a new SESE when merge was successful, INVALID_SESE otherwise.  */
429 
430 sese_l
431 scop_detection::merge_sese (sese_l first, sese_l second) const
432 {
433   /* In the trivial case first/second may be NULL.  */
434   if (!first)
435     return second;
436   if (!second)
437     return first;
438 
439   DEBUG_PRINT (dp << "[scop-detection] try merging sese s1: ";
440 	       print_sese (dump_file, first);
441 	       dp << "[scop-detection] try merging sese s2: ";
442 	       print_sese (dump_file, second));
443 
444   auto_bitmap worklist, in_sese_region;
445   bitmap_set_bit (worklist, get_entry_bb (first)->index);
446   bitmap_set_bit (worklist, get_exit_bb (first)->index);
447   bitmap_set_bit (worklist, get_entry_bb (second)->index);
448   bitmap_set_bit (worklist, get_exit_bb (second)->index);
449   edge entry = NULL, exit = NULL;
450 
451   /* We can optimize the case of adding a loop entry dest or exit
452      src to the worklist (for single-exit loops) by skipping
453      directly to the exit dest / entry src.  in_sese_region
454      doesn't have to cover all blocks in the region but merely
455      its border it acts more like a visited bitmap.  */
456   do
457     {
458       int index = bitmap_first_set_bit (worklist);
459       bitmap_clear_bit (worklist, index);
460       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, index);
461       edge_iterator ei;
462       edge e;
463 
464       /* With fake exit edges we can end up with no possible exit.  */
465       if (index == EXIT_BLOCK)
466 	{
467 	  DEBUG_PRINT (dp << "[scop-detection-fail] cannot merge seses.\n");
468 	  return invalid_sese;
469 	}
470 
471       bitmap_set_bit (in_sese_region, bb->index);
472 
473       basic_block dom = get_immediate_dominator (CDI_DOMINATORS, bb);
474       FOR_EACH_EDGE (e, ei, bb->preds)
475 	if (e->src == dom
476 	    && (! entry
477 		|| dominated_by_p (CDI_DOMINATORS, entry->dest, bb)))
478 	  {
479 	    if (entry
480 		&& ! bitmap_bit_p (in_sese_region, entry->src->index))
481 	      bitmap_set_bit (worklist, entry->src->index);
482 	    entry = e;
483 	  }
484 	else if (! bitmap_bit_p (in_sese_region, e->src->index))
485 	  bitmap_set_bit (worklist, e->src->index);
486 
487       basic_block pdom = get_immediate_dominator (CDI_POST_DOMINATORS, bb);
488       FOR_EACH_EDGE (e, ei, bb->succs)
489 	if (e->dest == pdom
490 	    && (! exit
491 		|| dominated_by_p (CDI_POST_DOMINATORS, exit->src, bb)))
492 	  {
493 	    if (exit
494 		&& ! bitmap_bit_p (in_sese_region, exit->dest->index))
495 	      bitmap_set_bit (worklist, exit->dest->index);
496 	    exit = e;
497 	  }
498 	else if (! bitmap_bit_p (in_sese_region, e->dest->index))
499 	  bitmap_set_bit (worklist, e->dest->index);
500     }
501   while (! bitmap_empty_p (worklist));
502 
503   sese_l combined (entry, exit);
504 
505   DEBUG_PRINT (dp << "[merged-sese] s1: "; print_sese (dump_file, combined));
506 
507   return combined;
508 }
509 
510 /* Build scop outer->inner if possible.  */
511 
512 void
513 scop_detection::build_scop_depth (loop_p loop)
514 {
515   sese_l s = invalid_sese;
516   loop = loop->inner;
517   while (loop)
518     {
519       sese_l next = get_sese (loop);
520       if (! next
521 	  || harmful_loop_in_region (next))
522 	{
523 	  if (s)
524 	    add_scop (s);
525 	  build_scop_depth (loop);
526 	  s = invalid_sese;
527 	}
528       else if (! s)
529 	s = next;
530       else
531 	{
532 	  sese_l combined = merge_sese (s, next);
533 	  if (! combined
534 	      || harmful_loop_in_region (combined))
535 	    {
536 	      add_scop (s);
537 	      s = next;
538 	    }
539 	  else
540 	    s = combined;
541 	}
542       loop = loop->next;
543     }
544   if (s)
545     add_scop (s);
546 }
547 
548 /* Returns true when Graphite can represent LOOP in SCOP.
549    FIXME: For the moment, graphite cannot be used on loops that iterate using
550    induction variables that wrap.  */
551 
552 bool
553 scop_detection::can_represent_loop (loop_p loop, sese_l scop)
554 {
555   tree niter;
556   struct tree_niter_desc niter_desc;
557 
558   /* We can only handle do {} while () style loops correctly.  */
559   edge exit = single_exit (loop);
560   if (!exit
561       || !single_pred_p (loop->latch)
562       || exit->src != single_pred (loop->latch)
563       || !empty_block_p (loop->latch))
564     return false;
565 
566   return !(loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)
567     && number_of_iterations_exit (loop, single_exit (loop), &niter_desc, false)
568     && niter_desc.control.no_overflow
569     && (niter = number_of_latch_executions (loop))
570     && !chrec_contains_undetermined (niter)
571     && graphite_can_represent_expr (scop, loop, niter);
572 }
573 
574 /* Return true when BEGIN is the preheader edge of a loop with a single exit
575    END.  */
576 
577 bool
578 scop_detection::region_has_one_loop (sese_l s)
579 {
580   edge begin = s.entry;
581   edge end = s.exit;
582   /* Check for a single perfectly nested loop.  */
583   if (begin->dest->loop_father->inner)
584     return false;
585 
586   /* Otherwise, check whether we have adjacent loops.  */
587   return (single_pred_p (end->src)
588 	  && begin->dest->loop_father == single_pred (end->src)->loop_father);
589 }
590 
591 /* Add to SCOPS a scop starting at SCOP_BEGIN and ending at SCOP_END.  */
592 
593 void
594 scop_detection::add_scop (sese_l s)
595 {
596   gcc_assert (s);
597 
598   /* If the exit edge is fake discard the SCoP for now as we're removing the
599      fake edges again after analysis.  */
600   if (s.exit->flags & EDGE_FAKE)
601     {
602       DEBUG_PRINT (dp << "[scop-detection-fail] Discarding infinite loop SCoP: ";
603 		   print_sese (dump_file, s));
604       return;
605     }
606 
607   /* Include the BB with the loop-closed SSA PHI nodes, we need this
608      block in the region for code-generating out-of-SSA copies.
609      canonicalize_loop_closed_ssa makes sure that is in proper shape.  */
610   if (s.exit->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
611       && loop_exit_edge_p (s.exit->src->loop_father, s.exit))
612     {
613       gcc_assert (single_pred_p (s.exit->dest)
614 		  && single_succ_p (s.exit->dest)
615 		  && sese_trivially_empty_bb_p (s.exit->dest));
616       s.exit = single_succ_edge (s.exit->dest);
617     }
618 
619   /* Do not add scops with only one loop.  */
620   if (region_has_one_loop (s))
621     {
622       DEBUG_PRINT (dp << "[scop-detection-fail] Discarding one loop SCoP: ";
623 		   print_sese (dump_file, s));
624       return;
625     }
626 
627   if (get_exit_bb (s) == EXIT_BLOCK_PTR_FOR_FN (cfun))
628     {
629       DEBUG_PRINT (dp << "[scop-detection-fail] "
630 		      << "Discarding SCoP exiting to return: ";
631 		   print_sese (dump_file, s));
632       return;
633     }
634 
635   /* Remove all the scops which are subsumed by s.  */
636   remove_subscops (s);
637 
638   /* Remove intersecting scops. FIXME: It will be a good idea to keep
639      the non-intersecting part of the scop already in the list.  */
640   remove_intersecting_scops (s);
641 
642   scops.safe_push (s);
643   DEBUG_PRINT (dp << "[scop-detection] Adding SCoP: "; print_sese (dump_file, s));
644 }
645 
646 /* Return true when a statement in SCOP cannot be represented by Graphite.  */
647 
648 bool
649 scop_detection::harmful_loop_in_region (sese_l scop) const
650 {
651   basic_block exit_bb = get_exit_bb (scop);
652   basic_block entry_bb = get_entry_bb (scop);
653 
654   DEBUG_PRINT (dp << "[checking-harmful-bbs] ";
655 	       print_sese (dump_file, scop));
656   gcc_assert (dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb));
657 
658   auto_vec<basic_block> worklist;
659   auto_bitmap loops;
660 
661   worklist.safe_push (entry_bb);
662   while (! worklist.is_empty ())
663     {
664       basic_block bb = worklist.pop ();
665       DEBUG_PRINT (dp << "Visiting bb_" << bb->index << "\n");
666 
667       /* The basic block should not be part of an irreducible loop.  */
668       if (bb->flags & BB_IRREDUCIBLE_LOOP)
669 	return true;
670 
671       /* Check for unstructured control flow: CFG not generated by structured
672 	 if-then-else.  */
673       if (bb->succs->length () > 1)
674 	{
675 	  edge e;
676 	  edge_iterator ei;
677 	  FOR_EACH_EDGE (e, ei, bb->succs)
678 	    if (!dominated_by_p (CDI_POST_DOMINATORS, bb, e->dest)
679 		&& !dominated_by_p (CDI_DOMINATORS, e->dest, bb))
680 	      return true;
681 	}
682 
683       /* Collect all loops in the current region.  */
684       loop_p loop = bb->loop_father;
685       if (loop_in_sese_p (loop, scop))
686 	bitmap_set_bit (loops, loop->num);
687 
688       /* Check for harmful statements in basic blocks part of the region.  */
689       for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
690 	   !gsi_end_p (gsi); gsi_next (&gsi))
691 	if (!stmt_simple_for_scop_p (scop, gsi_stmt (gsi), bb))
692 	  return true;
693 
694       for (basic_block dom = first_dom_son (CDI_DOMINATORS, bb);
695 	   dom;
696 	   dom = next_dom_son (CDI_DOMINATORS, dom))
697 	if (dom != scop.exit->dest)
698 	  worklist.safe_push (dom);
699     }
700 
701   /* Go through all loops and check that they are still valid in the combined
702      scop.  */
703   unsigned j;
704   bitmap_iterator bi;
705   EXECUTE_IF_SET_IN_BITMAP (loops, 0, j, bi)
706     {
707       loop_p loop = (*current_loops->larray)[j];
708       gcc_assert (loop->num == (int) j);
709 
710       /* Check if the loop nests are to be optimized for speed.  */
711       if (! loop->inner
712 	  && ! optimize_loop_for_speed_p (loop))
713 	{
714 	  DEBUG_PRINT (dp << "[scop-detection-fail] loop_"
715 		       << loop->num << " is not on a hot path.\n");
716 	  return true;
717 	}
718 
719       if (! can_represent_loop (loop, scop))
720 	{
721 	  DEBUG_PRINT (dp << "[scop-detection-fail] cannot represent loop_"
722 		       << loop->num << "\n");
723 	  return true;
724 	}
725 
726       /* Check if all loop nests have at least one data reference.
727 	 ???  This check is expensive and loops premature at this point.
728 	 If important to retain we can pre-compute this for all innermost
729 	 loops and reject those when we build a SESE region for a loop
730 	 during SESE discovery.  */
731       if (! loop->inner
732 	  && ! loop_nest_has_data_refs (loop))
733 	{
734 	  DEBUG_PRINT (dp << "[scop-detection-fail] loop_" << loop->num
735 		       << "does not have any data reference.\n");
736 	  return true;
737 	}
738     }
739 
740   return false;
741 }
742 
743 /* Returns true if S1 subsumes/surrounds S2.  */
744 bool
745 scop_detection::subsumes (sese_l s1, sese_l s2)
746 {
747   if (dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2),
748 		      get_entry_bb (s1))
749       && dominated_by_p (CDI_POST_DOMINATORS, s2.exit->dest,
750 			 s1.exit->dest))
751     return true;
752   return false;
753 }
754 
755 /* Remove a SCoP which is subsumed by S1.  */
756 void
757 scop_detection::remove_subscops (sese_l s1)
758 {
759   int j;
760   sese_l *s2;
761   FOR_EACH_VEC_ELT_REVERSE (scops, j, s2)
762     {
763       if (subsumes (s1, *s2))
764 	{
765 	  DEBUG_PRINT (dp << "Removing sub-SCoP";
766 		       print_sese (dump_file, *s2));
767 	  scops.unordered_remove (j);
768 	}
769     }
770 }
771 
772 /* Returns true if S1 intersects with S2.  Since we already know that S1 does
773    not subsume S2 or vice-versa, we only check for entry bbs.  */
774 
775 bool
776 scop_detection::intersects (sese_l s1, sese_l s2)
777 {
778   if (dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2),
779 		      get_entry_bb (s1))
780       && !dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2),
781 			  get_exit_bb (s1)))
782     return true;
783   if ((s1.exit == s2.entry) || (s2.exit == s1.entry))
784     return true;
785 
786   return false;
787 }
788 
789 /* Remove one of the scops when it intersects with any other.  */
790 
791 void
792 scop_detection::remove_intersecting_scops (sese_l s1)
793 {
794   int j;
795   sese_l *s2;
796   FOR_EACH_VEC_ELT_REVERSE (scops, j, s2)
797     {
798       if (intersects (s1, *s2))
799 	{
800 	  DEBUG_PRINT (dp << "Removing intersecting SCoP";
801 		       print_sese (dump_file, *s2);
802 		       dp << "Intersects with:";
803 		       print_sese (dump_file, s1));
804 	  scops.unordered_remove (j);
805 	}
806     }
807 }
808 
809 /* Something like "n * m" is not allowed.  */
810 
811 bool
812 scop_detection::graphite_can_represent_init (tree e)
813 {
814   switch (TREE_CODE (e))
815     {
816     case POLYNOMIAL_CHREC:
817       return graphite_can_represent_init (CHREC_LEFT (e))
818 	&& graphite_can_represent_init (CHREC_RIGHT (e));
819 
820     case MULT_EXPR:
821       if (chrec_contains_symbols (TREE_OPERAND (e, 0)))
822 	return graphite_can_represent_init (TREE_OPERAND (e, 0))
823 	  && tree_fits_shwi_p (TREE_OPERAND (e, 1));
824       else
825 	return graphite_can_represent_init (TREE_OPERAND (e, 1))
826 	  && tree_fits_shwi_p (TREE_OPERAND (e, 0));
827 
828     case PLUS_EXPR:
829     case POINTER_PLUS_EXPR:
830     case MINUS_EXPR:
831       return graphite_can_represent_init (TREE_OPERAND (e, 0))
832 	&& graphite_can_represent_init (TREE_OPERAND (e, 1));
833 
834     case NEGATE_EXPR:
835     case BIT_NOT_EXPR:
836     CASE_CONVERT:
837     case NON_LVALUE_EXPR:
838       return graphite_can_represent_init (TREE_OPERAND (e, 0));
839 
840     default:
841       break;
842     }
843 
844   return true;
845 }
846 
847 /* Return true when SCEV can be represented in the polyhedral model.
848 
849    An expression can be represented, if it can be expressed as an
850    affine expression.  For loops (i, j) and parameters (m, n) all
851    affine expressions are of the form:
852 
853    x1 * i + x2 * j + x3 * m + x4 * n + x5 * 1 where x1..x5 element of Z
854 
855    1 i + 20 j + (-2) m + 25
856 
857    Something like "i * n" or "n * m" is not allowed.  */
858 
859 bool
860 scop_detection::graphite_can_represent_scev (sese_l scop, tree scev)
861 {
862   if (chrec_contains_undetermined (scev))
863     return false;
864 
865   switch (TREE_CODE (scev))
866     {
867     case NEGATE_EXPR:
868     case BIT_NOT_EXPR:
869     CASE_CONVERT:
870     case NON_LVALUE_EXPR:
871       return graphite_can_represent_scev (scop, TREE_OPERAND (scev, 0));
872 
873     case PLUS_EXPR:
874     case POINTER_PLUS_EXPR:
875     case MINUS_EXPR:
876       return graphite_can_represent_scev (scop, TREE_OPERAND (scev, 0))
877 	&& graphite_can_represent_scev (scop, TREE_OPERAND (scev, 1));
878 
879     case MULT_EXPR:
880       return !CONVERT_EXPR_CODE_P (TREE_CODE (TREE_OPERAND (scev, 0)))
881 	&& !CONVERT_EXPR_CODE_P (TREE_CODE (TREE_OPERAND (scev, 1)))
882 	&& !(chrec_contains_symbols (TREE_OPERAND (scev, 0))
883 	     && chrec_contains_symbols (TREE_OPERAND (scev, 1)))
884 	&& graphite_can_represent_init (scev)
885 	&& graphite_can_represent_scev (scop, TREE_OPERAND (scev, 0))
886 	&& graphite_can_represent_scev (scop, TREE_OPERAND (scev, 1));
887 
888     case POLYNOMIAL_CHREC:
889       /* Check for constant strides.  With a non constant stride of
890 	 'n' we would have a value of 'iv * n'.  Also check that the
891 	 initial value can represented: for example 'n * m' cannot be
892 	 represented.  */
893       gcc_assert (loop_in_sese_p (get_loop (cfun,
894 					    CHREC_VARIABLE (scev)), scop));
895       if (!evolution_function_right_is_integer_cst (scev)
896 	  || !graphite_can_represent_init (scev))
897 	return false;
898       return graphite_can_represent_scev (scop, CHREC_LEFT (scev));
899 
900     case ADDR_EXPR:
901       /* We cannot encode addresses for ISL.  */
902       return false;
903 
904     default:
905       break;
906     }
907 
908   /* Only affine functions can be represented.  */
909   if (tree_contains_chrecs (scev, NULL) || !scev_is_linear_expression (scev))
910     return false;
911 
912   return true;
913 }
914 
915 /* Return true when EXPR can be represented in the polyhedral model.
916 
917    This means an expression can be represented, if it is linear with respect to
918    the loops and the strides are non parametric.  LOOP is the place where the
919    expr will be evaluated.  SCOP defines the region we analyse.  */
920 
921 bool
922 scop_detection::graphite_can_represent_expr (sese_l scop, loop_p loop,
923 					     tree expr)
924 {
925   tree scev = cached_scalar_evolution_in_region (scop, loop, expr);
926   return graphite_can_represent_scev (scop, scev);
927 }
928 
929 /* Return true if the data references of STMT can be represented by Graphite.
930    We try to analyze the data references in a loop contained in the SCOP.  */
931 
932 bool
933 scop_detection::stmt_has_simple_data_refs_p (sese_l scop, gimple *stmt)
934 {
935   edge nest = scop.entry;
936   loop_p loop = loop_containing_stmt (stmt);
937   if (!loop_in_sese_p (loop, scop))
938     loop = NULL;
939 
940   auto_vec<data_reference_p> drs;
941   if (! graphite_find_data_references_in_stmt (nest, loop, stmt, &drs))
942     return false;
943 
944   int j;
945   data_reference_p dr;
946   FOR_EACH_VEC_ELT (drs, j, dr)
947     {
948       for (unsigned i = 0; i < DR_NUM_DIMENSIONS (dr); ++i)
949 	if (! graphite_can_represent_scev (scop, DR_ACCESS_FN (dr, i)))
950 	  return false;
951     }
952 
953   return true;
954 }
955 
956 /* GIMPLE_ASM and GIMPLE_CALL may embed arbitrary side effects.
957    Calls have side-effects, except those to const or pure
958    functions.  */
959 
960 static bool
961 stmt_has_side_effects (gimple *stmt)
962 {
963   if (gimple_has_volatile_ops (stmt)
964       || (gimple_code (stmt) == GIMPLE_CALL
965 	  && !(gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE)))
966       || (gimple_code (stmt) == GIMPLE_ASM))
967     {
968       DEBUG_PRINT (dp << "[scop-detection-fail] "
969 		      << "Statement has side-effects:\n";
970 	print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS | TDF_MEMSYMS));
971       return true;
972     }
973   return false;
974 }
975 
976 /* Return true only when STMT is simple enough for being handled by Graphite.
977    This depends on SCOP, as the parameters are initialized relatively to
978    this basic block, the linear functions are initialized based on the outermost
979    loop containing STMT inside the SCOP.  BB is the place where we try to
980    evaluate the STMT.  */
981 
982 bool
983 scop_detection::stmt_simple_for_scop_p (sese_l scop, gimple *stmt,
984 					basic_block bb) const
985 {
986   gcc_assert (scop);
987 
988   if (is_gimple_debug (stmt))
989     return true;
990 
991   if (stmt_has_side_effects (stmt))
992     return false;
993 
994   if (!stmt_has_simple_data_refs_p (scop, stmt))
995     {
996       DEBUG_PRINT (dp << "[scop-detection-fail] "
997 		      << "Graphite cannot handle data-refs in stmt:\n";
998 	print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS|TDF_MEMSYMS););
999       return false;
1000     }
1001 
1002   switch (gimple_code (stmt))
1003     {
1004     case GIMPLE_LABEL:
1005       return true;
1006 
1007     case GIMPLE_COND:
1008       {
1009 	/* We can handle all binary comparisons.  Inequalities are
1010 	   also supported as they can be represented with union of
1011 	   polyhedra.  */
1012 	enum tree_code code = gimple_cond_code (stmt);
1013 	if (!(code == LT_EXPR
1014 	      || code == GT_EXPR
1015 	      || code == LE_EXPR
1016 	      || code == GE_EXPR
1017 	      || code == EQ_EXPR
1018 	      || code == NE_EXPR))
1019 	  {
1020 	    DEBUG_PRINT (dp << "[scop-detection-fail] "
1021 			    << "Graphite cannot handle cond stmt:\n";
1022 			 print_gimple_stmt (dump_file, stmt, 0,
1023 					    TDF_VOPS | TDF_MEMSYMS));
1024 	    return false;
1025 	  }
1026 
1027 	loop_p loop = bb->loop_father;
1028 	for (unsigned i = 0; i < 2; ++i)
1029 	  {
1030 	    tree op = gimple_op (stmt, i);
1031 	    if (!graphite_can_represent_expr (scop, loop, op)
1032 		/* We can only constrain on integer type.  */
1033 		|| ! INTEGRAL_TYPE_P (TREE_TYPE (op)))
1034 	      {
1035 		DEBUG_PRINT (dp << "[scop-detection-fail] "
1036 				<< "Graphite cannot represent stmt:\n";
1037 			     print_gimple_stmt (dump_file, stmt, 0,
1038 						TDF_VOPS | TDF_MEMSYMS));
1039 		return false;
1040 	      }
1041 	  }
1042 
1043 	return true;
1044       }
1045 
1046     case GIMPLE_ASSIGN:
1047     case GIMPLE_CALL:
1048       {
1049 	tree op, lhs = gimple_get_lhs (stmt);
1050 	ssa_op_iter i;
1051 	/* If we are not going to instantiate the stmt do not require
1052 	   its operands to be instantiatable at this point.  */
1053 	if (lhs
1054 	    && TREE_CODE (lhs) == SSA_NAME
1055 	    && scev_analyzable_p (lhs, scop))
1056 	  return true;
1057 	/* Verify that if we can analyze operands at their def site we
1058 	   also can represent them when analyzed at their uses.  */
1059 	FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
1060 	  if (scev_analyzable_p (op, scop)
1061 	      && chrec_contains_undetermined
1062 		   (cached_scalar_evolution_in_region (scop,
1063 						       bb->loop_father, op)))
1064 	    {
1065 	      DEBUG_PRINT (dp << "[scop-detection-fail] "
1066 			   << "Graphite cannot code-gen stmt:\n";
1067 			   print_gimple_stmt (dump_file, stmt, 0,
1068 					      TDF_VOPS | TDF_MEMSYMS));
1069 	      return false;
1070 	    }
1071 	return true;
1072       }
1073 
1074     default:
1075       /* These nodes cut a new scope.  */
1076       DEBUG_PRINT (
1077 	  dp << "[scop-detection-fail] "
1078 	     << "Gimple stmt not handled in Graphite:\n";
1079 	  print_gimple_stmt (dump_file, stmt, 0, TDF_VOPS | TDF_MEMSYMS));
1080       return false;
1081     }
1082 }
1083 
1084 /* Returns the number of pbbs that are in loops contained in SCOP.  */
1085 
1086 int
1087 scop_detection::nb_pbbs_in_loops (scop_p scop)
1088 {
1089   int i;
1090   poly_bb_p pbb;
1091   int res = 0;
1092 
1093   FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
1094     if (loop_in_sese_p (gbb_loop (PBB_BLACK_BOX (pbb)), scop->scop_info->region))
1095       res++;
1096 
1097   return res;
1098 }
1099 
1100 /* Assigns the parameter NAME an index in REGION.  */
1101 
1102 static void
1103 assign_parameter_index_in_region (tree name, sese_info_p region)
1104 {
1105   gcc_assert (TREE_CODE (name) == SSA_NAME
1106 	      && INTEGRAL_TYPE_P (TREE_TYPE (name))
1107 	      && ! defined_in_sese_p (name, region->region));
1108 
1109   int i;
1110   tree p;
1111   FOR_EACH_VEC_ELT (region->params, i, p)
1112     if (p == name)
1113       return;
1114 
1115   i = region->params.length ();
1116   region->params.safe_push (name);
1117 }
1118 
1119 /* In the context of sese S, scan the expression E and translate it to
1120    a linear expression C.  When parsing a symbolic multiplication, K
1121    represents the constant multiplier of an expression containing
1122    parameters.  */
1123 
1124 static void
1125 scan_tree_for_params (sese_info_p s, tree e)
1126 {
1127   if (e == chrec_dont_know)
1128     return;
1129 
1130   switch (TREE_CODE (e))
1131     {
1132     case POLYNOMIAL_CHREC:
1133       scan_tree_for_params (s, CHREC_LEFT (e));
1134       break;
1135 
1136     case MULT_EXPR:
1137       if (chrec_contains_symbols (TREE_OPERAND (e, 0)))
1138 	scan_tree_for_params (s, TREE_OPERAND (e, 0));
1139       else
1140 	scan_tree_for_params (s, TREE_OPERAND (e, 1));
1141       break;
1142 
1143     case PLUS_EXPR:
1144     case POINTER_PLUS_EXPR:
1145     case MINUS_EXPR:
1146       scan_tree_for_params (s, TREE_OPERAND (e, 0));
1147       scan_tree_for_params (s, TREE_OPERAND (e, 1));
1148       break;
1149 
1150     case NEGATE_EXPR:
1151     case BIT_NOT_EXPR:
1152     CASE_CONVERT:
1153     case NON_LVALUE_EXPR:
1154       scan_tree_for_params (s, TREE_OPERAND (e, 0));
1155       break;
1156 
1157     case SSA_NAME:
1158       assign_parameter_index_in_region (e, s);
1159       break;
1160 
1161     case INTEGER_CST:
1162     case ADDR_EXPR:
1163     case REAL_CST:
1164     case COMPLEX_CST:
1165     case VECTOR_CST:
1166       break;
1167 
1168    default:
1169       gcc_unreachable ();
1170       break;
1171     }
1172 }
1173 
1174 /* Find parameters with respect to REGION in BB. We are looking in memory
1175    access functions, conditions and loop bounds.  */
1176 
1177 static void
1178 find_params_in_bb (sese_info_p region, gimple_poly_bb_p gbb)
1179 {
1180   /* Find parameters in the access functions of data references.  */
1181   int i;
1182   data_reference_p dr;
1183   FOR_EACH_VEC_ELT (GBB_DATA_REFS (gbb), i, dr)
1184     for (unsigned j = 0; j < DR_NUM_DIMENSIONS (dr); j++)
1185       scan_tree_for_params (region, DR_ACCESS_FN (dr, j));
1186 
1187   /* Find parameters in conditional statements.  */
1188   gimple *stmt;
1189   FOR_EACH_VEC_ELT (GBB_CONDITIONS (gbb), i, stmt)
1190     {
1191       loop_p loop = gimple_bb (stmt)->loop_father;
1192       tree lhs = cached_scalar_evolution_in_region (region->region, loop,
1193 						    gimple_cond_lhs (stmt));
1194       tree rhs = cached_scalar_evolution_in_region (region->region, loop,
1195 						    gimple_cond_rhs (stmt));
1196       gcc_assert (!chrec_contains_undetermined (lhs)
1197 		  && !chrec_contains_undetermined (rhs));
1198 
1199       scan_tree_for_params (region, lhs);
1200       scan_tree_for_params (region, rhs);
1201     }
1202 }
1203 
1204 /* Record the parameters used in the SCOP BBs.  A variable is a parameter
1205    in a scop if it does not vary during the execution of that scop.  */
1206 
1207 static void
1208 find_scop_parameters (scop_p scop)
1209 {
1210   unsigned i;
1211   sese_info_p region = scop->scop_info;
1212 
1213   /* Parameters used in loop bounds are processed during gather_bbs.  */
1214 
1215   /* Find the parameters used in data accesses.  */
1216   poly_bb_p pbb;
1217   FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
1218     find_params_in_bb (region, PBB_BLACK_BOX (pbb));
1219 
1220   int nbp = sese_nb_params (region);
1221   scop_set_nb_params (scop, nbp);
1222 }
1223 
1224 static void
1225 add_write (vec<tree> *writes, tree def)
1226 {
1227   writes->safe_push (def);
1228   DEBUG_PRINT (dp << "Adding scalar write: ";
1229 	       print_generic_expr (dump_file, def);
1230 	       dp << "\nFrom stmt: ";
1231 	       print_gimple_stmt (dump_file,
1232 				  SSA_NAME_DEF_STMT (def), 0));
1233 }
1234 
1235 static void
1236 add_read (vec<scalar_use> *reads, tree use, gimple *use_stmt)
1237 {
1238   DEBUG_PRINT (dp << "Adding scalar read: ";
1239 	       print_generic_expr (dump_file, use);
1240 	       dp << "\nFrom stmt: ";
1241 	       print_gimple_stmt (dump_file, use_stmt, 0));
1242   reads->safe_push (std::make_pair (use_stmt, use));
1243 }
1244 
1245 
1246 /* Record DEF if it is used in other bbs different than DEF_BB in the SCOP.  */
1247 
1248 static void
1249 build_cross_bb_scalars_def (scop_p scop, tree def, basic_block def_bb,
1250 			     vec<tree> *writes)
1251 {
1252   if (!is_gimple_reg (def))
1253     return;
1254 
1255   bool scev_analyzable = scev_analyzable_p (def, scop->scop_info->region);
1256 
1257   gimple *use_stmt;
1258   imm_use_iterator imm_iter;
1259   FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
1260     /* Do not gather scalar variables that can be analyzed by SCEV as they can
1261        be generated out of the induction variables.  */
1262     if ((! scev_analyzable
1263 	 /* But gather SESE liveouts as we otherwise fail to rewrite their
1264 	    exit PHIs.  */
1265 	 || ! bb_in_sese_p (gimple_bb (use_stmt), scop->scop_info->region))
1266 	&& (def_bb != gimple_bb (use_stmt) && !is_gimple_debug (use_stmt)))
1267       {
1268 	add_write (writes, def);
1269 	/* This is required by the FOR_EACH_IMM_USE_STMT when we want to break
1270 	   before all the uses have been visited.  */
1271 	BREAK_FROM_IMM_USE_STMT (imm_iter);
1272       }
1273 }
1274 
1275 /* Record USE if it is defined in other bbs different than USE_STMT
1276    in the SCOP.  */
1277 
1278 static void
1279 build_cross_bb_scalars_use (scop_p scop, tree use, gimple *use_stmt,
1280 			    vec<scalar_use> *reads)
1281 {
1282   if (!is_gimple_reg (use))
1283     return;
1284 
1285   /* Do not gather scalar variables that can be analyzed by SCEV as they can be
1286      generated out of the induction variables.  */
1287   if (scev_analyzable_p (use, scop->scop_info->region))
1288     return;
1289 
1290   gimple *def_stmt = SSA_NAME_DEF_STMT (use);
1291   if (gimple_bb (def_stmt) != gimple_bb (use_stmt))
1292     add_read (reads, use, use_stmt);
1293 }
1294 
1295 /* Generates a polyhedral black box only if the bb contains interesting
1296    information.  */
1297 
1298 static gimple_poly_bb_p
1299 try_generate_gimple_bb (scop_p scop, basic_block bb)
1300 {
1301   vec<data_reference_p> drs = vNULL;
1302   vec<tree> writes = vNULL;
1303   vec<scalar_use> reads = vNULL;
1304 
1305   sese_l region = scop->scop_info->region;
1306   edge nest = region.entry;
1307   loop_p loop = bb->loop_father;
1308   if (!loop_in_sese_p (loop, region))
1309     loop = NULL;
1310 
1311   for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1312        gsi_next (&gsi))
1313     {
1314       gimple *stmt = gsi_stmt (gsi);
1315       if (is_gimple_debug (stmt))
1316 	continue;
1317 
1318       graphite_find_data_references_in_stmt (nest, loop, stmt, &drs);
1319 
1320       tree def = gimple_get_lhs (stmt);
1321       if (def)
1322 	build_cross_bb_scalars_def (scop, def, gimple_bb (stmt), &writes);
1323 
1324       ssa_op_iter iter;
1325       tree use;
1326       FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1327 	build_cross_bb_scalars_use (scop, use, stmt, &reads);
1328     }
1329 
1330   /* Handle defs and uses in PHIs.  Those need special treatment given
1331      that we have to present ISL with sth that looks like we've rewritten
1332      the IL out-of-SSA.  */
1333   for (gphi_iterator psi = gsi_start_phis (bb); !gsi_end_p (psi);
1334        gsi_next (&psi))
1335     {
1336       gphi *phi = psi.phi ();
1337       tree res = gimple_phi_result (phi);
1338       if (virtual_operand_p (res)
1339 	  || scev_analyzable_p (res, scop->scop_info->region))
1340 	continue;
1341       /* To simulate out-of-SSA the block containing the PHI node has
1342          reads of the PHI destination.  And to preserve SSA dependences
1343 	 we also write to it (the out-of-SSA decl and the SSA result
1344 	 are coalesced for dependence purposes which is good enough).  */
1345       add_read (&reads, res, phi);
1346       add_write (&writes, res);
1347     }
1348   basic_block bb_for_succs = bb;
1349   if (bb_for_succs == bb_for_succs->loop_father->latch
1350       && bb_in_sese_p (bb_for_succs, scop->scop_info->region)
1351       && sese_trivially_empty_bb_p (bb_for_succs))
1352     bb_for_succs = NULL;
1353   while (bb_for_succs)
1354     {
1355       basic_block latch = NULL;
1356       edge_iterator ei;
1357       edge e;
1358       FOR_EACH_EDGE (e, ei, bb_for_succs->succs)
1359 	{
1360 	  for (gphi_iterator psi = gsi_start_phis (e->dest); !gsi_end_p (psi);
1361 	       gsi_next (&psi))
1362 	    {
1363 	      gphi *phi = psi.phi ();
1364 	      tree res = gimple_phi_result (phi);
1365 	      if (virtual_operand_p (res))
1366 		continue;
1367 	      /* To simulate out-of-SSA the predecessor of edges into PHI nodes
1368 		 has a copy from the PHI argument to the PHI destination.  */
1369 	      if (! scev_analyzable_p (res, scop->scop_info->region))
1370 		add_write (&writes, res);
1371 	      tree use = PHI_ARG_DEF_FROM_EDGE (phi, e);
1372 	      if (TREE_CODE (use) == SSA_NAME
1373 		  && ! SSA_NAME_IS_DEFAULT_DEF (use)
1374 		  && gimple_bb (SSA_NAME_DEF_STMT (use)) != bb_for_succs
1375 		  && ! scev_analyzable_p (use, scop->scop_info->region))
1376 		add_read (&reads, use, phi);
1377 	    }
1378 	  if (e->dest == bb_for_succs->loop_father->latch
1379 	      && bb_in_sese_p (e->dest, scop->scop_info->region)
1380 	      && sese_trivially_empty_bb_p (e->dest))
1381 	    latch = e->dest;
1382 	}
1383       /* Handle empty latch block PHIs here, otherwise we confuse ISL
1384 	 with extra conditional code where it then peels off the last
1385 	 iteration just because of that.  It would be simplest if we
1386 	 just didn't force simple latches (thus remove the forwarder).  */
1387       bb_for_succs = latch;
1388     }
1389 
1390   /* For the region exit block add reads for all live-out vars.  */
1391   if (bb == scop->scop_info->region.exit->src)
1392     {
1393       sese_build_liveouts (scop->scop_info);
1394       unsigned i;
1395       bitmap_iterator bi;
1396       EXECUTE_IF_SET_IN_BITMAP (scop->scop_info->liveout, 0, i, bi)
1397 	{
1398 	  tree use = ssa_name (i);
1399 	  add_read (&reads, use, NULL);
1400 	}
1401     }
1402 
1403   if (drs.is_empty () && writes.is_empty () && reads.is_empty ())
1404     return NULL;
1405 
1406   return new_gimple_poly_bb (bb, drs, reads, writes);
1407 }
1408 
1409 /* Compute alias-sets for all data references in DRS.  */
1410 
1411 static bool
1412 build_alias_set (scop_p scop)
1413 {
1414   int num_vertices = scop->drs.length ();
1415   struct graph *g = new_graph (num_vertices);
1416   dr_info *dr1, *dr2;
1417   int i, j;
1418   int *all_vertices;
1419 
1420   struct loop *nest
1421     = find_common_loop (scop->scop_info->region.entry->dest->loop_father,
1422 			scop->scop_info->region.exit->src->loop_father);
1423 
1424   FOR_EACH_VEC_ELT (scop->drs, i, dr1)
1425     for (j = i+1; scop->drs.iterate (j, &dr2); j++)
1426       if (dr_may_alias_p (dr1->dr, dr2->dr, nest))
1427 	{
1428 	  /* Dependences in the same alias set need to be handled
1429 	     by just looking at DR_ACCESS_FNs.  */
1430 	  if (DR_NUM_DIMENSIONS (dr1->dr) == 0
1431 	      || DR_NUM_DIMENSIONS (dr1->dr) != DR_NUM_DIMENSIONS (dr2->dr)
1432 	      || ! operand_equal_p (DR_BASE_OBJECT (dr1->dr),
1433 				    DR_BASE_OBJECT (dr2->dr),
1434 				    OEP_ADDRESS_OF)
1435 	      || ! types_compatible_p (TREE_TYPE (DR_BASE_OBJECT (dr1->dr)),
1436 				       TREE_TYPE (DR_BASE_OBJECT (dr2->dr))))
1437 	    {
1438 	      free_graph (g);
1439 	      return false;
1440 	    }
1441 	  add_edge (g, i, j);
1442 	  add_edge (g, j, i);
1443 	}
1444 
1445   all_vertices = XNEWVEC (int, num_vertices);
1446   for (i = 0; i < num_vertices; i++)
1447     all_vertices[i] = i;
1448 
1449   scop->max_alias_set
1450     = graphds_dfs (g, all_vertices, num_vertices, NULL, true, NULL) + 1;
1451   free (all_vertices);
1452 
1453   for (i = 0; i < g->n_vertices; i++)
1454     scop->drs[i].alias_set = g->vertices[i].component + 1;
1455 
1456   free_graph (g);
1457   return true;
1458 }
1459 
1460 /* Gather BBs and conditions for a SCOP.  */
1461 class gather_bbs : public dom_walker
1462 {
1463 public:
1464   gather_bbs (cdi_direction, scop_p, int *);
1465 
1466   virtual edge before_dom_children (basic_block);
1467   virtual void after_dom_children (basic_block);
1468 
1469 private:
1470   auto_vec<gimple *, 3> conditions, cases;
1471   scop_p scop;
1472 };
1473 }
1474 gather_bbs::gather_bbs (cdi_direction direction, scop_p scop, int *bb_to_rpo)
1475   : dom_walker (direction, ALL_BLOCKS, bb_to_rpo), scop (scop)
1476 {
1477 }
1478 
1479 /* Call-back for dom_walk executed before visiting the dominated
1480    blocks.  */
1481 
1482 edge
1483 gather_bbs::before_dom_children (basic_block bb)
1484 {
1485   sese_info_p region = scop->scop_info;
1486   if (!bb_in_sese_p (bb, region->region))
1487     return dom_walker::STOP;
1488 
1489   /* For loops fully contained in the region record parameters in the
1490      loop bounds.  */
1491   loop_p loop = bb->loop_father;
1492   if (loop->header == bb
1493       && loop_in_sese_p (loop, region->region))
1494     {
1495       tree nb_iters = number_of_latch_executions (loop);
1496       if (chrec_contains_symbols (nb_iters))
1497 	{
1498 	  nb_iters = cached_scalar_evolution_in_region (region->region,
1499 							loop, nb_iters);
1500 	  scan_tree_for_params (region, nb_iters);
1501 	}
1502     }
1503 
1504   if (gcond *stmt = single_pred_cond_non_loop_exit (bb))
1505     {
1506       edge e = single_pred_edge (bb);
1507       /* Make sure the condition is in the region and thus was verified
1508          to be handled.  */
1509       if (e != region->region.entry)
1510 	{
1511 	  conditions.safe_push (stmt);
1512 	  if (e->flags & EDGE_TRUE_VALUE)
1513 	    cases.safe_push (stmt);
1514 	  else
1515 	    cases.safe_push (NULL);
1516 	}
1517     }
1518 
1519   scop->scop_info->bbs.safe_push (bb);
1520 
1521   gimple_poly_bb_p gbb = try_generate_gimple_bb (scop, bb);
1522   if (!gbb)
1523     return NULL;
1524 
1525   GBB_CONDITIONS (gbb) = conditions.copy ();
1526   GBB_CONDITION_CASES (gbb) = cases.copy ();
1527 
1528   poly_bb_p pbb = new_poly_bb (scop, gbb);
1529   scop->pbbs.safe_push (pbb);
1530 
1531   int i;
1532   data_reference_p dr;
1533   FOR_EACH_VEC_ELT (gbb->data_refs, i, dr)
1534     {
1535       DEBUG_PRINT (dp << "Adding memory ";
1536 		   if (dr->is_read)
1537 		     dp << "read: ";
1538 		   else
1539 		     dp << "write: ";
1540 		   print_generic_expr (dump_file, dr->ref);
1541 		   dp << "\nFrom stmt: ";
1542 		   print_gimple_stmt (dump_file, dr->stmt, 0));
1543 
1544       scop->drs.safe_push (dr_info (dr, pbb));
1545     }
1546 
1547   return NULL;
1548 }
1549 
1550 /* Call-back for dom_walk executed after visiting the dominated
1551    blocks.  */
1552 
1553 void
1554 gather_bbs::after_dom_children (basic_block bb)
1555 {
1556   if (!bb_in_sese_p (bb, scop->scop_info->region))
1557     return;
1558 
1559   if (single_pred_cond_non_loop_exit (bb))
1560     {
1561       edge e = single_pred_edge (bb);
1562       if (e != scop->scop_info->region.entry)
1563 	{
1564 	  conditions.pop ();
1565 	  cases.pop ();
1566 	}
1567     }
1568 }
1569 
1570 
1571 /* Compute sth like an execution order, dominator order with first executing
1572    edges that stay inside the current loop, delaying processing exit edges.  */
1573 
1574 static int *bb_to_rpo;
1575 
1576 /* Helper for qsort, sorting after order above.  */
1577 
1578 static int
1579 cmp_pbbs (const void *pa, const void *pb)
1580 {
1581   poly_bb_p bb1 = *((const poly_bb_p *)pa);
1582   poly_bb_p bb2 = *((const poly_bb_p *)pb);
1583   if (bb_to_rpo[bb1->black_box->bb->index]
1584       < bb_to_rpo[bb2->black_box->bb->index])
1585     return -1;
1586   else if (bb_to_rpo[bb1->black_box->bb->index]
1587 	   > bb_to_rpo[bb2->black_box->bb->index])
1588     return 1;
1589   else
1590     return 0;
1591 }
1592 
1593 /* Find Static Control Parts (SCoP) in the current function and pushes
1594    them to SCOPS.  */
1595 
1596 void
1597 build_scops (vec<scop_p> *scops)
1598 {
1599   if (dump_file)
1600     dp.set_dump_file (dump_file);
1601 
1602   scop_detection sb;
1603   sb.build_scop_depth (current_loops->tree_root);
1604 
1605   /* Now create scops from the lightweight SESEs.  */
1606   vec<sese_l> scops_l = sb.get_scops ();
1607 
1608   /* Domwalk needs a bb to RPO mapping.  Compute it once here.  */
1609   int *postorder = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
1610   int postorder_num = pre_and_rev_post_order_compute (NULL, postorder, true);
1611   bb_to_rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
1612   for (int i = 0; i < postorder_num; ++i)
1613     bb_to_rpo[postorder[i]] = i;
1614   free (postorder);
1615 
1616   int i;
1617   sese_l *s;
1618   FOR_EACH_VEC_ELT (scops_l, i, s)
1619     {
1620       scop_p scop = new_scop (s->entry, s->exit);
1621 
1622       /* Record all basic blocks and their conditions in REGION.  */
1623       gather_bbs (CDI_DOMINATORS, scop, bb_to_rpo).walk (s->entry->dest);
1624 
1625       /* Sort pbbs after execution order for initial schedule generation.  */
1626       scop->pbbs.qsort (cmp_pbbs);
1627 
1628       if (! build_alias_set (scop))
1629 	{
1630 	  DEBUG_PRINT (dp << "[scop-detection-fail] cannot handle dependences\n");
1631 	  free_scop (scop);
1632 	  continue;
1633 	}
1634 
1635       /* Do not optimize a scop containing only PBBs that do not belong
1636 	 to any loops.  */
1637       if (sb.nb_pbbs_in_loops (scop) == 0)
1638 	{
1639 	  DEBUG_PRINT (dp << "[scop-detection-fail] no data references.\n");
1640 	  free_scop (scop);
1641 	  continue;
1642 	}
1643 
1644       unsigned max_arrays = PARAM_VALUE (PARAM_GRAPHITE_MAX_ARRAYS_PER_SCOP);
1645       if (max_arrays > 0
1646 	  && scop->drs.length () >= max_arrays)
1647 	{
1648 	  DEBUG_PRINT (dp << "[scop-detection-fail] too many data references: "
1649 		       << scop->drs.length ()
1650 		       << " is larger than --param graphite-max-arrays-per-scop="
1651 		       << max_arrays << ".\n");
1652 	  free_scop (scop);
1653 	  continue;
1654 	}
1655 
1656       find_scop_parameters (scop);
1657       graphite_dim_t max_dim = PARAM_VALUE (PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS);
1658       if (max_dim > 0
1659 	  && scop_nb_params (scop) > max_dim)
1660 	{
1661 	  DEBUG_PRINT (dp << "[scop-detection-fail] too many parameters: "
1662 			  << scop_nb_params (scop)
1663 			  << " larger than --param graphite-max-nb-scop-params="
1664 			  << max_dim << ".\n");
1665 	  free_scop (scop);
1666 	  continue;
1667 	}
1668 
1669       scops->safe_push (scop);
1670     }
1671 
1672   free (bb_to_rpo);
1673   bb_to_rpo = NULL;
1674   DEBUG_PRINT (dp << "number of SCoPs: " << (scops ? scops->length () : 0););
1675 }
1676 
1677 #endif /* HAVE_isl */
1678