rtlanal.c (subreg_get_info): Exit early for simple and common cases.
[gcc.git] / gcc / graphite-sese-to-poly.c
1 /* Conversion of SESE regions to Polyhedra.
2 Copyright (C) 2009-2015 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <sebastian.pop@amd.com>.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License 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 #include "config.h"
22
23 #ifdef HAVE_isl
24 #include <isl/set.h>
25 #include <isl/map.h>
26 #include <isl/union_map.h>
27 #include <isl/constraint.h>
28 #include <isl/aff.h>
29 #include <isl/val.h>
30
31 /* Since ISL-0.13, the extern is in val_gmp.h. */
32 #if !defined(HAVE_ISL_SCHED_CONSTRAINTS_COMPUTE_SCHEDULE) && defined(__cplusplus)
33 extern "C" {
34 #endif
35 #include <isl/val_gmp.h>
36 #if !defined(HAVE_ISL_SCHED_CONSTRAINTS_COMPUTE_SCHEDULE) && defined(__cplusplus)
37 }
38 #endif
39 #endif
40
41 #include "system.h"
42 #include "coretypes.h"
43 #include "hash-set.h"
44 #include "machmode.h"
45 #include "vec.h"
46 #include "double-int.h"
47 #include "input.h"
48 #include "alias.h"
49 #include "symtab.h"
50 #include "options.h"
51 #include "wide-int.h"
52 #include "inchash.h"
53 #include "tree.h"
54 #include "fold-const.h"
55 #include "predict.h"
56 #include "tm.h"
57 #include "hard-reg-set.h"
58 #include "function.h"
59 #include "dominance.h"
60 #include "cfg.h"
61 #include "basic-block.h"
62 #include "tree-ssa-alias.h"
63 #include "internal-fn.h"
64 #include "gimple-expr.h"
65 #include "is-a.h"
66 #include "gimple.h"
67 #include "gimple-iterator.h"
68 #include "gimplify.h"
69 #include "gimplify-me.h"
70 #include "gimple-ssa.h"
71 #include "tree-cfg.h"
72 #include "tree-phinodes.h"
73 #include "ssa-iterators.h"
74 #include "stringpool.h"
75 #include "tree-ssanames.h"
76 #include "tree-ssa-loop-manip.h"
77 #include "tree-ssa-loop-niter.h"
78 #include "tree-ssa-loop.h"
79 #include "tree-into-ssa.h"
80 #include "tree-pass.h"
81 #include "cfgloop.h"
82 #include "tree-chrec.h"
83 #include "tree-data-ref.h"
84 #include "tree-scalar-evolution.h"
85 #include "domwalk.h"
86 #include "sese.h"
87 #include "tree-ssa-propagate.h"
88
89 #ifdef HAVE_isl
90 #include "hashtab.h"
91 #include "rtl.h"
92 #include "flags.h"
93 #include "statistics.h"
94 #include "real.h"
95 #include "fixed-value.h"
96 #include "insn-config.h"
97 #include "expmed.h"
98 #include "dojump.h"
99 #include "explow.h"
100 #include "calls.h"
101 #include "emit-rtl.h"
102 #include "varasm.h"
103 #include "stmt.h"
104 #include "expr.h"
105 #include "graphite-poly.h"
106 #include "graphite-sese-to-poly.h"
107
108
109 /* Assigns to RES the value of the INTEGER_CST T. */
110
111 static inline void
112 tree_int_to_gmp (tree t, mpz_t res)
113 {
114 wi::to_mpz (t, res, TYPE_SIGN (TREE_TYPE (t)));
115 }
116
117 /* Returns the index of the PHI argument defined in the outermost
118 loop. */
119
120 static size_t
121 phi_arg_in_outermost_loop (gphi *phi)
122 {
123 loop_p loop = gimple_bb (phi)->loop_father;
124 size_t i, res = 0;
125
126 for (i = 0; i < gimple_phi_num_args (phi); i++)
127 if (!flow_bb_inside_loop_p (loop, gimple_phi_arg_edge (phi, i)->src))
128 {
129 loop = gimple_phi_arg_edge (phi, i)->src->loop_father;
130 res = i;
131 }
132
133 return res;
134 }
135
136 /* Removes a simple copy phi node "RES = phi (INIT, RES)" at position
137 PSI by inserting on the loop ENTRY edge assignment "RES = INIT". */
138
139 static void
140 remove_simple_copy_phi (gphi_iterator *psi)
141 {
142 gphi *phi = psi->phi ();
143 tree res = gimple_phi_result (phi);
144 size_t entry = phi_arg_in_outermost_loop (phi);
145 tree init = gimple_phi_arg_def (phi, entry);
146 gassign *stmt = gimple_build_assign (res, init);
147 edge e = gimple_phi_arg_edge (phi, entry);
148
149 remove_phi_node (psi, false);
150 gsi_insert_on_edge_immediate (e, stmt);
151 }
152
153 /* Removes an invariant phi node at position PSI by inserting on the
154 loop ENTRY edge the assignment RES = INIT. */
155
156 static void
157 remove_invariant_phi (sese region, gphi_iterator *psi)
158 {
159 gphi *phi = psi->phi ();
160 loop_p loop = loop_containing_stmt (phi);
161 tree res = gimple_phi_result (phi);
162 tree scev = scalar_evolution_in_region (region, loop, res);
163 size_t entry = phi_arg_in_outermost_loop (phi);
164 edge e = gimple_phi_arg_edge (phi, entry);
165 tree var;
166 gassign *stmt;
167 gimple_seq stmts = NULL;
168
169 if (tree_contains_chrecs (scev, NULL))
170 scev = gimple_phi_arg_def (phi, entry);
171
172 var = force_gimple_operand (scev, &stmts, true, NULL_TREE);
173 stmt = gimple_build_assign (res, var);
174 remove_phi_node (psi, false);
175
176 gimple_seq_add_stmt (&stmts, stmt);
177 gsi_insert_seq_on_edge (e, stmts);
178 gsi_commit_edge_inserts ();
179 SSA_NAME_DEF_STMT (res) = stmt;
180 }
181
182 /* Returns true when the phi node at PSI is of the form "a = phi (a, x)". */
183
184 static inline bool
185 simple_copy_phi_p (gphi *phi)
186 {
187 tree res;
188
189 if (gimple_phi_num_args (phi) != 2)
190 return false;
191
192 res = gimple_phi_result (phi);
193 return (res == gimple_phi_arg_def (phi, 0)
194 || res == gimple_phi_arg_def (phi, 1));
195 }
196
197 /* Returns true when the phi node at position PSI is a reduction phi
198 node in REGION. Otherwise moves the pointer PSI to the next phi to
199 be considered. */
200
201 static bool
202 reduction_phi_p (sese region, gphi_iterator *psi)
203 {
204 loop_p loop;
205 gphi *phi = psi->phi ();
206 tree res = gimple_phi_result (phi);
207
208 loop = loop_containing_stmt (phi);
209
210 if (simple_copy_phi_p (phi))
211 {
212 /* PRE introduces phi nodes like these, for an example,
213 see id-5.f in the fortran graphite testsuite:
214
215 # prephitmp.85_265 = PHI <prephitmp.85_258(33), prephitmp.85_265(18)>
216 */
217 remove_simple_copy_phi (psi);
218 return false;
219 }
220
221 if (scev_analyzable_p (res, region))
222 {
223 tree scev = scalar_evolution_in_region (region, loop, res);
224
225 if (evolution_function_is_invariant_p (scev, loop->num))
226 remove_invariant_phi (region, psi);
227 else
228 gsi_next (psi);
229
230 return false;
231 }
232
233 /* All the other cases are considered reductions. */
234 return true;
235 }
236
237 /* Store the GRAPHITE representation of BB. */
238
239 static gimple_bb_p
240 new_gimple_bb (basic_block bb, vec<data_reference_p> drs)
241 {
242 struct gimple_bb *gbb;
243
244 gbb = XNEW (struct gimple_bb);
245 bb->aux = gbb;
246 GBB_BB (gbb) = bb;
247 GBB_DATA_REFS (gbb) = drs;
248 GBB_CONDITIONS (gbb).create (0);
249 GBB_CONDITION_CASES (gbb).create (0);
250
251 return gbb;
252 }
253
254 static void
255 free_data_refs_aux (vec<data_reference_p> datarefs)
256 {
257 unsigned int i;
258 struct data_reference *dr;
259
260 FOR_EACH_VEC_ELT (datarefs, i, dr)
261 if (dr->aux)
262 {
263 base_alias_pair *bap = (base_alias_pair *)(dr->aux);
264
265 free (bap->alias_set);
266
267 free (bap);
268 dr->aux = NULL;
269 }
270 }
271 /* Frees GBB. */
272
273 static void
274 free_gimple_bb (struct gimple_bb *gbb)
275 {
276 free_data_refs_aux (GBB_DATA_REFS (gbb));
277 free_data_refs (GBB_DATA_REFS (gbb));
278
279 GBB_CONDITIONS (gbb).release ();
280 GBB_CONDITION_CASES (gbb).release ();
281 GBB_BB (gbb)->aux = 0;
282 XDELETE (gbb);
283 }
284
285 /* Deletes all gimple bbs in SCOP. */
286
287 static void
288 remove_gbbs_in_scop (scop_p scop)
289 {
290 int i;
291 poly_bb_p pbb;
292
293 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
294 free_gimple_bb (PBB_BLACK_BOX (pbb));
295 }
296
297 /* Deletes all scops in SCOPS. */
298
299 void
300 free_scops (vec<scop_p> scops)
301 {
302 int i;
303 scop_p scop;
304
305 FOR_EACH_VEC_ELT (scops, i, scop)
306 {
307 remove_gbbs_in_scop (scop);
308 free_sese (SCOP_REGION (scop));
309 free_scop (scop);
310 }
311
312 scops.release ();
313 }
314
315 /* Same as outermost_loop_in_sese, returns the outermost loop
316 containing BB in REGION, but makes sure that the returned loop
317 belongs to the REGION, and so this returns the first loop in the
318 REGION when the loop containing BB does not belong to REGION. */
319
320 static loop_p
321 outermost_loop_in_sese_1 (sese region, basic_block bb)
322 {
323 loop_p nest = outermost_loop_in_sese (region, bb);
324
325 if (loop_in_sese_p (nest, region))
326 return nest;
327
328 /* When the basic block BB does not belong to a loop in the region,
329 return the first loop in the region. */
330 nest = nest->inner;
331 while (nest)
332 if (loop_in_sese_p (nest, region))
333 break;
334 else
335 nest = nest->next;
336
337 gcc_assert (nest);
338 return nest;
339 }
340
341 /* Generates a polyhedral black box only if the bb contains interesting
342 information. */
343
344 static gimple_bb_p
345 try_generate_gimple_bb (scop_p scop, basic_block bb)
346 {
347 vec<data_reference_p> drs;
348 drs.create (5);
349 sese region = SCOP_REGION (scop);
350 loop_p nest = outermost_loop_in_sese_1 (region, bb);
351 gimple_stmt_iterator gsi;
352
353 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
354 {
355 gimple stmt = gsi_stmt (gsi);
356 loop_p loop;
357
358 if (is_gimple_debug (stmt))
359 continue;
360
361 loop = loop_containing_stmt (stmt);
362 if (!loop_in_sese_p (loop, region))
363 loop = nest;
364
365 graphite_find_data_references_in_stmt (nest, loop, stmt, &drs);
366 }
367
368 return new_gimple_bb (bb, drs);
369 }
370
371 /* Returns true if all predecessors of BB, that are not dominated by BB, are
372 marked in MAP. The predecessors dominated by BB are loop latches and will
373 be handled after BB. */
374
375 static bool
376 all_non_dominated_preds_marked_p (basic_block bb, sbitmap map)
377 {
378 edge e;
379 edge_iterator ei;
380
381 FOR_EACH_EDGE (e, ei, bb->preds)
382 if (!bitmap_bit_p (map, e->src->index)
383 && !dominated_by_p (CDI_DOMINATORS, e->src, bb))
384 return false;
385
386 return true;
387 }
388
389 /* Compare the depth of two basic_block's P1 and P2. */
390
391 static int
392 compare_bb_depths (const void *p1, const void *p2)
393 {
394 const_basic_block const bb1 = *(const_basic_block const*)p1;
395 const_basic_block const bb2 = *(const_basic_block const*)p2;
396 int d1 = loop_depth (bb1->loop_father);
397 int d2 = loop_depth (bb2->loop_father);
398
399 if (d1 < d2)
400 return 1;
401
402 if (d1 > d2)
403 return -1;
404
405 return 0;
406 }
407
408 /* Sort the basic blocks from DOM such that the first are the ones at
409 a deepest loop level. */
410
411 static void
412 graphite_sort_dominated_info (vec<basic_block> dom)
413 {
414 dom.qsort (compare_bb_depths);
415 }
416
417 /* Recursive helper function for build_scops_bbs. */
418
419 static void
420 build_scop_bbs_1 (scop_p scop, sbitmap visited, basic_block bb)
421 {
422 sese region = SCOP_REGION (scop);
423 vec<basic_block> dom;
424 poly_bb_p pbb;
425
426 if (bitmap_bit_p (visited, bb->index)
427 || !bb_in_sese_p (bb, region))
428 return;
429
430 pbb = new_poly_bb (scop, try_generate_gimple_bb (scop, bb));
431 SCOP_BBS (scop).safe_push (pbb);
432 bitmap_set_bit (visited, bb->index);
433
434 dom = get_dominated_by (CDI_DOMINATORS, bb);
435
436 if (!dom.exists ())
437 return;
438
439 graphite_sort_dominated_info (dom);
440
441 while (!dom.is_empty ())
442 {
443 int i;
444 basic_block dom_bb;
445
446 FOR_EACH_VEC_ELT (dom, i, dom_bb)
447 if (all_non_dominated_preds_marked_p (dom_bb, visited))
448 {
449 build_scop_bbs_1 (scop, visited, dom_bb);
450 dom.unordered_remove (i);
451 break;
452 }
453 }
454
455 dom.release ();
456 }
457
458 /* Gather the basic blocks belonging to the SCOP. */
459
460 static void
461 build_scop_bbs (scop_p scop)
462 {
463 sbitmap visited = sbitmap_alloc (last_basic_block_for_fn (cfun));
464 sese region = SCOP_REGION (scop);
465
466 bitmap_clear (visited);
467 build_scop_bbs_1 (scop, visited, SESE_ENTRY_BB (region));
468 sbitmap_free (visited);
469 }
470
471 /* Return an ISL identifier for the polyhedral basic block PBB. */
472
473 static isl_id *
474 isl_id_for_pbb (scop_p s, poly_bb_p pbb)
475 {
476 char name[50];
477 snprintf (name, sizeof (name), "S_%d", pbb_index (pbb));
478 return isl_id_alloc (s->ctx, name, pbb);
479 }
480
481 /* Converts the STATIC_SCHEDULE of PBB into a scattering polyhedron.
482 We generate SCATTERING_DIMENSIONS scattering dimensions.
483
484 CLooG 0.15.0 and previous versions require, that all
485 scattering functions of one CloogProgram have the same number of
486 scattering dimensions, therefore we allow to specify it. This
487 should be removed in future versions of CLooG.
488
489 The scattering polyhedron consists of these dimensions: scattering,
490 loop_iterators, parameters.
491
492 Example:
493
494 | scattering_dimensions = 5
495 | used_scattering_dimensions = 3
496 | nb_iterators = 1
497 | scop_nb_params = 2
498 |
499 | Schedule:
500 | i
501 | 4 5
502 |
503 | Scattering polyhedron:
504 |
505 | scattering: {s1, s2, s3, s4, s5}
506 | loop_iterators: {i}
507 | parameters: {p1, p2}
508 |
509 | s1 s2 s3 s4 s5 i p1 p2 1
510 | 1 0 0 0 0 0 0 0 -4 = 0
511 | 0 1 0 0 0 -1 0 0 0 = 0
512 | 0 0 1 0 0 0 0 0 -5 = 0 */
513
514 static void
515 build_pbb_scattering_polyhedrons (isl_aff *static_sched,
516 poly_bb_p pbb, int scattering_dimensions)
517 {
518 int i;
519 int nb_iterators = pbb_dim_iter_domain (pbb);
520 int used_scattering_dimensions = nb_iterators * 2 + 1;
521 isl_val *val;
522 isl_space *dc, *dm;
523
524 gcc_assert (scattering_dimensions >= used_scattering_dimensions);
525
526 dc = isl_set_get_space (pbb->domain);
527 dm = isl_space_add_dims (isl_space_from_domain (dc),
528 isl_dim_out, scattering_dimensions);
529 pbb->schedule = isl_map_universe (dm);
530
531 for (i = 0; i < scattering_dimensions; i++)
532 {
533 /* Textual order inside this loop. */
534 if ((i % 2) == 0)
535 {
536 isl_constraint *c = isl_equality_alloc
537 (isl_local_space_from_space (isl_map_get_space (pbb->schedule)));
538
539 val = isl_aff_get_coefficient_val (static_sched, isl_dim_in, i / 2);
540
541 val = isl_val_neg (val);
542 c = isl_constraint_set_constant_val (c, val);
543 c = isl_constraint_set_coefficient_si (c, isl_dim_out, i, 1);
544 pbb->schedule = isl_map_add_constraint (pbb->schedule, c);
545 }
546
547 /* Iterations of this loop. */
548 else /* if ((i % 2) == 1) */
549 {
550 int loop = (i - 1) / 2;
551 pbb->schedule = isl_map_equate (pbb->schedule, isl_dim_in, loop,
552 isl_dim_out, i);
553 }
554 }
555
556 pbb->transformed = isl_map_copy (pbb->schedule);
557 }
558
559 /* Build for BB the static schedule.
560
561 The static schedule is a Dewey numbering of the abstract syntax
562 tree: http://en.wikipedia.org/wiki/Dewey_Decimal_Classification
563
564 The following example informally defines the static schedule:
565
566 A
567 for (i: ...)
568 {
569 for (j: ...)
570 {
571 B
572 C
573 }
574
575 for (k: ...)
576 {
577 D
578 E
579 }
580 }
581 F
582
583 Static schedules for A to F:
584
585 DEPTH
586 0 1 2
587 A 0
588 B 1 0 0
589 C 1 0 1
590 D 1 1 0
591 E 1 1 1
592 F 2
593 */
594
595 static void
596 build_scop_scattering (scop_p scop)
597 {
598 int i;
599 poly_bb_p pbb;
600 gimple_bb_p previous_gbb = NULL;
601 isl_space *dc = isl_set_get_space (scop->context);
602 isl_aff *static_sched;
603
604 dc = isl_space_add_dims (dc, isl_dim_set, number_of_loops (cfun));
605 static_sched = isl_aff_zero_on_domain (isl_local_space_from_space (dc));
606
607 /* We have to start schedules at 0 on the first component and
608 because we cannot compare_prefix_loops against a previous loop,
609 prefix will be equal to zero, and that index will be
610 incremented before copying. */
611 static_sched = isl_aff_add_coefficient_si (static_sched, isl_dim_in, 0, -1);
612
613 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
614 {
615 gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
616 int prefix;
617 int nb_scat_dims = pbb_dim_iter_domain (pbb) * 2 + 1;
618
619 if (previous_gbb)
620 prefix = nb_common_loops (SCOP_REGION (scop), previous_gbb, gbb);
621 else
622 prefix = 0;
623
624 previous_gbb = gbb;
625
626 static_sched = isl_aff_add_coefficient_si (static_sched, isl_dim_in,
627 prefix, 1);
628 build_pbb_scattering_polyhedrons (static_sched, pbb, nb_scat_dims);
629 }
630
631 isl_aff_free (static_sched);
632 }
633
634 static isl_pw_aff *extract_affine (scop_p, tree, __isl_take isl_space *space);
635
636 /* Extract an affine expression from the chain of recurrence E. */
637
638 static isl_pw_aff *
639 extract_affine_chrec (scop_p s, tree e, __isl_take isl_space *space)
640 {
641 isl_pw_aff *lhs = extract_affine (s, CHREC_LEFT (e), isl_space_copy (space));
642 isl_pw_aff *rhs = extract_affine (s, CHREC_RIGHT (e), isl_space_copy (space));
643 isl_local_space *ls = isl_local_space_from_space (space);
644 unsigned pos = sese_loop_depth ((sese) s->region, get_chrec_loop (e)) - 1;
645 isl_aff *loop = isl_aff_set_coefficient_si
646 (isl_aff_zero_on_domain (ls), isl_dim_in, pos, 1);
647 isl_pw_aff *l = isl_pw_aff_from_aff (loop);
648
649 /* Before multiplying, make sure that the result is affine. */
650 gcc_assert (isl_pw_aff_is_cst (rhs)
651 || isl_pw_aff_is_cst (l));
652
653 return isl_pw_aff_add (lhs, isl_pw_aff_mul (rhs, l));
654 }
655
656 /* Extract an affine expression from the mult_expr E. */
657
658 static isl_pw_aff *
659 extract_affine_mul (scop_p s, tree e, __isl_take isl_space *space)
660 {
661 isl_pw_aff *lhs = extract_affine (s, TREE_OPERAND (e, 0),
662 isl_space_copy (space));
663 isl_pw_aff *rhs = extract_affine (s, TREE_OPERAND (e, 1), space);
664
665 if (!isl_pw_aff_is_cst (lhs)
666 && !isl_pw_aff_is_cst (rhs))
667 {
668 isl_pw_aff_free (lhs);
669 isl_pw_aff_free (rhs);
670 return NULL;
671 }
672
673 return isl_pw_aff_mul (lhs, rhs);
674 }
675
676 /* Return an ISL identifier from the name of the ssa_name E. */
677
678 static isl_id *
679 isl_id_for_ssa_name (scop_p s, tree e)
680 {
681 const char *name = get_name (e);
682 isl_id *id;
683
684 if (name)
685 id = isl_id_alloc (s->ctx, name, e);
686 else
687 {
688 char name1[50];
689 snprintf (name1, sizeof (name1), "P_%d", SSA_NAME_VERSION (e));
690 id = isl_id_alloc (s->ctx, name1, e);
691 }
692
693 return id;
694 }
695
696 /* Return an ISL identifier for the data reference DR. */
697
698 static isl_id *
699 isl_id_for_dr (scop_p s, data_reference_p dr ATTRIBUTE_UNUSED)
700 {
701 /* Data references all get the same isl_id. They need to be comparable
702 and are distinguished through the first dimension, which contains the
703 alias set number. */
704 return isl_id_alloc (s->ctx, "", 0);
705 }
706
707 /* Extract an affine expression from the ssa_name E. */
708
709 static isl_pw_aff *
710 extract_affine_name (scop_p s, tree e, __isl_take isl_space *space)
711 {
712 isl_aff *aff;
713 isl_set *dom;
714 isl_id *id;
715 int dimension;
716
717 id = isl_id_for_ssa_name (s, e);
718 dimension = isl_space_find_dim_by_id (space, isl_dim_param, id);
719 isl_id_free (id);
720 dom = isl_set_universe (isl_space_copy (space));
721 aff = isl_aff_zero_on_domain (isl_local_space_from_space (space));
722 aff = isl_aff_add_coefficient_si (aff, isl_dim_param, dimension, 1);
723 return isl_pw_aff_alloc (dom, aff);
724 }
725
726 /* Extract an affine expression from the gmp constant G. */
727
728 static isl_pw_aff *
729 extract_affine_gmp (mpz_t g, __isl_take isl_space *space)
730 {
731 isl_local_space *ls = isl_local_space_from_space (isl_space_copy (space));
732 isl_aff *aff = isl_aff_zero_on_domain (ls);
733 isl_set *dom = isl_set_universe (space);
734 isl_val *v;
735 isl_ctx *ct;
736
737 ct = isl_aff_get_ctx (aff);
738 v = isl_val_int_from_gmp (ct, g);
739 aff = isl_aff_add_constant_val (aff, v);
740
741 return isl_pw_aff_alloc (dom, aff);
742 }
743
744 /* Extract an affine expression from the integer_cst E. */
745
746 static isl_pw_aff *
747 extract_affine_int (tree e, __isl_take isl_space *space)
748 {
749 isl_pw_aff *res;
750 mpz_t g;
751
752 mpz_init (g);
753 tree_int_to_gmp (e, g);
754 res = extract_affine_gmp (g, space);
755 mpz_clear (g);
756
757 return res;
758 }
759
760 /* Compute pwaff mod 2^width. */
761
762 extern isl_ctx *the_isl_ctx;
763
764 static isl_pw_aff *
765 wrap (isl_pw_aff *pwaff, unsigned width)
766 {
767 isl_val *mod;
768
769 mod = isl_val_int_from_ui(the_isl_ctx, width);
770 mod = isl_val_2exp (mod);
771 pwaff = isl_pw_aff_mod_val (pwaff, mod);
772
773 return pwaff;
774 }
775
776 /* When parameter NAME is in REGION, returns its index in SESE_PARAMS.
777 Otherwise returns -1. */
778
779 static inline int
780 parameter_index_in_region_1 (tree name, sese region)
781 {
782 int i;
783 tree p;
784
785 gcc_assert (TREE_CODE (name) == SSA_NAME);
786
787 FOR_EACH_VEC_ELT (SESE_PARAMS (region), i, p)
788 if (p == name)
789 return i;
790
791 return -1;
792 }
793
794 /* When the parameter NAME is in REGION, returns its index in
795 SESE_PARAMS. Otherwise this function inserts NAME in SESE_PARAMS
796 and returns the index of NAME. */
797
798 static int
799 parameter_index_in_region (tree name, sese region)
800 {
801 int i;
802
803 gcc_assert (TREE_CODE (name) == SSA_NAME);
804
805 i = parameter_index_in_region_1 (name, region);
806 if (i != -1)
807 return i;
808
809 gcc_assert (SESE_ADD_PARAMS (region));
810
811 i = SESE_PARAMS (region).length ();
812 SESE_PARAMS (region).safe_push (name);
813 return i;
814 }
815
816 /* Extract an affine expression from the tree E in the scop S. */
817
818 static isl_pw_aff *
819 extract_affine (scop_p s, tree e, __isl_take isl_space *space)
820 {
821 isl_pw_aff *lhs, *rhs, *res;
822 tree type;
823
824 if (e == chrec_dont_know) {
825 isl_space_free (space);
826 return NULL;
827 }
828
829 switch (TREE_CODE (e))
830 {
831 case POLYNOMIAL_CHREC:
832 res = extract_affine_chrec (s, e, space);
833 break;
834
835 case MULT_EXPR:
836 res = extract_affine_mul (s, e, space);
837 break;
838
839 case PLUS_EXPR:
840 case POINTER_PLUS_EXPR:
841 lhs = extract_affine (s, TREE_OPERAND (e, 0), isl_space_copy (space));
842 rhs = extract_affine (s, TREE_OPERAND (e, 1), space);
843 res = isl_pw_aff_add (lhs, rhs);
844 break;
845
846 case MINUS_EXPR:
847 lhs = extract_affine (s, TREE_OPERAND (e, 0), isl_space_copy (space));
848 rhs = extract_affine (s, TREE_OPERAND (e, 1), space);
849 res = isl_pw_aff_sub (lhs, rhs);
850 break;
851
852 case NEGATE_EXPR:
853 case BIT_NOT_EXPR:
854 lhs = extract_affine (s, TREE_OPERAND (e, 0), isl_space_copy (space));
855 rhs = extract_affine (s, integer_minus_one_node, space);
856 res = isl_pw_aff_mul (lhs, rhs);
857 break;
858
859 case SSA_NAME:
860 gcc_assert (-1 != parameter_index_in_region_1 (e, SCOP_REGION (s)));
861 res = extract_affine_name (s, e, space);
862 break;
863
864 case INTEGER_CST:
865 res = extract_affine_int (e, space);
866 /* No need to wrap a single integer. */
867 return res;
868
869 CASE_CONVERT:
870 case NON_LVALUE_EXPR:
871 res = extract_affine (s, TREE_OPERAND (e, 0), space);
872 break;
873
874 default:
875 gcc_unreachable ();
876 break;
877 }
878
879 type = TREE_TYPE (e);
880 if (TYPE_UNSIGNED (type))
881 res = wrap (res, TYPE_PRECISION (type));
882
883 return res;
884 }
885
886 /* In the context of sese S, scan the expression E and translate it to
887 a linear expression C. When parsing a symbolic multiplication, K
888 represents the constant multiplier of an expression containing
889 parameters. */
890
891 static void
892 scan_tree_for_params (sese s, tree e)
893 {
894 if (e == chrec_dont_know)
895 return;
896
897 switch (TREE_CODE (e))
898 {
899 case POLYNOMIAL_CHREC:
900 scan_tree_for_params (s, CHREC_LEFT (e));
901 break;
902
903 case MULT_EXPR:
904 if (chrec_contains_symbols (TREE_OPERAND (e, 0)))
905 scan_tree_for_params (s, TREE_OPERAND (e, 0));
906 else
907 scan_tree_for_params (s, TREE_OPERAND (e, 1));
908 break;
909
910 case PLUS_EXPR:
911 case POINTER_PLUS_EXPR:
912 case MINUS_EXPR:
913 scan_tree_for_params (s, TREE_OPERAND (e, 0));
914 scan_tree_for_params (s, TREE_OPERAND (e, 1));
915 break;
916
917 case NEGATE_EXPR:
918 case BIT_NOT_EXPR:
919 CASE_CONVERT:
920 case NON_LVALUE_EXPR:
921 scan_tree_for_params (s, TREE_OPERAND (e, 0));
922 break;
923
924 case SSA_NAME:
925 parameter_index_in_region (e, s);
926 break;
927
928 case INTEGER_CST:
929 case ADDR_EXPR:
930 break;
931
932 default:
933 gcc_unreachable ();
934 break;
935 }
936 }
937
938 /* Find parameters with respect to REGION in BB. We are looking in memory
939 access functions, conditions and loop bounds. */
940
941 static void
942 find_params_in_bb (sese region, gimple_bb_p gbb)
943 {
944 int i;
945 unsigned j;
946 data_reference_p dr;
947 gimple stmt;
948 loop_p loop = GBB_BB (gbb)->loop_father;
949
950 /* Find parameters in the access functions of data references. */
951 FOR_EACH_VEC_ELT (GBB_DATA_REFS (gbb), i, dr)
952 for (j = 0; j < DR_NUM_DIMENSIONS (dr); j++)
953 scan_tree_for_params (region, DR_ACCESS_FN (dr, j));
954
955 /* Find parameters in conditional statements. */
956 FOR_EACH_VEC_ELT (GBB_CONDITIONS (gbb), i, stmt)
957 {
958 tree lhs = scalar_evolution_in_region (region, loop,
959 gimple_cond_lhs (stmt));
960 tree rhs = scalar_evolution_in_region (region, loop,
961 gimple_cond_rhs (stmt));
962
963 scan_tree_for_params (region, lhs);
964 scan_tree_for_params (region, rhs);
965 }
966 }
967
968 /* Record the parameters used in the SCOP. A variable is a parameter
969 in a scop if it does not vary during the execution of that scop. */
970
971 static void
972 find_scop_parameters (scop_p scop)
973 {
974 poly_bb_p pbb;
975 unsigned i;
976 sese region = SCOP_REGION (scop);
977 struct loop *loop;
978 int nbp;
979
980 /* Find the parameters used in the loop bounds. */
981 FOR_EACH_VEC_ELT (SESE_LOOP_NEST (region), i, loop)
982 {
983 tree nb_iters = number_of_latch_executions (loop);
984
985 if (!chrec_contains_symbols (nb_iters))
986 continue;
987
988 nb_iters = scalar_evolution_in_region (region, loop, nb_iters);
989 scan_tree_for_params (region, nb_iters);
990 }
991
992 /* Find the parameters used in data accesses. */
993 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
994 find_params_in_bb (region, PBB_BLACK_BOX (pbb));
995
996 nbp = sese_nb_params (region);
997 scop_set_nb_params (scop, nbp);
998 SESE_ADD_PARAMS (region) = false;
999
1000 {
1001 tree e;
1002 isl_space *space = isl_space_set_alloc (scop->ctx, nbp, 0);
1003
1004 FOR_EACH_VEC_ELT (SESE_PARAMS (region), i, e)
1005 space = isl_space_set_dim_id (space, isl_dim_param, i,
1006 isl_id_for_ssa_name (scop, e));
1007
1008 scop->context = isl_set_universe (space);
1009 }
1010 }
1011
1012 /* Builds the constraint polyhedra for LOOP in SCOP. OUTER_PH gives
1013 the constraints for the surrounding loops. */
1014
1015 static void
1016 build_loop_iteration_domains (scop_p scop, struct loop *loop,
1017 int nb,
1018 isl_set *outer, isl_set **doms)
1019 {
1020 tree nb_iters = number_of_latch_executions (loop);
1021 sese region = SCOP_REGION (scop);
1022
1023 isl_set *inner = isl_set_copy (outer);
1024 isl_space *space;
1025 isl_constraint *c;
1026 int pos = isl_set_dim (outer, isl_dim_set);
1027 isl_val *v;
1028 mpz_t g;
1029
1030 mpz_init (g);
1031
1032 inner = isl_set_add_dims (inner, isl_dim_set, 1);
1033 space = isl_set_get_space (inner);
1034
1035 /* 0 <= loop_i */
1036 c = isl_inequality_alloc
1037 (isl_local_space_from_space (isl_space_copy (space)));
1038 c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, 1);
1039 inner = isl_set_add_constraint (inner, c);
1040
1041 /* loop_i <= cst_nb_iters */
1042 if (TREE_CODE (nb_iters) == INTEGER_CST)
1043 {
1044 c = isl_inequality_alloc
1045 (isl_local_space_from_space (isl_space_copy (space)));
1046 c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, -1);
1047 tree_int_to_gmp (nb_iters, g);
1048 v = isl_val_int_from_gmp (the_isl_ctx, g);
1049 c = isl_constraint_set_constant_val (c, v);
1050 inner = isl_set_add_constraint (inner, c);
1051 }
1052
1053 /* loop_i <= expr_nb_iters */
1054 else if (!chrec_contains_undetermined (nb_iters))
1055 {
1056 widest_int nit;
1057 isl_pw_aff *aff;
1058 isl_set *valid;
1059 isl_local_space *ls;
1060 isl_aff *al;
1061 isl_set *le;
1062
1063 nb_iters = scalar_evolution_in_region (region, loop, nb_iters);
1064
1065 aff = extract_affine (scop, nb_iters, isl_set_get_space (inner));
1066 valid = isl_pw_aff_nonneg_set (isl_pw_aff_copy (aff));
1067 valid = isl_set_project_out (valid, isl_dim_set, 0,
1068 isl_set_dim (valid, isl_dim_set));
1069 scop->context = isl_set_intersect (scop->context, valid);
1070
1071 ls = isl_local_space_from_space (isl_space_copy (space));
1072 al = isl_aff_set_coefficient_si (isl_aff_zero_on_domain (ls),
1073 isl_dim_in, pos, 1);
1074 le = isl_pw_aff_le_set (isl_pw_aff_from_aff (al),
1075 isl_pw_aff_copy (aff));
1076 inner = isl_set_intersect (inner, le);
1077
1078 if (max_stmt_executions (loop, &nit))
1079 {
1080 /* Insert in the context the constraints from the
1081 estimation of the number of iterations NIT and the
1082 symbolic number of iterations (involving parameter
1083 names) NB_ITERS. First, build the affine expression
1084 "NIT - NB_ITERS" and then say that it is positive,
1085 i.e., NIT approximates NB_ITERS: "NIT >= NB_ITERS". */
1086 isl_pw_aff *approx;
1087 mpz_t g;
1088 isl_set *x;
1089 isl_constraint *c;
1090
1091 mpz_init (g);
1092 wi::to_mpz (nit, g, SIGNED);
1093 mpz_sub_ui (g, g, 1);
1094 approx = extract_affine_gmp (g, isl_set_get_space (inner));
1095 x = isl_pw_aff_ge_set (approx, aff);
1096 x = isl_set_project_out (x, isl_dim_set, 0,
1097 isl_set_dim (x, isl_dim_set));
1098 scop->context = isl_set_intersect (scop->context, x);
1099
1100 c = isl_inequality_alloc
1101 (isl_local_space_from_space (isl_space_copy (space)));
1102 c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, -1);
1103 v = isl_val_int_from_gmp (the_isl_ctx, g);
1104 mpz_clear (g);
1105 c = isl_constraint_set_constant_val (c, v);
1106 inner = isl_set_add_constraint (inner, c);
1107 }
1108 else
1109 isl_pw_aff_free (aff);
1110 }
1111 else
1112 gcc_unreachable ();
1113
1114 if (loop->inner && loop_in_sese_p (loop->inner, region))
1115 build_loop_iteration_domains (scop, loop->inner, nb + 1,
1116 isl_set_copy (inner), doms);
1117
1118 if (nb != 0
1119 && loop->next
1120 && loop_in_sese_p (loop->next, region))
1121 build_loop_iteration_domains (scop, loop->next, nb,
1122 isl_set_copy (outer), doms);
1123
1124 doms[loop->num] = inner;
1125
1126 isl_set_free (outer);
1127 isl_space_free (space);
1128 mpz_clear (g);
1129 }
1130
1131 /* Returns a linear expression for tree T evaluated in PBB. */
1132
1133 static isl_pw_aff *
1134 create_pw_aff_from_tree (poly_bb_p pbb, tree t)
1135 {
1136 scop_p scop = PBB_SCOP (pbb);
1137
1138 t = scalar_evolution_in_region (SCOP_REGION (scop), pbb_loop (pbb), t);
1139 gcc_assert (!automatically_generated_chrec_p (t));
1140
1141 return extract_affine (scop, t, isl_set_get_space (pbb->domain));
1142 }
1143
1144 /* Add conditional statement STMT to pbb. CODE is used as the comparison
1145 operator. This allows us to invert the condition or to handle
1146 inequalities. */
1147
1148 static void
1149 add_condition_to_pbb (poly_bb_p pbb, gcond *stmt, enum tree_code code)
1150 {
1151 isl_pw_aff *lhs = create_pw_aff_from_tree (pbb, gimple_cond_lhs (stmt));
1152 isl_pw_aff *rhs = create_pw_aff_from_tree (pbb, gimple_cond_rhs (stmt));
1153 isl_set *cond;
1154
1155 switch (code)
1156 {
1157 case LT_EXPR:
1158 cond = isl_pw_aff_lt_set (lhs, rhs);
1159 break;
1160
1161 case GT_EXPR:
1162 cond = isl_pw_aff_gt_set (lhs, rhs);
1163 break;
1164
1165 case LE_EXPR:
1166 cond = isl_pw_aff_le_set (lhs, rhs);
1167 break;
1168
1169 case GE_EXPR:
1170 cond = isl_pw_aff_ge_set (lhs, rhs);
1171 break;
1172
1173 case EQ_EXPR:
1174 cond = isl_pw_aff_eq_set (lhs, rhs);
1175 break;
1176
1177 case NE_EXPR:
1178 cond = isl_pw_aff_ne_set (lhs, rhs);
1179 break;
1180
1181 default:
1182 isl_pw_aff_free (lhs);
1183 isl_pw_aff_free (rhs);
1184 return;
1185 }
1186
1187 cond = isl_set_coalesce (cond);
1188 cond = isl_set_set_tuple_id (cond, isl_set_get_tuple_id (pbb->domain));
1189 pbb->domain = isl_set_intersect (pbb->domain, cond);
1190 }
1191
1192 /* Add conditions to the domain of PBB. */
1193
1194 static void
1195 add_conditions_to_domain (poly_bb_p pbb)
1196 {
1197 unsigned int i;
1198 gimple stmt;
1199 gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
1200
1201 if (GBB_CONDITIONS (gbb).is_empty ())
1202 return;
1203
1204 FOR_EACH_VEC_ELT (GBB_CONDITIONS (gbb), i, stmt)
1205 switch (gimple_code (stmt))
1206 {
1207 case GIMPLE_COND:
1208 {
1209 gcond *cond_stmt = as_a <gcond *> (stmt);
1210 enum tree_code code = gimple_cond_code (cond_stmt);
1211
1212 /* The conditions for ELSE-branches are inverted. */
1213 if (!GBB_CONDITION_CASES (gbb)[i])
1214 code = invert_tree_comparison (code, false);
1215
1216 add_condition_to_pbb (pbb, cond_stmt, code);
1217 break;
1218 }
1219
1220 case GIMPLE_SWITCH:
1221 /* Switch statements are not supported right now - fall through. */
1222
1223 default:
1224 gcc_unreachable ();
1225 break;
1226 }
1227 }
1228
1229 /* Traverses all the GBBs of the SCOP and add their constraints to the
1230 iteration domains. */
1231
1232 static void
1233 add_conditions_to_constraints (scop_p scop)
1234 {
1235 int i;
1236 poly_bb_p pbb;
1237
1238 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
1239 add_conditions_to_domain (pbb);
1240 }
1241
1242 /* Returns a COND_EXPR statement when BB has a single predecessor, the
1243 edge between BB and its predecessor is not a loop exit edge, and
1244 the last statement of the single predecessor is a COND_EXPR. */
1245
1246 static gcond *
1247 single_pred_cond_non_loop_exit (basic_block bb)
1248 {
1249 if (single_pred_p (bb))
1250 {
1251 edge e = single_pred_edge (bb);
1252 basic_block pred = e->src;
1253 gimple stmt;
1254
1255 if (loop_depth (pred->loop_father) > loop_depth (bb->loop_father))
1256 return NULL;
1257
1258 stmt = last_stmt (pred);
1259
1260 if (stmt && gimple_code (stmt) == GIMPLE_COND)
1261 return as_a <gcond *> (stmt);
1262 }
1263
1264 return NULL;
1265 }
1266
1267 class sese_dom_walker : public dom_walker
1268 {
1269 public:
1270 sese_dom_walker (cdi_direction, sese);
1271
1272 virtual void before_dom_children (basic_block);
1273 virtual void after_dom_children (basic_block);
1274
1275 private:
1276 auto_vec<gimple, 3> m_conditions, m_cases;
1277 sese m_region;
1278 };
1279
1280 sese_dom_walker::sese_dom_walker (cdi_direction direction, sese region)
1281 : dom_walker (direction), m_region (region)
1282 {
1283 }
1284
1285 /* Call-back for dom_walk executed before visiting the dominated
1286 blocks. */
1287
1288 void
1289 sese_dom_walker::before_dom_children (basic_block bb)
1290 {
1291 gimple_bb_p gbb;
1292 gcond *stmt;
1293
1294 if (!bb_in_sese_p (bb, m_region))
1295 return;
1296
1297 stmt = single_pred_cond_non_loop_exit (bb);
1298
1299 if (stmt)
1300 {
1301 edge e = single_pred_edge (bb);
1302
1303 m_conditions.safe_push (stmt);
1304
1305 if (e->flags & EDGE_TRUE_VALUE)
1306 m_cases.safe_push (stmt);
1307 else
1308 m_cases.safe_push (NULL);
1309 }
1310
1311 gbb = gbb_from_bb (bb);
1312
1313 if (gbb)
1314 {
1315 GBB_CONDITIONS (gbb) = m_conditions.copy ();
1316 GBB_CONDITION_CASES (gbb) = m_cases.copy ();
1317 }
1318 }
1319
1320 /* Call-back for dom_walk executed after visiting the dominated
1321 blocks. */
1322
1323 void
1324 sese_dom_walker::after_dom_children (basic_block bb)
1325 {
1326 if (!bb_in_sese_p (bb, m_region))
1327 return;
1328
1329 if (single_pred_cond_non_loop_exit (bb))
1330 {
1331 m_conditions.pop ();
1332 m_cases.pop ();
1333 }
1334 }
1335
1336 /* Add constraints on the possible values of parameter P from the type
1337 of P. */
1338
1339 static void
1340 add_param_constraints (scop_p scop, graphite_dim_t p)
1341 {
1342 tree parameter = SESE_PARAMS (SCOP_REGION (scop))[p];
1343 tree type = TREE_TYPE (parameter);
1344 tree lb = NULL_TREE;
1345 tree ub = NULL_TREE;
1346
1347 if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
1348 lb = lower_bound_in_type (type, type);
1349 else
1350 lb = TYPE_MIN_VALUE (type);
1351
1352 if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
1353 ub = upper_bound_in_type (type, type);
1354 else
1355 ub = TYPE_MAX_VALUE (type);
1356
1357 if (lb)
1358 {
1359 isl_space *space = isl_set_get_space (scop->context);
1360 isl_constraint *c;
1361 mpz_t g;
1362 isl_val *v;
1363
1364 c = isl_inequality_alloc (isl_local_space_from_space (space));
1365 mpz_init (g);
1366 tree_int_to_gmp (lb, g);
1367 v = isl_val_int_from_gmp (the_isl_ctx, g);
1368 v = isl_val_neg (v);
1369 mpz_clear (g);
1370 c = isl_constraint_set_constant_val (c, v);
1371 c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, 1);
1372
1373 scop->context = isl_set_add_constraint (scop->context, c);
1374 }
1375
1376 if (ub)
1377 {
1378 isl_space *space = isl_set_get_space (scop->context);
1379 isl_constraint *c;
1380 mpz_t g;
1381 isl_val *v;
1382
1383 c = isl_inequality_alloc (isl_local_space_from_space (space));
1384
1385 mpz_init (g);
1386 tree_int_to_gmp (ub, g);
1387 v = isl_val_int_from_gmp (the_isl_ctx, g);
1388 mpz_clear (g);
1389 c = isl_constraint_set_constant_val (c, v);
1390 c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, -1);
1391
1392 scop->context = isl_set_add_constraint (scop->context, c);
1393 }
1394 }
1395
1396 /* Build the context of the SCOP. The context usually contains extra
1397 constraints that are added to the iteration domains that constrain
1398 some parameters. */
1399
1400 static void
1401 build_scop_context (scop_p scop)
1402 {
1403 graphite_dim_t p, n = scop_nb_params (scop);
1404
1405 for (p = 0; p < n; p++)
1406 add_param_constraints (scop, p);
1407 }
1408
1409 /* Build the iteration domains: the loops belonging to the current
1410 SCOP, and that vary for the execution of the current basic block.
1411 Returns false if there is no loop in SCOP. */
1412
1413 static void
1414 build_scop_iteration_domain (scop_p scop)
1415 {
1416 struct loop *loop;
1417 sese region = SCOP_REGION (scop);
1418 int i;
1419 poly_bb_p pbb;
1420 int nb_loops = number_of_loops (cfun);
1421 isl_set **doms = XCNEWVEC (isl_set *, nb_loops);
1422
1423 FOR_EACH_VEC_ELT (SESE_LOOP_NEST (region), i, loop)
1424 if (!loop_in_sese_p (loop_outer (loop), region))
1425 build_loop_iteration_domains (scop, loop, 0,
1426 isl_set_copy (scop->context), doms);
1427
1428 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
1429 {
1430 loop = pbb_loop (pbb);
1431
1432 if (doms[loop->num])
1433 pbb->domain = isl_set_copy (doms[loop->num]);
1434 else
1435 pbb->domain = isl_set_copy (scop->context);
1436
1437 pbb->domain = isl_set_set_tuple_id (pbb->domain,
1438 isl_id_for_pbb (scop, pbb));
1439 }
1440
1441 for (i = 0; i < nb_loops; i++)
1442 if (doms[i])
1443 isl_set_free (doms[i]);
1444
1445 free (doms);
1446 }
1447
1448 /* Add a constrain to the ACCESSES polyhedron for the alias set of
1449 data reference DR. ACCESSP_NB_DIMS is the dimension of the
1450 ACCESSES polyhedron, DOM_NB_DIMS is the dimension of the iteration
1451 domain. */
1452
1453 static isl_map *
1454 pdr_add_alias_set (isl_map *acc, data_reference_p dr)
1455 {
1456 isl_constraint *c;
1457 int alias_set_num = 0;
1458 base_alias_pair *bap = (base_alias_pair *)(dr->aux);
1459
1460 if (bap && bap->alias_set)
1461 alias_set_num = *(bap->alias_set);
1462
1463 c = isl_equality_alloc
1464 (isl_local_space_from_space (isl_map_get_space (acc)));
1465 c = isl_constraint_set_constant_si (c, -alias_set_num);
1466 c = isl_constraint_set_coefficient_si (c, isl_dim_out, 0, 1);
1467
1468 return isl_map_add_constraint (acc, c);
1469 }
1470
1471 /* Assign the affine expression INDEX to the output dimension POS of
1472 MAP and return the result. */
1473
1474 static isl_map *
1475 set_index (isl_map *map, int pos, isl_pw_aff *index)
1476 {
1477 isl_map *index_map;
1478 int len = isl_map_dim (map, isl_dim_out);
1479 isl_id *id;
1480
1481 index_map = isl_map_from_pw_aff (index);
1482 index_map = isl_map_insert_dims (index_map, isl_dim_out, 0, pos);
1483 index_map = isl_map_add_dims (index_map, isl_dim_out, len - pos - 1);
1484
1485 id = isl_map_get_tuple_id (map, isl_dim_out);
1486 index_map = isl_map_set_tuple_id (index_map, isl_dim_out, id);
1487 id = isl_map_get_tuple_id (map, isl_dim_in);
1488 index_map = isl_map_set_tuple_id (index_map, isl_dim_in, id);
1489
1490 return isl_map_intersect (map, index_map);
1491 }
1492
1493 /* Add to ACCESSES polyhedron equalities defining the access functions
1494 to the memory. ACCESSP_NB_DIMS is the dimension of the ACCESSES
1495 polyhedron, DOM_NB_DIMS is the dimension of the iteration domain.
1496 PBB is the poly_bb_p that contains the data reference DR. */
1497
1498 static isl_map *
1499 pdr_add_memory_accesses (isl_map *acc, data_reference_p dr, poly_bb_p pbb)
1500 {
1501 int i, nb_subscripts = DR_NUM_DIMENSIONS (dr);
1502 scop_p scop = PBB_SCOP (pbb);
1503
1504 for (i = 0; i < nb_subscripts; i++)
1505 {
1506 isl_pw_aff *aff;
1507 tree afn = DR_ACCESS_FN (dr, nb_subscripts - 1 - i);
1508
1509 aff = extract_affine (scop, afn,
1510 isl_space_domain (isl_map_get_space (acc)));
1511 acc = set_index (acc, i + 1, aff);
1512 }
1513
1514 return acc;
1515 }
1516
1517 /* Add constrains representing the size of the accessed data to the
1518 ACCESSES polyhedron. ACCESSP_NB_DIMS is the dimension of the
1519 ACCESSES polyhedron, DOM_NB_DIMS is the dimension of the iteration
1520 domain. */
1521
1522 static isl_set *
1523 pdr_add_data_dimensions (isl_set *extent, scop_p scop, data_reference_p dr)
1524 {
1525 tree ref = DR_REF (dr);
1526 int i, nb_subscripts = DR_NUM_DIMENSIONS (dr);
1527
1528 for (i = nb_subscripts - 1; i >= 0; i--, ref = TREE_OPERAND (ref, 0))
1529 {
1530 tree low, high;
1531
1532 if (TREE_CODE (ref) != ARRAY_REF)
1533 break;
1534
1535 low = array_ref_low_bound (ref);
1536 high = array_ref_up_bound (ref);
1537
1538 /* XXX The PPL code dealt separately with
1539 subscript - low >= 0 and high - subscript >= 0 in case one of
1540 the two bounds isn't known. Do the same here? */
1541
1542 if (tree_fits_shwi_p (low)
1543 && high
1544 && tree_fits_shwi_p (high)
1545 /* 1-element arrays at end of structures may extend over
1546 their declared size. */
1547 && !(array_at_struct_end_p (ref)
1548 && operand_equal_p (low, high, 0)))
1549 {
1550 isl_id *id;
1551 isl_aff *aff;
1552 isl_set *univ, *lbs, *ubs;
1553 isl_pw_aff *index;
1554 isl_space *space;
1555 isl_set *valid;
1556 isl_pw_aff *lb = extract_affine_int (low, isl_set_get_space (extent));
1557 isl_pw_aff *ub = extract_affine_int (high, isl_set_get_space (extent));
1558
1559 /* high >= 0 */
1560 valid = isl_pw_aff_nonneg_set (isl_pw_aff_copy (ub));
1561 valid = isl_set_project_out (valid, isl_dim_set, 0,
1562 isl_set_dim (valid, isl_dim_set));
1563 scop->context = isl_set_intersect (scop->context, valid);
1564
1565 space = isl_set_get_space (extent);
1566 aff = isl_aff_zero_on_domain (isl_local_space_from_space (space));
1567 aff = isl_aff_add_coefficient_si (aff, isl_dim_in, i + 1, 1);
1568 univ = isl_set_universe (isl_space_domain (isl_aff_get_space (aff)));
1569 index = isl_pw_aff_alloc (univ, aff);
1570
1571 id = isl_set_get_tuple_id (extent);
1572 lb = isl_pw_aff_set_tuple_id (lb, isl_dim_in, isl_id_copy (id));
1573 ub = isl_pw_aff_set_tuple_id (ub, isl_dim_in, id);
1574
1575 /* low <= sub_i <= high */
1576 lbs = isl_pw_aff_ge_set (isl_pw_aff_copy (index), lb);
1577 ubs = isl_pw_aff_le_set (index, ub);
1578 extent = isl_set_intersect (extent, lbs);
1579 extent = isl_set_intersect (extent, ubs);
1580 }
1581 }
1582
1583 return extent;
1584 }
1585
1586 /* Build data accesses for DR in PBB. */
1587
1588 static void
1589 build_poly_dr (data_reference_p dr, poly_bb_p pbb)
1590 {
1591 int dr_base_object_set;
1592 isl_map *acc;
1593 isl_set *extent;
1594 scop_p scop = PBB_SCOP (pbb);
1595
1596 {
1597 isl_space *dc = isl_set_get_space (pbb->domain);
1598 int nb_out = 1 + DR_NUM_DIMENSIONS (dr);
1599 isl_space *space = isl_space_add_dims (isl_space_from_domain (dc),
1600 isl_dim_out, nb_out);
1601
1602 acc = isl_map_universe (space);
1603 acc = isl_map_set_tuple_id (acc, isl_dim_out, isl_id_for_dr (scop, dr));
1604 }
1605
1606 acc = pdr_add_alias_set (acc, dr);
1607 acc = pdr_add_memory_accesses (acc, dr, pbb);
1608
1609 {
1610 isl_id *id = isl_id_for_dr (scop, dr);
1611 int nb = 1 + DR_NUM_DIMENSIONS (dr);
1612 isl_space *space = isl_space_set_alloc (scop->ctx, 0, nb);
1613 int alias_set_num = 0;
1614 base_alias_pair *bap = (base_alias_pair *)(dr->aux);
1615
1616 if (bap && bap->alias_set)
1617 alias_set_num = *(bap->alias_set);
1618
1619 space = isl_space_set_tuple_id (space, isl_dim_set, id);
1620 extent = isl_set_nat_universe (space);
1621 extent = isl_set_fix_si (extent, isl_dim_set, 0, alias_set_num);
1622 extent = pdr_add_data_dimensions (extent, scop, dr);
1623 }
1624
1625 gcc_assert (dr->aux);
1626 dr_base_object_set = ((base_alias_pair *)(dr->aux))->base_obj_set;
1627
1628 new_poly_dr (pbb, dr_base_object_set,
1629 DR_IS_READ (dr) ? PDR_READ : PDR_WRITE,
1630 dr, DR_NUM_DIMENSIONS (dr), acc, extent);
1631 }
1632
1633 /* Write to FILE the alias graph of data references in DIMACS format. */
1634
1635 static inline bool
1636 write_alias_graph_to_ascii_dimacs (FILE *file, char *comment,
1637 vec<data_reference_p> drs)
1638 {
1639 int num_vertex = drs.length ();
1640 int edge_num = 0;
1641 data_reference_p dr1, dr2;
1642 int i, j;
1643
1644 if (num_vertex == 0)
1645 return true;
1646
1647 FOR_EACH_VEC_ELT (drs, i, dr1)
1648 for (j = i + 1; drs.iterate (j, &dr2); j++)
1649 if (dr_may_alias_p (dr1, dr2, true))
1650 edge_num++;
1651
1652 fprintf (file, "$\n");
1653
1654 if (comment)
1655 fprintf (file, "c %s\n", comment);
1656
1657 fprintf (file, "p edge %d %d\n", num_vertex, edge_num);
1658
1659 FOR_EACH_VEC_ELT (drs, i, dr1)
1660 for (j = i + 1; drs.iterate (j, &dr2); j++)
1661 if (dr_may_alias_p (dr1, dr2, true))
1662 fprintf (file, "e %d %d\n", i + 1, j + 1);
1663
1664 return true;
1665 }
1666
1667 /* Write to FILE the alias graph of data references in DOT format. */
1668
1669 static inline bool
1670 write_alias_graph_to_ascii_dot (FILE *file, char *comment,
1671 vec<data_reference_p> drs)
1672 {
1673 int num_vertex = drs.length ();
1674 data_reference_p dr1, dr2;
1675 int i, j;
1676
1677 if (num_vertex == 0)
1678 return true;
1679
1680 fprintf (file, "$\n");
1681
1682 if (comment)
1683 fprintf (file, "c %s\n", comment);
1684
1685 /* First print all the vertices. */
1686 FOR_EACH_VEC_ELT (drs, i, dr1)
1687 fprintf (file, "n%d;\n", i);
1688
1689 FOR_EACH_VEC_ELT (drs, i, dr1)
1690 for (j = i + 1; drs.iterate (j, &dr2); j++)
1691 if (dr_may_alias_p (dr1, dr2, true))
1692 fprintf (file, "n%d n%d\n", i, j);
1693
1694 return true;
1695 }
1696
1697 /* Write to FILE the alias graph of data references in ECC format. */
1698
1699 static inline bool
1700 write_alias_graph_to_ascii_ecc (FILE *file, char *comment,
1701 vec<data_reference_p> drs)
1702 {
1703 int num_vertex = drs.length ();
1704 data_reference_p dr1, dr2;
1705 int i, j;
1706
1707 if (num_vertex == 0)
1708 return true;
1709
1710 fprintf (file, "$\n");
1711
1712 if (comment)
1713 fprintf (file, "c %s\n", comment);
1714
1715 FOR_EACH_VEC_ELT (drs, i, dr1)
1716 for (j = i + 1; drs.iterate (j, &dr2); j++)
1717 if (dr_may_alias_p (dr1, dr2, true))
1718 fprintf (file, "%d %d\n", i, j);
1719
1720 return true;
1721 }
1722
1723 /* Check if DR1 and DR2 are in the same object set. */
1724
1725 static bool
1726 dr_same_base_object_p (const struct data_reference *dr1,
1727 const struct data_reference *dr2)
1728 {
1729 return operand_equal_p (DR_BASE_OBJECT (dr1), DR_BASE_OBJECT (dr2), 0);
1730 }
1731
1732 /* Uses DFS component number as representative of alias-sets. Also tests for
1733 optimality by verifying if every connected component is a clique. Returns
1734 true (1) if the above test is true, and false (0) otherwise. */
1735
1736 static int
1737 build_alias_set_optimal_p (vec<data_reference_p> drs)
1738 {
1739 int num_vertices = drs.length ();
1740 struct graph *g = new_graph (num_vertices);
1741 data_reference_p dr1, dr2;
1742 int i, j;
1743 int num_connected_components;
1744 int v_indx1, v_indx2, num_vertices_in_component;
1745 int *all_vertices;
1746 int *vertices;
1747 struct graph_edge *e;
1748 int this_component_is_clique;
1749 int all_components_are_cliques = 1;
1750
1751 FOR_EACH_VEC_ELT (drs, i, dr1)
1752 for (j = i+1; drs.iterate (j, &dr2); j++)
1753 if (dr_may_alias_p (dr1, dr2, true))
1754 {
1755 add_edge (g, i, j);
1756 add_edge (g, j, i);
1757 }
1758
1759 all_vertices = XNEWVEC (int, num_vertices);
1760 vertices = XNEWVEC (int, num_vertices);
1761 for (i = 0; i < num_vertices; i++)
1762 all_vertices[i] = i;
1763
1764 num_connected_components = graphds_dfs (g, all_vertices, num_vertices,
1765 NULL, true, NULL);
1766 for (i = 0; i < g->n_vertices; i++)
1767 {
1768 data_reference_p dr = drs[i];
1769 base_alias_pair *bap;
1770
1771 gcc_assert (dr->aux);
1772 bap = (base_alias_pair *)(dr->aux);
1773
1774 bap->alias_set = XNEW (int);
1775 *(bap->alias_set) = g->vertices[i].component + 1;
1776 }
1777
1778 /* Verify if the DFS numbering results in optimal solution. */
1779 for (i = 0; i < num_connected_components; i++)
1780 {
1781 num_vertices_in_component = 0;
1782 /* Get all vertices whose DFS component number is the same as i. */
1783 for (j = 0; j < num_vertices; j++)
1784 if (g->vertices[j].component == i)
1785 vertices[num_vertices_in_component++] = j;
1786
1787 /* Now test if the vertices in 'vertices' form a clique, by testing
1788 for edges among each pair. */
1789 this_component_is_clique = 1;
1790 for (v_indx1 = 0; v_indx1 < num_vertices_in_component; v_indx1++)
1791 {
1792 for (v_indx2 = v_indx1+1; v_indx2 < num_vertices_in_component; v_indx2++)
1793 {
1794 /* Check if the two vertices are connected by iterating
1795 through all the edges which have one of these are source. */
1796 e = g->vertices[vertices[v_indx2]].pred;
1797 while (e)
1798 {
1799 if (e->src == vertices[v_indx1])
1800 break;
1801 e = e->pred_next;
1802 }
1803 if (!e)
1804 {
1805 this_component_is_clique = 0;
1806 break;
1807 }
1808 }
1809 if (!this_component_is_clique)
1810 all_components_are_cliques = 0;
1811 }
1812 }
1813
1814 free (all_vertices);
1815 free (vertices);
1816 free_graph (g);
1817 return all_components_are_cliques;
1818 }
1819
1820 /* Group each data reference in DRS with its base object set num. */
1821
1822 static void
1823 build_base_obj_set_for_drs (vec<data_reference_p> drs)
1824 {
1825 int num_vertex = drs.length ();
1826 struct graph *g = new_graph (num_vertex);
1827 data_reference_p dr1, dr2;
1828 int i, j;
1829 int *queue;
1830
1831 FOR_EACH_VEC_ELT (drs, i, dr1)
1832 for (j = i + 1; drs.iterate (j, &dr2); j++)
1833 if (dr_same_base_object_p (dr1, dr2))
1834 {
1835 add_edge (g, i, j);
1836 add_edge (g, j, i);
1837 }
1838
1839 queue = XNEWVEC (int, num_vertex);
1840 for (i = 0; i < num_vertex; i++)
1841 queue[i] = i;
1842
1843 graphds_dfs (g, queue, num_vertex, NULL, true, NULL);
1844
1845 for (i = 0; i < g->n_vertices; i++)
1846 {
1847 data_reference_p dr = drs[i];
1848 base_alias_pair *bap;
1849
1850 gcc_assert (dr->aux);
1851 bap = (base_alias_pair *)(dr->aux);
1852
1853 bap->base_obj_set = g->vertices[i].component + 1;
1854 }
1855
1856 free (queue);
1857 free_graph (g);
1858 }
1859
1860 /* Build the data references for PBB. */
1861
1862 static void
1863 build_pbb_drs (poly_bb_p pbb)
1864 {
1865 int j;
1866 data_reference_p dr;
1867 vec<data_reference_p> gbb_drs = GBB_DATA_REFS (PBB_BLACK_BOX (pbb));
1868
1869 FOR_EACH_VEC_ELT (gbb_drs, j, dr)
1870 build_poly_dr (dr, pbb);
1871 }
1872
1873 /* Dump to file the alias graphs for the data references in DRS. */
1874
1875 static void
1876 dump_alias_graphs (vec<data_reference_p> drs)
1877 {
1878 char comment[100];
1879 FILE *file_dimacs, *file_ecc, *file_dot;
1880
1881 file_dimacs = fopen ("/tmp/dr_alias_graph_dimacs", "ab");
1882 if (file_dimacs)
1883 {
1884 snprintf (comment, sizeof (comment), "%s %s", main_input_filename,
1885 current_function_name ());
1886 write_alias_graph_to_ascii_dimacs (file_dimacs, comment, drs);
1887 fclose (file_dimacs);
1888 }
1889
1890 file_ecc = fopen ("/tmp/dr_alias_graph_ecc", "ab");
1891 if (file_ecc)
1892 {
1893 snprintf (comment, sizeof (comment), "%s %s", main_input_filename,
1894 current_function_name ());
1895 write_alias_graph_to_ascii_ecc (file_ecc, comment, drs);
1896 fclose (file_ecc);
1897 }
1898
1899 file_dot = fopen ("/tmp/dr_alias_graph_dot", "ab");
1900 if (file_dot)
1901 {
1902 snprintf (comment, sizeof (comment), "%s %s", main_input_filename,
1903 current_function_name ());
1904 write_alias_graph_to_ascii_dot (file_dot, comment, drs);
1905 fclose (file_dot);
1906 }
1907 }
1908
1909 /* Build data references in SCOP. */
1910
1911 static void
1912 build_scop_drs (scop_p scop)
1913 {
1914 int i, j;
1915 poly_bb_p pbb;
1916 data_reference_p dr;
1917 auto_vec<data_reference_p, 3> drs;
1918
1919 /* Remove all the PBBs that do not have data references: these basic
1920 blocks are not handled in the polyhedral representation. */
1921 for (i = 0; SCOP_BBS (scop).iterate (i, &pbb); i++)
1922 if (GBB_DATA_REFS (PBB_BLACK_BOX (pbb)).is_empty ())
1923 {
1924 free_gimple_bb (PBB_BLACK_BOX (pbb));
1925 free_poly_bb (pbb);
1926 SCOP_BBS (scop).ordered_remove (i);
1927 i--;
1928 }
1929
1930 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
1931 for (j = 0; GBB_DATA_REFS (PBB_BLACK_BOX (pbb)).iterate (j, &dr); j++)
1932 drs.safe_push (dr);
1933
1934 FOR_EACH_VEC_ELT (drs, i, dr)
1935 dr->aux = XNEW (base_alias_pair);
1936
1937 if (!build_alias_set_optimal_p (drs))
1938 {
1939 /* TODO: Add support when building alias set is not optimal. */
1940 ;
1941 }
1942
1943 build_base_obj_set_for_drs (drs);
1944
1945 /* When debugging, enable the following code. This cannot be used
1946 in production compilers. */
1947 if (0)
1948 dump_alias_graphs (drs);
1949
1950 drs.release ();
1951
1952 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
1953 build_pbb_drs (pbb);
1954 }
1955
1956 /* Return a gsi at the position of the phi node STMT. */
1957
1958 static gphi_iterator
1959 gsi_for_phi_node (gphi *stmt)
1960 {
1961 gphi_iterator psi;
1962 basic_block bb = gimple_bb (stmt);
1963
1964 for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
1965 if (stmt == psi.phi ())
1966 return psi;
1967
1968 gcc_unreachable ();
1969 return psi;
1970 }
1971
1972 /* Analyze all the data references of STMTS and add them to the
1973 GBB_DATA_REFS vector of BB. */
1974
1975 static void
1976 analyze_drs_in_stmts (scop_p scop, basic_block bb, vec<gimple> stmts)
1977 {
1978 loop_p nest;
1979 gimple_bb_p gbb;
1980 gimple stmt;
1981 int i;
1982 sese region = SCOP_REGION (scop);
1983
1984 if (!bb_in_sese_p (bb, region))
1985 return;
1986
1987 nest = outermost_loop_in_sese_1 (region, bb);
1988 gbb = gbb_from_bb (bb);
1989
1990 FOR_EACH_VEC_ELT (stmts, i, stmt)
1991 {
1992 loop_p loop;
1993
1994 if (is_gimple_debug (stmt))
1995 continue;
1996
1997 loop = loop_containing_stmt (stmt);
1998 if (!loop_in_sese_p (loop, region))
1999 loop = nest;
2000
2001 graphite_find_data_references_in_stmt (nest, loop, stmt,
2002 &GBB_DATA_REFS (gbb));
2003 }
2004 }
2005
2006 /* Insert STMT at the end of the STMTS sequence and then insert the
2007 statements from STMTS at INSERT_GSI and call analyze_drs_in_stmts
2008 on STMTS. */
2009
2010 static void
2011 insert_stmts (scop_p scop, gimple stmt, gimple_seq stmts,
2012 gimple_stmt_iterator insert_gsi)
2013 {
2014 gimple_stmt_iterator gsi;
2015 auto_vec<gimple, 3> x;
2016
2017 gimple_seq_add_stmt (&stmts, stmt);
2018 for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
2019 x.safe_push (gsi_stmt (gsi));
2020
2021 gsi_insert_seq_before (&insert_gsi, stmts, GSI_SAME_STMT);
2022 analyze_drs_in_stmts (scop, gsi_bb (insert_gsi), x);
2023 }
2024
2025 /* Insert the assignment "RES := EXPR" just after AFTER_STMT. */
2026
2027 static void
2028 insert_out_of_ssa_copy (scop_p scop, tree res, tree expr, gimple after_stmt)
2029 {
2030 gimple_seq stmts;
2031 gimple_stmt_iterator gsi;
2032 tree var = force_gimple_operand (expr, &stmts, true, NULL_TREE);
2033 gassign *stmt = gimple_build_assign (unshare_expr (res), var);
2034 auto_vec<gimple, 3> x;
2035
2036 gimple_seq_add_stmt (&stmts, stmt);
2037 for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
2038 x.safe_push (gsi_stmt (gsi));
2039
2040 if (gimple_code (after_stmt) == GIMPLE_PHI)
2041 {
2042 gsi = gsi_after_labels (gimple_bb (after_stmt));
2043 gsi_insert_seq_before (&gsi, stmts, GSI_NEW_STMT);
2044 }
2045 else
2046 {
2047 gsi = gsi_for_stmt (after_stmt);
2048 gsi_insert_seq_after (&gsi, stmts, GSI_NEW_STMT);
2049 }
2050
2051 analyze_drs_in_stmts (scop, gimple_bb (after_stmt), x);
2052 }
2053
2054 /* Creates a poly_bb_p for basic_block BB from the existing PBB. */
2055
2056 static void
2057 new_pbb_from_pbb (scop_p scop, poly_bb_p pbb, basic_block bb)
2058 {
2059 vec<data_reference_p> drs;
2060 drs.create (3);
2061 gimple_bb_p gbb = PBB_BLACK_BOX (pbb);
2062 gimple_bb_p gbb1 = new_gimple_bb (bb, drs);
2063 poly_bb_p pbb1 = new_poly_bb (scop, gbb1);
2064 int index, n = SCOP_BBS (scop).length ();
2065
2066 /* The INDEX of PBB in SCOP_BBS. */
2067 for (index = 0; index < n; index++)
2068 if (SCOP_BBS (scop)[index] == pbb)
2069 break;
2070
2071 pbb1->domain = isl_set_copy (pbb->domain);
2072 pbb1->domain = isl_set_set_tuple_id (pbb1->domain,
2073 isl_id_for_pbb (scop, pbb1));
2074
2075 GBB_PBB (gbb1) = pbb1;
2076 GBB_CONDITIONS (gbb1) = GBB_CONDITIONS (gbb).copy ();
2077 GBB_CONDITION_CASES (gbb1) = GBB_CONDITION_CASES (gbb).copy ();
2078 SCOP_BBS (scop).safe_insert (index + 1, pbb1);
2079 }
2080
2081 /* Insert on edge E the assignment "RES := EXPR". */
2082
2083 static void
2084 insert_out_of_ssa_copy_on_edge (scop_p scop, edge e, tree res, tree expr)
2085 {
2086 gimple_stmt_iterator gsi;
2087 gimple_seq stmts = NULL;
2088 tree var = force_gimple_operand (expr, &stmts, true, NULL_TREE);
2089 gimple stmt = gimple_build_assign (unshare_expr (res), var);
2090 basic_block bb;
2091 auto_vec<gimple, 3> x;
2092
2093 gimple_seq_add_stmt (&stmts, stmt);
2094 for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
2095 x.safe_push (gsi_stmt (gsi));
2096
2097 gsi_insert_seq_on_edge (e, stmts);
2098 gsi_commit_edge_inserts ();
2099 bb = gimple_bb (stmt);
2100
2101 if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
2102 return;
2103
2104 if (!gbb_from_bb (bb))
2105 new_pbb_from_pbb (scop, pbb_from_bb (e->src), bb);
2106
2107 analyze_drs_in_stmts (scop, bb, x);
2108 }
2109
2110 /* Creates a zero dimension array of the same type as VAR. */
2111
2112 static tree
2113 create_zero_dim_array (tree var, const char *base_name)
2114 {
2115 tree index_type = build_index_type (integer_zero_node);
2116 tree elt_type = TREE_TYPE (var);
2117 tree array_type = build_array_type (elt_type, index_type);
2118 tree base = create_tmp_var (array_type, base_name);
2119
2120 return build4 (ARRAY_REF, elt_type, base, integer_zero_node, NULL_TREE,
2121 NULL_TREE);
2122 }
2123
2124 /* Returns true when PHI is a loop close phi node. */
2125
2126 static bool
2127 scalar_close_phi_node_p (gimple phi)
2128 {
2129 if (gimple_code (phi) != GIMPLE_PHI
2130 || virtual_operand_p (gimple_phi_result (phi)))
2131 return false;
2132
2133 /* Note that loop close phi nodes should have a single argument
2134 because we translated the representation into a canonical form
2135 before Graphite: see canonicalize_loop_closed_ssa_form. */
2136 return (gimple_phi_num_args (phi) == 1);
2137 }
2138
2139 /* For a definition DEF in REGION, propagates the expression EXPR in
2140 all the uses of DEF outside REGION. */
2141
2142 static void
2143 propagate_expr_outside_region (tree def, tree expr, sese region)
2144 {
2145 imm_use_iterator imm_iter;
2146 gimple use_stmt;
2147 gimple_seq stmts;
2148 bool replaced_once = false;
2149
2150 gcc_assert (TREE_CODE (def) == SSA_NAME);
2151
2152 expr = force_gimple_operand (unshare_expr (expr), &stmts, true,
2153 NULL_TREE);
2154
2155 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
2156 if (!is_gimple_debug (use_stmt)
2157 && !bb_in_sese_p (gimple_bb (use_stmt), region))
2158 {
2159 ssa_op_iter iter;
2160 use_operand_p use_p;
2161
2162 FOR_EACH_PHI_OR_STMT_USE (use_p, use_stmt, iter, SSA_OP_ALL_USES)
2163 if (operand_equal_p (def, USE_FROM_PTR (use_p), 0)
2164 && (replaced_once = true))
2165 replace_exp (use_p, expr);
2166
2167 update_stmt (use_stmt);
2168 }
2169
2170 if (replaced_once)
2171 {
2172 gsi_insert_seq_on_edge (SESE_ENTRY (region), stmts);
2173 gsi_commit_edge_inserts ();
2174 }
2175 }
2176
2177 /* Rewrite out of SSA the reduction phi node at PSI by creating a zero
2178 dimension array for it. */
2179
2180 static void
2181 rewrite_close_phi_out_of_ssa (scop_p scop, gimple_stmt_iterator *psi)
2182 {
2183 sese region = SCOP_REGION (scop);
2184 gimple phi = gsi_stmt (*psi);
2185 tree res = gimple_phi_result (phi);
2186 basic_block bb = gimple_bb (phi);
2187 gimple_stmt_iterator gsi = gsi_after_labels (bb);
2188 tree arg = gimple_phi_arg_def (phi, 0);
2189 gimple stmt;
2190
2191 /* Note that loop close phi nodes should have a single argument
2192 because we translated the representation into a canonical form
2193 before Graphite: see canonicalize_loop_closed_ssa_form. */
2194 gcc_assert (gimple_phi_num_args (phi) == 1);
2195
2196 /* The phi node can be a non close phi node, when its argument is
2197 invariant, or a default definition. */
2198 if (is_gimple_min_invariant (arg)
2199 || SSA_NAME_IS_DEFAULT_DEF (arg))
2200 {
2201 propagate_expr_outside_region (res, arg, region);
2202 gsi_next (psi);
2203 return;
2204 }
2205
2206 else if (gimple_bb (SSA_NAME_DEF_STMT (arg))->loop_father == bb->loop_father)
2207 {
2208 propagate_expr_outside_region (res, arg, region);
2209 stmt = gimple_build_assign (res, arg);
2210 remove_phi_node (psi, false);
2211 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
2212 return;
2213 }
2214
2215 /* If res is scev analyzable and is not a scalar value, it is safe
2216 to ignore the close phi node: it will be code generated in the
2217 out of Graphite pass. */
2218 else if (scev_analyzable_p (res, region))
2219 {
2220 loop_p loop = loop_containing_stmt (SSA_NAME_DEF_STMT (res));
2221 tree scev;
2222
2223 if (!loop_in_sese_p (loop, region))
2224 {
2225 loop = loop_containing_stmt (SSA_NAME_DEF_STMT (arg));
2226 scev = scalar_evolution_in_region (region, loop, arg);
2227 scev = compute_overall_effect_of_inner_loop (loop, scev);
2228 }
2229 else
2230 scev = scalar_evolution_in_region (region, loop, res);
2231
2232 if (tree_does_not_contain_chrecs (scev))
2233 propagate_expr_outside_region (res, scev, region);
2234
2235 gsi_next (psi);
2236 return;
2237 }
2238 else
2239 {
2240 tree zero_dim_array = create_zero_dim_array (res, "Close_Phi");
2241
2242 stmt = gimple_build_assign (res, unshare_expr (zero_dim_array));
2243
2244 if (TREE_CODE (arg) == SSA_NAME)
2245 insert_out_of_ssa_copy (scop, zero_dim_array, arg,
2246 SSA_NAME_DEF_STMT (arg));
2247 else
2248 insert_out_of_ssa_copy_on_edge (scop, single_pred_edge (bb),
2249 zero_dim_array, arg);
2250 }
2251
2252 remove_phi_node (psi, false);
2253 SSA_NAME_DEF_STMT (res) = stmt;
2254
2255 insert_stmts (scop, stmt, NULL, gsi_after_labels (bb));
2256 }
2257
2258 /* Rewrite out of SSA the reduction phi node at PSI by creating a zero
2259 dimension array for it. */
2260
2261 static void
2262 rewrite_phi_out_of_ssa (scop_p scop, gphi_iterator *psi)
2263 {
2264 size_t i;
2265 gphi *phi = psi->phi ();
2266 basic_block bb = gimple_bb (phi);
2267 tree res = gimple_phi_result (phi);
2268 tree zero_dim_array = create_zero_dim_array (res, "phi_out_of_ssa");
2269 gimple stmt;
2270
2271 for (i = 0; i < gimple_phi_num_args (phi); i++)
2272 {
2273 tree arg = gimple_phi_arg_def (phi, i);
2274 edge e = gimple_phi_arg_edge (phi, i);
2275
2276 /* Avoid the insertion of code in the loop latch to please the
2277 pattern matching of the vectorizer. */
2278 if (TREE_CODE (arg) == SSA_NAME
2279 && !SSA_NAME_IS_DEFAULT_DEF (arg)
2280 && e->src == bb->loop_father->latch)
2281 insert_out_of_ssa_copy (scop, zero_dim_array, arg,
2282 SSA_NAME_DEF_STMT (arg));
2283 else
2284 insert_out_of_ssa_copy_on_edge (scop, e, zero_dim_array, arg);
2285 }
2286
2287 stmt = gimple_build_assign (res, unshare_expr (zero_dim_array));
2288 remove_phi_node (psi, false);
2289 insert_stmts (scop, stmt, NULL, gsi_after_labels (bb));
2290 }
2291
2292 /* Rewrite the degenerate phi node at position PSI from the degenerate
2293 form "x = phi (y, y, ..., y)" to "x = y". */
2294
2295 static void
2296 rewrite_degenerate_phi (gphi_iterator *psi)
2297 {
2298 tree rhs;
2299 gimple stmt;
2300 gimple_stmt_iterator gsi;
2301 gphi *phi = psi->phi ();
2302 tree res = gimple_phi_result (phi);
2303 basic_block bb;
2304
2305 bb = gimple_bb (phi);
2306 rhs = degenerate_phi_result (phi);
2307 gcc_assert (rhs);
2308
2309 stmt = gimple_build_assign (res, rhs);
2310 remove_phi_node (psi, false);
2311
2312 gsi = gsi_after_labels (bb);
2313 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
2314 }
2315
2316 /* Rewrite out of SSA all the reduction phi nodes of SCOP. */
2317
2318 static void
2319 rewrite_reductions_out_of_ssa (scop_p scop)
2320 {
2321 basic_block bb;
2322 gphi_iterator psi;
2323 sese region = SCOP_REGION (scop);
2324
2325 FOR_EACH_BB_FN (bb, cfun)
2326 if (bb_in_sese_p (bb, region))
2327 for (psi = gsi_start_phis (bb); !gsi_end_p (psi);)
2328 {
2329 gphi *phi = psi.phi ();
2330
2331 if (virtual_operand_p (gimple_phi_result (phi)))
2332 {
2333 gsi_next (&psi);
2334 continue;
2335 }
2336
2337 if (gimple_phi_num_args (phi) > 1
2338 && degenerate_phi_result (phi))
2339 rewrite_degenerate_phi (&psi);
2340
2341 else if (scalar_close_phi_node_p (phi))
2342 rewrite_close_phi_out_of_ssa (scop, &psi);
2343
2344 else if (reduction_phi_p (region, &psi))
2345 rewrite_phi_out_of_ssa (scop, &psi);
2346 }
2347
2348 update_ssa (TODO_update_ssa);
2349 #ifdef ENABLE_CHECKING
2350 verify_loop_closed_ssa (true);
2351 #endif
2352 }
2353
2354 /* Rewrite the scalar dependence of DEF used in USE_STMT with a memory
2355 read from ZERO_DIM_ARRAY. */
2356
2357 static void
2358 rewrite_cross_bb_scalar_dependence (scop_p scop, tree zero_dim_array,
2359 tree def, gimple use_stmt)
2360 {
2361 gimple name_stmt;
2362 tree name;
2363 ssa_op_iter iter;
2364 use_operand_p use_p;
2365
2366 gcc_assert (gimple_code (use_stmt) != GIMPLE_PHI);
2367
2368 name = copy_ssa_name (def);
2369 name_stmt = gimple_build_assign (name, zero_dim_array);
2370
2371 gimple_assign_set_lhs (name_stmt, name);
2372 insert_stmts (scop, name_stmt, NULL, gsi_for_stmt (use_stmt));
2373
2374 FOR_EACH_SSA_USE_OPERAND (use_p, use_stmt, iter, SSA_OP_ALL_USES)
2375 if (operand_equal_p (def, USE_FROM_PTR (use_p), 0))
2376 replace_exp (use_p, name);
2377
2378 update_stmt (use_stmt);
2379 }
2380
2381 /* For every definition DEF in the SCOP that is used outside the scop,
2382 insert a closing-scop definition in the basic block just after this
2383 SCOP. */
2384
2385 static void
2386 handle_scalar_deps_crossing_scop_limits (scop_p scop, tree def, gimple stmt)
2387 {
2388 tree var = create_tmp_reg (TREE_TYPE (def));
2389 tree new_name = make_ssa_name (var, stmt);
2390 bool needs_copy = false;
2391 use_operand_p use_p;
2392 imm_use_iterator imm_iter;
2393 gimple use_stmt;
2394 sese region = SCOP_REGION (scop);
2395
2396 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
2397 {
2398 if (!bb_in_sese_p (gimple_bb (use_stmt), region))
2399 {
2400 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
2401 {
2402 SET_USE (use_p, new_name);
2403 }
2404 update_stmt (use_stmt);
2405 needs_copy = true;
2406 }
2407 }
2408
2409 /* Insert in the empty BB just after the scop a use of DEF such
2410 that the rewrite of cross_bb_scalar_dependences won't insert
2411 arrays everywhere else. */
2412 if (needs_copy)
2413 {
2414 gimple assign = gimple_build_assign (new_name, def);
2415 gimple_stmt_iterator psi = gsi_after_labels (SESE_EXIT (region)->dest);
2416
2417 update_stmt (assign);
2418 gsi_insert_before (&psi, assign, GSI_SAME_STMT);
2419 }
2420 }
2421
2422 /* Rewrite the scalar dependences crossing the boundary of the BB
2423 containing STMT with an array. Return true when something has been
2424 changed. */
2425
2426 static bool
2427 rewrite_cross_bb_scalar_deps (scop_p scop, gimple_stmt_iterator *gsi)
2428 {
2429 sese region = SCOP_REGION (scop);
2430 gimple stmt = gsi_stmt (*gsi);
2431 imm_use_iterator imm_iter;
2432 tree def;
2433 basic_block def_bb;
2434 tree zero_dim_array = NULL_TREE;
2435 gimple use_stmt;
2436 bool res = false;
2437
2438 switch (gimple_code (stmt))
2439 {
2440 case GIMPLE_ASSIGN:
2441 def = gimple_assign_lhs (stmt);
2442 break;
2443
2444 case GIMPLE_CALL:
2445 def = gimple_call_lhs (stmt);
2446 break;
2447
2448 default:
2449 return false;
2450 }
2451
2452 if (!def
2453 || !is_gimple_reg (def))
2454 return false;
2455
2456 if (scev_analyzable_p (def, region))
2457 {
2458 loop_p loop = loop_containing_stmt (SSA_NAME_DEF_STMT (def));
2459 tree scev = scalar_evolution_in_region (region, loop, def);
2460
2461 if (tree_contains_chrecs (scev, NULL))
2462 return false;
2463
2464 propagate_expr_outside_region (def, scev, region);
2465 return true;
2466 }
2467
2468 def_bb = gimple_bb (stmt);
2469
2470 handle_scalar_deps_crossing_scop_limits (scop, def, stmt);
2471
2472 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
2473 if (gimple_code (use_stmt) == GIMPLE_PHI
2474 && (res = true))
2475 {
2476 gphi_iterator psi = gsi_start_phis (gimple_bb (use_stmt));
2477
2478 if (scalar_close_phi_node_p (gsi_stmt (psi)))
2479 rewrite_close_phi_out_of_ssa (scop, &psi);
2480 else
2481 rewrite_phi_out_of_ssa (scop, &psi);
2482 }
2483
2484 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
2485 if (gimple_code (use_stmt) != GIMPLE_PHI
2486 && def_bb != gimple_bb (use_stmt)
2487 && !is_gimple_debug (use_stmt)
2488 && (res = true))
2489 {
2490 if (!zero_dim_array)
2491 {
2492 zero_dim_array = create_zero_dim_array
2493 (def, "Cross_BB_scalar_dependence");
2494 insert_out_of_ssa_copy (scop, zero_dim_array, def,
2495 SSA_NAME_DEF_STMT (def));
2496 gsi_next (gsi);
2497 }
2498
2499 rewrite_cross_bb_scalar_dependence (scop, unshare_expr (zero_dim_array),
2500 def, use_stmt);
2501 }
2502
2503 return res;
2504 }
2505
2506 /* Rewrite out of SSA all the reduction phi nodes of SCOP. */
2507
2508 static void
2509 rewrite_cross_bb_scalar_deps_out_of_ssa (scop_p scop)
2510 {
2511 basic_block bb;
2512 gimple_stmt_iterator psi;
2513 sese region = SCOP_REGION (scop);
2514 bool changed = false;
2515
2516 /* Create an extra empty BB after the scop. */
2517 split_edge (SESE_EXIT (region));
2518
2519 FOR_EACH_BB_FN (bb, cfun)
2520 if (bb_in_sese_p (bb, region))
2521 for (psi = gsi_start_bb (bb); !gsi_end_p (psi); gsi_next (&psi))
2522 changed |= rewrite_cross_bb_scalar_deps (scop, &psi);
2523
2524 if (changed)
2525 {
2526 scev_reset_htab ();
2527 update_ssa (TODO_update_ssa);
2528 #ifdef ENABLE_CHECKING
2529 verify_loop_closed_ssa (true);
2530 #endif
2531 }
2532 }
2533
2534 /* Returns the number of pbbs that are in loops contained in SCOP. */
2535
2536 static int
2537 nb_pbbs_in_loops (scop_p scop)
2538 {
2539 int i;
2540 poly_bb_p pbb;
2541 int res = 0;
2542
2543 FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb)
2544 if (loop_in_sese_p (gbb_loop (PBB_BLACK_BOX (pbb)), SCOP_REGION (scop)))
2545 res++;
2546
2547 return res;
2548 }
2549
2550 /* Return the number of data references in BB that write in
2551 memory. */
2552
2553 static int
2554 nb_data_writes_in_bb (basic_block bb)
2555 {
2556 int res = 0;
2557 gimple_stmt_iterator gsi;
2558
2559 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2560 if (gimple_vdef (gsi_stmt (gsi)))
2561 res++;
2562
2563 return res;
2564 }
2565
2566 /* Splits at STMT the basic block BB represented as PBB in the
2567 polyhedral form. */
2568
2569 static edge
2570 split_pbb (scop_p scop, poly_bb_p pbb, basic_block bb, gimple stmt)
2571 {
2572 edge e1 = split_block (bb, stmt);
2573 new_pbb_from_pbb (scop, pbb, e1->dest);
2574 return e1;
2575 }
2576
2577 /* Splits STMT out of its current BB. This is done for reduction
2578 statements for which we want to ignore data dependences. */
2579
2580 static basic_block
2581 split_reduction_stmt (scop_p scop, gimple stmt)
2582 {
2583 basic_block bb = gimple_bb (stmt);
2584 poly_bb_p pbb = pbb_from_bb (bb);
2585 gimple_bb_p gbb = gbb_from_bb (bb);
2586 edge e1;
2587 int i;
2588 data_reference_p dr;
2589
2590 /* Do not split basic blocks with no writes to memory: the reduction
2591 will be the only write to memory. */
2592 if (nb_data_writes_in_bb (bb) == 0
2593 /* Or if we have already marked BB as a reduction. */
2594 || PBB_IS_REDUCTION (pbb_from_bb (bb)))
2595 return bb;
2596
2597 e1 = split_pbb (scop, pbb, bb, stmt);
2598
2599 /* Split once more only when the reduction stmt is not the only one
2600 left in the original BB. */
2601 if (!gsi_one_before_end_p (gsi_start_nondebug_bb (bb)))
2602 {
2603 gimple_stmt_iterator gsi = gsi_last_bb (bb);
2604 gsi_prev (&gsi);
2605 e1 = split_pbb (scop, pbb, bb, gsi_stmt (gsi));
2606 }
2607
2608 /* A part of the data references will end in a different basic block
2609 after the split: move the DRs from the original GBB to the newly
2610 created GBB1. */
2611 FOR_EACH_VEC_ELT (GBB_DATA_REFS (gbb), i, dr)
2612 {
2613 basic_block bb1 = gimple_bb (DR_STMT (dr));
2614
2615 if (bb1 != bb)
2616 {
2617 gimple_bb_p gbb1 = gbb_from_bb (bb1);
2618 GBB_DATA_REFS (gbb1).safe_push (dr);
2619 GBB_DATA_REFS (gbb).ordered_remove (i);
2620 i--;
2621 }
2622 }
2623
2624 return e1->dest;
2625 }
2626
2627 /* Return true when stmt is a reduction operation. */
2628
2629 static inline bool
2630 is_reduction_operation_p (gimple stmt)
2631 {
2632 enum tree_code code;
2633
2634 gcc_assert (is_gimple_assign (stmt));
2635 code = gimple_assign_rhs_code (stmt);
2636
2637 return flag_associative_math
2638 && commutative_tree_code (code)
2639 && associative_tree_code (code);
2640 }
2641
2642 /* Returns true when PHI contains an argument ARG. */
2643
2644 static bool
2645 phi_contains_arg (gphi *phi, tree arg)
2646 {
2647 size_t i;
2648
2649 for (i = 0; i < gimple_phi_num_args (phi); i++)
2650 if (operand_equal_p (arg, gimple_phi_arg_def (phi, i), 0))
2651 return true;
2652
2653 return false;
2654 }
2655
2656 /* Return a loop phi node that corresponds to a reduction containing LHS. */
2657
2658 static gphi *
2659 follow_ssa_with_commutative_ops (tree arg, tree lhs)
2660 {
2661 gimple stmt;
2662
2663 if (TREE_CODE (arg) != SSA_NAME)
2664 return NULL;
2665
2666 stmt = SSA_NAME_DEF_STMT (arg);
2667
2668 if (gimple_code (stmt) == GIMPLE_NOP
2669 || gimple_code (stmt) == GIMPLE_CALL)
2670 return NULL;
2671
2672 if (gphi *phi = dyn_cast <gphi *> (stmt))
2673 {
2674 if (phi_contains_arg (phi, lhs))
2675 return phi;
2676 return NULL;
2677 }
2678
2679 if (!is_gimple_assign (stmt))
2680 return NULL;
2681
2682 if (gimple_num_ops (stmt) == 2)
2683 return follow_ssa_with_commutative_ops (gimple_assign_rhs1 (stmt), lhs);
2684
2685 if (is_reduction_operation_p (stmt))
2686 {
2687 gphi *res
2688 = follow_ssa_with_commutative_ops (gimple_assign_rhs1 (stmt), lhs);
2689
2690 return res ? res :
2691 follow_ssa_with_commutative_ops (gimple_assign_rhs2 (stmt), lhs);
2692 }
2693
2694 return NULL;
2695 }
2696
2697 /* Detect commutative and associative scalar reductions starting at
2698 the STMT. Return the phi node of the reduction cycle, or NULL. */
2699
2700 static gphi *
2701 detect_commutative_reduction_arg (tree lhs, gimple stmt, tree arg,
2702 vec<gimple> *in,
2703 vec<gimple> *out)
2704 {
2705 gphi *phi = follow_ssa_with_commutative_ops (arg, lhs);
2706
2707 if (!phi)
2708 return NULL;
2709
2710 in->safe_push (stmt);
2711 out->safe_push (stmt);
2712 return phi;
2713 }
2714
2715 /* Detect commutative and associative scalar reductions starting at
2716 STMT. Return the phi node of the reduction cycle, or NULL. */
2717
2718 static gphi *
2719 detect_commutative_reduction_assign (gimple stmt, vec<gimple> *in,
2720 vec<gimple> *out)
2721 {
2722 tree lhs = gimple_assign_lhs (stmt);
2723
2724 if (gimple_num_ops (stmt) == 2)
2725 return detect_commutative_reduction_arg (lhs, stmt,
2726 gimple_assign_rhs1 (stmt),
2727 in, out);
2728
2729 if (is_reduction_operation_p (stmt))
2730 {
2731 gphi *res = detect_commutative_reduction_arg (lhs, stmt,
2732 gimple_assign_rhs1 (stmt),
2733 in, out);
2734 return res ? res
2735 : detect_commutative_reduction_arg (lhs, stmt,
2736 gimple_assign_rhs2 (stmt),
2737 in, out);
2738 }
2739
2740 return NULL;
2741 }
2742
2743 /* Return a loop phi node that corresponds to a reduction containing LHS. */
2744
2745 static gphi *
2746 follow_inital_value_to_phi (tree arg, tree lhs)
2747 {
2748 gimple stmt;
2749
2750 if (!arg || TREE_CODE (arg) != SSA_NAME)
2751 return NULL;
2752
2753 stmt = SSA_NAME_DEF_STMT (arg);
2754
2755 if (gphi *phi = dyn_cast <gphi *> (stmt))
2756 if (phi_contains_arg (phi, lhs))
2757 return phi;
2758
2759 return NULL;
2760 }
2761
2762
2763 /* Return the argument of the loop PHI that is the initial value coming
2764 from outside the loop. */
2765
2766 static edge
2767 edge_initial_value_for_loop_phi (gphi *phi)
2768 {
2769 size_t i;
2770
2771 for (i = 0; i < gimple_phi_num_args (phi); i++)
2772 {
2773 edge e = gimple_phi_arg_edge (phi, i);
2774
2775 if (loop_depth (e->src->loop_father)
2776 < loop_depth (e->dest->loop_father))
2777 return e;
2778 }
2779
2780 return NULL;
2781 }
2782
2783 /* Return the argument of the loop PHI that is the initial value coming
2784 from outside the loop. */
2785
2786 static tree
2787 initial_value_for_loop_phi (gphi *phi)
2788 {
2789 size_t i;
2790
2791 for (i = 0; i < gimple_phi_num_args (phi); i++)
2792 {
2793 edge e = gimple_phi_arg_edge (phi, i);
2794
2795 if (loop_depth (e->src->loop_father)
2796 < loop_depth (e->dest->loop_father))
2797 return gimple_phi_arg_def (phi, i);
2798 }
2799
2800 return NULL_TREE;
2801 }
2802
2803 /* Returns true when DEF is used outside the reduction cycle of
2804 LOOP_PHI. */
2805
2806 static bool
2807 used_outside_reduction (tree def, gimple loop_phi)
2808 {
2809 use_operand_p use_p;
2810 imm_use_iterator imm_iter;
2811 loop_p loop = loop_containing_stmt (loop_phi);
2812
2813 /* In LOOP, DEF should be used only in LOOP_PHI. */
2814 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
2815 {
2816 gimple stmt = USE_STMT (use_p);
2817
2818 if (stmt != loop_phi
2819 && !is_gimple_debug (stmt)
2820 && flow_bb_inside_loop_p (loop, gimple_bb (stmt)))
2821 return true;
2822 }
2823
2824 return false;
2825 }
2826
2827 /* Detect commutative and associative scalar reductions belonging to
2828 the SCOP starting at the loop closed phi node STMT. Return the phi
2829 node of the reduction cycle, or NULL. */
2830
2831 static gphi *
2832 detect_commutative_reduction (scop_p scop, gimple stmt, vec<gimple> *in,
2833 vec<gimple> *out)
2834 {
2835 if (scalar_close_phi_node_p (stmt))
2836 {
2837 gimple def;
2838 gphi *loop_phi, *phi, *close_phi = as_a <gphi *> (stmt);
2839 tree init, lhs, arg = gimple_phi_arg_def (close_phi, 0);
2840
2841 if (TREE_CODE (arg) != SSA_NAME)
2842 return NULL;
2843
2844 /* Note that loop close phi nodes should have a single argument
2845 because we translated the representation into a canonical form
2846 before Graphite: see canonicalize_loop_closed_ssa_form. */
2847 gcc_assert (gimple_phi_num_args (close_phi) == 1);
2848
2849 def = SSA_NAME_DEF_STMT (arg);
2850 if (!stmt_in_sese_p (def, SCOP_REGION (scop))
2851 || !(loop_phi = detect_commutative_reduction (scop, def, in, out)))
2852 return NULL;
2853
2854 lhs = gimple_phi_result (close_phi);
2855 init = initial_value_for_loop_phi (loop_phi);
2856 phi = follow_inital_value_to_phi (init, lhs);
2857
2858 if (phi && (used_outside_reduction (lhs, phi)
2859 || !has_single_use (gimple_phi_result (phi))))
2860 return NULL;
2861
2862 in->safe_push (loop_phi);
2863 out->safe_push (close_phi);
2864 return phi;
2865 }
2866
2867 if (gimple_code (stmt) == GIMPLE_ASSIGN)
2868 return detect_commutative_reduction_assign (stmt, in, out);
2869
2870 return NULL;
2871 }
2872
2873 /* Translate the scalar reduction statement STMT to an array RED
2874 knowing that its recursive phi node is LOOP_PHI. */
2875
2876 static void
2877 translate_scalar_reduction_to_array_for_stmt (scop_p scop, tree red,
2878 gimple stmt, gphi *loop_phi)
2879 {
2880 tree res = gimple_phi_result (loop_phi);
2881 gassign *assign = gimple_build_assign (res, unshare_expr (red));
2882 gimple_stmt_iterator gsi;
2883
2884 insert_stmts (scop, assign, NULL, gsi_after_labels (gimple_bb (loop_phi)));
2885
2886 assign = gimple_build_assign (unshare_expr (red), gimple_assign_lhs (stmt));
2887 gsi = gsi_for_stmt (stmt);
2888 gsi_next (&gsi);
2889 insert_stmts (scop, assign, NULL, gsi);
2890 }
2891
2892 /* Removes the PHI node and resets all the debug stmts that are using
2893 the PHI_RESULT. */
2894
2895 static void
2896 remove_phi (gphi *phi)
2897 {
2898 imm_use_iterator imm_iter;
2899 tree def;
2900 use_operand_p use_p;
2901 gimple_stmt_iterator gsi;
2902 auto_vec<gimple, 3> update;
2903 unsigned int i;
2904 gimple stmt;
2905
2906 def = PHI_RESULT (phi);
2907 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
2908 {
2909 stmt = USE_STMT (use_p);
2910
2911 if (is_gimple_debug (stmt))
2912 {
2913 gimple_debug_bind_reset_value (stmt);
2914 update.safe_push (stmt);
2915 }
2916 }
2917
2918 FOR_EACH_VEC_ELT (update, i, stmt)
2919 update_stmt (stmt);
2920
2921 gsi = gsi_for_phi_node (phi);
2922 remove_phi_node (&gsi, false);
2923 }
2924
2925 /* Helper function for for_each_index. For each INDEX of the data
2926 reference REF, returns true when its indices are valid in the loop
2927 nest LOOP passed in as DATA. */
2928
2929 static bool
2930 dr_indices_valid_in_loop (tree ref ATTRIBUTE_UNUSED, tree *index, void *data)
2931 {
2932 loop_p loop;
2933 basic_block header, def_bb;
2934 gimple stmt;
2935
2936 if (TREE_CODE (*index) != SSA_NAME)
2937 return true;
2938
2939 loop = *((loop_p *) data);
2940 header = loop->header;
2941 stmt = SSA_NAME_DEF_STMT (*index);
2942
2943 if (!stmt)
2944 return true;
2945
2946 def_bb = gimple_bb (stmt);
2947
2948 if (!def_bb)
2949 return true;
2950
2951 return dominated_by_p (CDI_DOMINATORS, header, def_bb);
2952 }
2953
2954 /* When the result of a CLOSE_PHI is written to a memory location,
2955 return a pointer to that memory reference, otherwise return
2956 NULL_TREE. */
2957
2958 static tree
2959 close_phi_written_to_memory (gphi *close_phi)
2960 {
2961 imm_use_iterator imm_iter;
2962 use_operand_p use_p;
2963 gimple stmt;
2964 tree res, def = gimple_phi_result (close_phi);
2965
2966 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
2967 if ((stmt = USE_STMT (use_p))
2968 && gimple_code (stmt) == GIMPLE_ASSIGN
2969 && (res = gimple_assign_lhs (stmt)))
2970 {
2971 switch (TREE_CODE (res))
2972 {
2973 case VAR_DECL:
2974 case PARM_DECL:
2975 case RESULT_DECL:
2976 return res;
2977
2978 case ARRAY_REF:
2979 case MEM_REF:
2980 {
2981 tree arg = gimple_phi_arg_def (close_phi, 0);
2982 loop_p nest = loop_containing_stmt (SSA_NAME_DEF_STMT (arg));
2983
2984 /* FIXME: this restriction is for id-{24,25}.f and
2985 could be handled by duplicating the computation of
2986 array indices before the loop of the close_phi. */
2987 if (for_each_index (&res, dr_indices_valid_in_loop, &nest))
2988 return res;
2989 }
2990 /* Fallthru. */
2991
2992 default:
2993 continue;
2994 }
2995 }
2996 return NULL_TREE;
2997 }
2998
2999 /* Rewrite out of SSA the reduction described by the loop phi nodes
3000 IN, and the close phi nodes OUT. IN and OUT are structured by loop
3001 levels like this:
3002
3003 IN: stmt, loop_n, ..., loop_0
3004 OUT: stmt, close_n, ..., close_0
3005
3006 the first element is the reduction statement, and the next elements
3007 are the loop and close phi nodes of each of the outer loops. */
3008
3009 static void
3010 translate_scalar_reduction_to_array (scop_p scop,
3011 vec<gimple> in,
3012 vec<gimple> out)
3013 {
3014 gimple loop_stmt;
3015 unsigned int i = out.length () - 1;
3016 tree red = close_phi_written_to_memory (as_a <gphi *> (out[i]));
3017
3018 FOR_EACH_VEC_ELT (in, i, loop_stmt)
3019 {
3020 gimple close_stmt = out[i];
3021
3022 if (i == 0)
3023 {
3024 basic_block bb = split_reduction_stmt (scop, loop_stmt);
3025 poly_bb_p pbb = pbb_from_bb (bb);
3026 PBB_IS_REDUCTION (pbb) = true;
3027 gcc_assert (close_stmt == loop_stmt);
3028
3029 if (!red)
3030 red = create_zero_dim_array
3031 (gimple_assign_lhs (loop_stmt), "Commutative_Associative_Reduction");
3032
3033 translate_scalar_reduction_to_array_for_stmt (scop, red, loop_stmt,
3034 as_a <gphi *> (in[1]));
3035 continue;
3036 }
3037
3038 gphi *loop_phi = as_a <gphi *> (loop_stmt);
3039 gphi *close_phi = as_a <gphi *> (close_stmt);
3040
3041 if (i == in.length () - 1)
3042 {
3043 insert_out_of_ssa_copy (scop, gimple_phi_result (close_phi),
3044 unshare_expr (red), close_phi);
3045 insert_out_of_ssa_copy_on_edge
3046 (scop, edge_initial_value_for_loop_phi (loop_phi),
3047 unshare_expr (red), initial_value_for_loop_phi (loop_phi));
3048 }
3049
3050 remove_phi (loop_phi);
3051 remove_phi (close_phi);
3052 }
3053 }
3054
3055 /* Rewrites out of SSA a commutative reduction at CLOSE_PHI. Returns
3056 true when something has been changed. */
3057
3058 static bool
3059 rewrite_commutative_reductions_out_of_ssa_close_phi (scop_p scop,
3060 gphi *close_phi)
3061 {
3062 bool res;
3063 auto_vec<gimple, 10> in;
3064 auto_vec<gimple, 10> out;
3065
3066 detect_commutative_reduction (scop, close_phi, &in, &out);
3067 res = in.length () > 1;
3068 if (res)
3069 translate_scalar_reduction_to_array (scop, in, out);
3070
3071 return res;
3072 }
3073
3074 /* Rewrites all the commutative reductions from LOOP out of SSA.
3075 Returns true when something has been changed. */
3076
3077 static bool
3078 rewrite_commutative_reductions_out_of_ssa_loop (scop_p scop,
3079 loop_p loop)
3080 {
3081 gphi_iterator gsi;
3082 edge exit = single_exit (loop);
3083 tree res;
3084 bool changed = false;
3085
3086 if (!exit)
3087 return false;
3088
3089 for (gsi = gsi_start_phis (exit->dest); !gsi_end_p (gsi); gsi_next (&gsi))
3090 if ((res = gimple_phi_result (gsi.phi ()))
3091 && !virtual_operand_p (res)
3092 && !scev_analyzable_p (res, SCOP_REGION (scop)))
3093 changed |= rewrite_commutative_reductions_out_of_ssa_close_phi
3094 (scop, gsi.phi ());
3095
3096 return changed;
3097 }
3098
3099 /* Rewrites all the commutative reductions from SCOP out of SSA. */
3100
3101 static void
3102 rewrite_commutative_reductions_out_of_ssa (scop_p scop)
3103 {
3104 loop_p loop;
3105 bool changed = false;
3106 sese region = SCOP_REGION (scop);
3107
3108 FOR_EACH_LOOP (loop, 0)
3109 if (loop_in_sese_p (loop, region))
3110 changed |= rewrite_commutative_reductions_out_of_ssa_loop (scop, loop);
3111
3112 if (changed)
3113 {
3114 scev_reset_htab ();
3115 gsi_commit_edge_inserts ();
3116 update_ssa (TODO_update_ssa);
3117 #ifdef ENABLE_CHECKING
3118 verify_loop_closed_ssa (true);
3119 #endif
3120 }
3121 }
3122
3123 /* Can all ivs be represented by a signed integer?
3124 As CLooG might generate negative values in its expressions, signed loop ivs
3125 are required in the backend. */
3126
3127 static bool
3128 scop_ivs_can_be_represented (scop_p scop)
3129 {
3130 loop_p loop;
3131 gphi_iterator psi;
3132 bool result = true;
3133
3134 FOR_EACH_LOOP (loop, 0)
3135 {
3136 if (!loop_in_sese_p (loop, SCOP_REGION (scop)))
3137 continue;
3138
3139 for (psi = gsi_start_phis (loop->header);
3140 !gsi_end_p (psi); gsi_next (&psi))
3141 {
3142 gphi *phi = psi.phi ();
3143 tree res = PHI_RESULT (phi);
3144 tree type = TREE_TYPE (res);
3145
3146 if (TYPE_UNSIGNED (type)
3147 && TYPE_PRECISION (type) >= TYPE_PRECISION (long_long_integer_type_node))
3148 {
3149 result = false;
3150 break;
3151 }
3152 }
3153 if (!result)
3154 break;
3155 }
3156
3157 return result;
3158 }
3159
3160 /* Builds the polyhedral representation for a SESE region. */
3161
3162 void
3163 build_poly_scop (scop_p scop)
3164 {
3165 sese region = SCOP_REGION (scop);
3166 graphite_dim_t max_dim;
3167
3168 build_scop_bbs (scop);
3169
3170 /* FIXME: This restriction is needed to avoid a problem in CLooG.
3171 Once CLooG is fixed, remove this guard. Anyways, it makes no
3172 sense to optimize a scop containing only PBBs that do not belong
3173 to any loops. */
3174 if (nb_pbbs_in_loops (scop) == 0)
3175 return;
3176
3177 if (!scop_ivs_can_be_represented (scop))
3178 return;
3179
3180 if (flag_associative_math)
3181 rewrite_commutative_reductions_out_of_ssa (scop);
3182
3183 build_sese_loop_nests (region);
3184 /* Record all conditions in REGION. */
3185 sese_dom_walker (CDI_DOMINATORS, region).walk (cfun->cfg->x_entry_block_ptr);
3186 find_scop_parameters (scop);
3187
3188 max_dim = PARAM_VALUE (PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS);
3189 if (scop_nb_params (scop) > max_dim)
3190 return;
3191
3192 build_scop_iteration_domain (scop);
3193 build_scop_context (scop);
3194 add_conditions_to_constraints (scop);
3195
3196 /* Rewrite out of SSA only after having translated the
3197 representation to the polyhedral representation to avoid scev
3198 analysis failures. That means that these functions will insert
3199 new data references that they create in the right place. */
3200 rewrite_reductions_out_of_ssa (scop);
3201 rewrite_cross_bb_scalar_deps_out_of_ssa (scop);
3202
3203 build_scop_drs (scop);
3204 scop_to_lst (scop);
3205 build_scop_scattering (scop);
3206
3207 /* This SCoP has been translated to the polyhedral
3208 representation. */
3209 POLY_SCOP_P (scop) = true;
3210 }
3211 #endif