1 /* Gimple Represented as Polyhedra.
2 Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
3 Contributed by Sebastian Pop <sebastian.pop@inria.fr>.
5 This file is part of GCC.
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)
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.
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/>. */
21 /* This pass converts GIMPLE to GRAPHITE, performs some loop
22 transformations and then converts the resulting representation back
25 An early description of this pass can be found in the GCC Summit'06
26 paper "GRAPHITE: Polyhedral Analyses and Optimizations for GCC".
27 The wiki page http://gcc.gnu.org/wiki/Graphite contains pointers to
30 One important document to read is CLooG's internal manual:
31 http://repo.or.cz/w/cloog-ppl.git?a=blob_plain;f=doc/cloog.texi;hb=HEAD
32 that describes the data structure of loops used in this file, and
33 the functions that are used for transforming the code. */
37 #include "coretypes.h"
42 #include "basic-block.h"
43 #include "diagnostic.h"
44 #include "tree-flow.h"
46 #include "tree-dump.h"
49 #include "tree-chrec.h"
50 #include "tree-data-ref.h"
51 #include "tree-scalar-evolution.h"
52 #include "tree-pass.h"
54 #include "value-prof.h"
55 #include "pointer-set.h"
59 #include "cloog/cloog.h"
62 static VEC (scop_p, heap) *current_scops;
64 /* Converts a GMP constant V to a tree and returns it. */
67 gmp_cst_to_tree (tree type, Value v)
69 return build_int_cst (type, value_get_si (v));
72 /* Debug the list of old induction variables for this SCOP. */
75 debug_oldivs (scop_p scop)
80 fprintf (stderr, "Old IVs:");
82 for (i = 0; VEC_iterate (name_tree, SCOP_OLDIVS (scop), i, oldiv); i++)
84 fprintf (stderr, "(");
85 print_generic_expr (stderr, oldiv->t, 0);
86 fprintf (stderr, ", %s, %d)\n", oldiv->name, oldiv->loop->num);
88 fprintf (stderr, "\n");
91 /* Debug the loops around basic block GB. */
94 debug_loop_vec (graphite_bb_p gb)
99 fprintf (stderr, "Loop Vec:");
101 for (i = 0; VEC_iterate (loop_p, GBB_LOOPS (gb), i, loop); i++)
102 fprintf (stderr, "%d: %d, ", i, loop ? loop->num : -1);
104 fprintf (stderr, "\n");
107 /* Returns true if stack ENTRY is a constant. */
110 iv_stack_entry_is_constant (iv_stack_entry *entry)
112 return entry->kind == iv_stack_entry_const;
115 /* Returns true if stack ENTRY is an induction variable. */
118 iv_stack_entry_is_iv (iv_stack_entry *entry)
120 return entry->kind == iv_stack_entry_iv;
123 /* Push (IV, NAME) on STACK. */
126 loop_iv_stack_push_iv (loop_iv_stack stack, tree iv, const char *name)
128 iv_stack_entry *entry = XNEW (iv_stack_entry);
129 name_tree named_iv = XNEW (struct name_tree);
132 named_iv->name = name;
134 entry->kind = iv_stack_entry_iv;
135 entry->data.iv = named_iv;
137 VEC_safe_push (iv_stack_entry_p, heap, *stack, entry);
140 /* Inserts a CONSTANT in STACK at INDEX. */
143 loop_iv_stack_insert_constant (loop_iv_stack stack, int index,
146 iv_stack_entry *entry = XNEW (iv_stack_entry);
148 entry->kind = iv_stack_entry_const;
149 entry->data.constant = constant;
151 VEC_safe_insert (iv_stack_entry_p, heap, *stack, index, entry);
154 /* Pops and frees an element out of STACK. */
157 loop_iv_stack_pop (loop_iv_stack stack)
159 iv_stack_entry_p entry = VEC_pop (iv_stack_entry_p, *stack);
161 free (entry->data.iv);
165 /* Get the IV at INDEX in STACK. */
168 loop_iv_stack_get_iv (loop_iv_stack stack, int index)
170 iv_stack_entry_p entry = VEC_index (iv_stack_entry_p, *stack, index);
171 iv_stack_entry_data data = entry->data;
173 return iv_stack_entry_is_iv (entry) ? data.iv->t : data.constant;
176 /* Get the IV from its NAME in STACK. */
179 loop_iv_stack_get_iv_from_name (loop_iv_stack stack, const char* name)
182 iv_stack_entry_p entry;
184 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry); i++)
186 name_tree iv = entry->data.iv;
187 if (!strcmp (name, iv->name))
194 /* Prints on stderr the contents of STACK. */
197 debug_loop_iv_stack (loop_iv_stack stack)
200 iv_stack_entry_p entry;
203 fprintf (stderr, "(");
205 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry); i++)
210 fprintf (stderr, " ");
212 if (iv_stack_entry_is_iv (entry))
214 name_tree iv = entry->data.iv;
215 fprintf (stderr, "%s:", iv->name);
216 print_generic_expr (stderr, iv->t, 0);
220 tree constant = entry->data.constant;
221 print_generic_expr (stderr, constant, 0);
222 fprintf (stderr, ":");
223 print_generic_expr (stderr, constant, 0);
227 fprintf (stderr, ")\n");
233 free_loop_iv_stack (loop_iv_stack stack)
236 iv_stack_entry_p entry;
238 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry); i++)
240 free (entry->data.iv);
244 VEC_free (iv_stack_entry_p, heap, *stack);
249 /* Structure containing the mapping between the CLooG's induction
250 variable and the type of the old induction variable. */
251 typedef struct ivtype_map_elt
254 const char *cloog_iv;
257 /* Print to stderr the element ELT. */
260 debug_ivtype_elt (ivtype_map_elt elt)
262 fprintf (stderr, "(%s, ", elt->cloog_iv);
263 print_generic_expr (stderr, elt->type, 0);
264 fprintf (stderr, ")\n");
267 /* Helper function for debug_ivtype_map. */
270 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
272 struct ivtype_map_elt *entry = (struct ivtype_map_elt *) *slot;
273 debug_ivtype_elt (entry);
277 /* Print to stderr all the elements of MAP. */
280 debug_ivtype_map (htab_t map)
282 htab_traverse (map, debug_ivtype_map_1, NULL);
285 /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
287 static inline ivtype_map_elt
288 new_ivtype_map_elt (const char *cloog_iv, tree type)
292 res = XNEW (struct ivtype_map_elt);
293 res->cloog_iv = cloog_iv;
299 /* Computes a hash function for database element ELT. */
302 ivtype_map_elt_info (const void *elt)
304 return htab_hash_pointer (((const struct ivtype_map_elt *) elt)->cloog_iv);
307 /* Compares database elements E1 and E2. */
310 eq_ivtype_map_elts (const void *e1, const void *e2)
312 const struct ivtype_map_elt *elt1 = (const struct ivtype_map_elt *) e1;
313 const struct ivtype_map_elt *elt2 = (const struct ivtype_map_elt *) e2;
315 return (elt1->cloog_iv == elt2->cloog_iv);
320 /* Given a CLOOG_IV, returns the type that it should have in GCC land.
321 If the information is not available, i.e. in the case one of the
322 transforms created the loop, just return integer_type_node. */
325 gcc_type_for_cloog_iv (const char *cloog_iv, graphite_bb_p gbb)
327 struct ivtype_map_elt tmp;
330 tmp.cloog_iv = cloog_iv;
331 slot = htab_find_slot (GBB_CLOOG_IV_TYPES (gbb), &tmp, NO_INSERT);
334 return ((ivtype_map_elt) *slot)->type;
336 return integer_type_node;
339 /* Inserts constants derived from the USER_STMT argument list into the
340 STACK. This is needed to map old ivs to constants when loops have
344 loop_iv_stack_patch_for_consts (loop_iv_stack stack,
345 struct clast_user_stmt *user_stmt)
347 struct clast_stmt *t;
349 CloogStatement *cs = user_stmt->statement;
350 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
352 for (t = user_stmt->substitutions; t; t = t->next)
354 struct clast_expr *expr = (struct clast_expr *)
355 ((struct clast_assignment *)t)->RHS;
356 struct clast_term *term = (struct clast_term *) expr;
358 /* FIXME: What should be done with expr_bin, expr_red? */
359 if (expr->type == expr_term
362 loop_p loop = gbb_loop_at_index (gbb, index);
363 tree oldiv = oldiv_for_loop (GBB_SCOP (gbb), loop);
364 tree type = oldiv ? TREE_TYPE (oldiv) : integer_type_node;
365 tree value = gmp_cst_to_tree (type, term->val);
366 loop_iv_stack_insert_constant (stack, index, value);
372 /* Removes all constants in the iv STACK. */
375 loop_iv_stack_remove_constants (loop_iv_stack stack)
378 iv_stack_entry *entry;
380 for (i = 0; VEC_iterate (iv_stack_entry_p, *stack, i, entry);)
382 if (iv_stack_entry_is_constant (entry))
384 free (VEC_index (iv_stack_entry_p, *stack, i));
385 VEC_ordered_remove (iv_stack_entry_p, *stack, i);
392 /* Returns a new loop_to_cloog_loop_str structure. */
394 static inline struct loop_to_cloog_loop_str *
395 new_loop_to_cloog_loop_str (int loop_num,
397 CloogLoop *cloog_loop)
399 struct loop_to_cloog_loop_str *result;
401 result = XNEW (struct loop_to_cloog_loop_str);
402 result->loop_num = loop_num;
403 result->cloog_loop = cloog_loop;
404 result->loop_position = loop_position;
409 /* Hash function for SCOP_LOOP2CLOOG_LOOP hash table. */
412 hash_loop_to_cloog_loop (const void *elt)
414 return ((const struct loop_to_cloog_loop_str *) elt)->loop_num;
417 /* Equality function for SCOP_LOOP2CLOOG_LOOP hash table. */
420 eq_loop_to_cloog_loop (const void *el1, const void *el2)
422 const struct loop_to_cloog_loop_str *elt1, *elt2;
424 elt1 = (const struct loop_to_cloog_loop_str *) el1;
425 elt2 = (const struct loop_to_cloog_loop_str *) el2;
426 return elt1->loop_num == elt2->loop_num;
429 /* Compares two graphite bbs and returns an integer less than, equal to, or
430 greater than zero if the first argument is considered to be respectively
431 less than, equal to, or greater than the second.
432 We compare using the lexicographic order of the static schedules. */
435 gbb_compare (const void *p_1, const void *p_2)
437 const struct graphite_bb *const gbb_1
438 = *(const struct graphite_bb *const*) p_1;
439 const struct graphite_bb *const gbb_2
440 = *(const struct graphite_bb *const*) p_2;
442 return lambda_vector_compare (GBB_STATIC_SCHEDULE (gbb_1),
443 gbb_nb_loops (gbb_1) + 1,
444 GBB_STATIC_SCHEDULE (gbb_2),
445 gbb_nb_loops (gbb_2) + 1);
448 /* Sort graphite bbs in SCOP. */
451 graphite_sort_gbbs (scop_p scop)
453 VEC (graphite_bb_p, heap) *bbs = SCOP_BBS (scop);
455 qsort (VEC_address (graphite_bb_p, bbs),
456 VEC_length (graphite_bb_p, bbs),
457 sizeof (graphite_bb_p), gbb_compare);
460 /* Dump conditions of a graphite basic block GBB on FILE. */
463 dump_gbb_conditions (FILE *file, graphite_bb_p gbb)
467 VEC (gimple, heap) *conditions = GBB_CONDITIONS (gbb);
469 if (VEC_empty (gimple, conditions))
472 fprintf (file, "\tbb %d\t: cond = {", GBB_BB (gbb)->index);
474 for (i = 0; VEC_iterate (gimple, conditions, i, stmt); i++)
475 print_gimple_stmt (file, stmt, 0, 0);
477 fprintf (file, "}\n");
480 /* Converts the graphite scheduling function into a cloog scattering
481 matrix. This scattering matrix is used to limit the possible cloog
482 output to valid programs in respect to the scheduling function.
484 SCATTERING_DIMENSIONS specifies the dimensionality of the scattering
485 matrix. CLooG 0.14.0 and previous versions require, that all scattering
486 functions of one CloogProgram have the same dimensionality, therefore we
487 allow to specify it. (Should be removed in future versions) */
490 schedule_to_scattering (graphite_bb_p gb, int scattering_dimensions)
493 scop_p scop = GBB_SCOP (gb);
495 int nb_iterators = gbb_nb_loops (gb);
497 /* The cloog scattering matrix consists of these colums:
499 scattering_dimensions cols = Scattering dimensions,
500 nb_iterators cols = bb's iterators,
501 scop_nb_params cols = Parameters,
506 scattering_dimensions = 5
516 s1 s2 s3 s4 s5 i p1 p2 1
517 1 0 0 0 0 0 0 0 -4 = 0
518 0 1 0 0 0 -1 0 0 0 = 0
519 0 0 1 0 0 0 0 0 -5 = 0 */
520 int nb_params = scop_nb_params (scop);
521 int nb_cols = 1 + scattering_dimensions + nb_iterators + nb_params + 1;
522 int col_const = nb_cols - 1;
523 int col_iter_offset = 1 + scattering_dimensions;
525 CloogMatrix *scat = cloog_matrix_alloc (scattering_dimensions, nb_cols);
527 gcc_assert (scattering_dimensions >= nb_iterators * 2 + 1);
529 /* Initialize the identity matrix. */
530 for (i = 0; i < scattering_dimensions; i++)
531 value_set_si (scat->p[i][i + 1], 1);
533 /* Textual order outside the first loop */
534 value_set_si (scat->p[0][col_const], -GBB_STATIC_SCHEDULE (gb)[0]);
536 /* For all surrounding loops. */
537 for (i = 0; i < nb_iterators; i++)
539 int schedule = GBB_STATIC_SCHEDULE (gb)[i + 1];
541 /* Iterations of this loop. */
542 value_set_si (scat->p[2 * i + 1][col_iter_offset + i], -1);
544 /* Textual order inside this loop. */
545 value_set_si (scat->p[2 * i + 2][col_const], -schedule);
551 /* Print the schedules of GB to FILE with INDENT white spaces before.
552 VERBOSITY determines how verbose the code pretty printers are. */
555 print_graphite_bb (FILE *file, graphite_bb_p gb, int indent, int verbosity)
557 CloogMatrix *scattering;
560 fprintf (file, "\nGBB (\n");
562 print_loops_bb (file, GBB_BB (gb), indent+2, verbosity);
566 fprintf (file, " (domain: \n");
567 cloog_matrix_print (file, GBB_DOMAIN (gb));
568 fprintf (file, " )\n");
571 if (GBB_STATIC_SCHEDULE (gb))
573 fprintf (file, " (static schedule: ");
574 print_lambda_vector (file, GBB_STATIC_SCHEDULE (gb),
575 gbb_nb_loops (gb) + 1);
576 fprintf (file, " )\n");
581 fprintf (file, " (contained loops: \n");
582 for (i = 0; VEC_iterate (loop_p, GBB_LOOPS (gb), i, loop); i++)
584 fprintf (file, " iterator %d => NULL \n", i);
586 fprintf (file, " iterator %d => loop %d \n", i,
588 fprintf (file, " )\n");
591 if (GBB_DATA_REFS (gb))
592 dump_data_references (file, GBB_DATA_REFS (gb));
594 if (GBB_CONDITIONS (gb))
596 fprintf (file, " (conditions: \n");
597 dump_gbb_conditions (file, gb);
598 fprintf (file, " )\n");
602 && GBB_STATIC_SCHEDULE (gb))
604 fprintf (file, " (scattering: \n");
605 scattering = schedule_to_scattering (gb, 2 * gbb_nb_loops (gb) + 1);
606 cloog_matrix_print (file, scattering);
607 cloog_matrix_free (scattering);
608 fprintf (file, " )\n");
611 fprintf (file, ")\n");
614 /* Print to STDERR the schedules of GB with VERBOSITY level. */
617 debug_gbb (graphite_bb_p gb, int verbosity)
619 print_graphite_bb (stderr, gb, 0, verbosity);
623 /* Print SCOP to FILE. VERBOSITY determines how verbose the pretty
627 print_scop (FILE *file, scop_p scop, int verbosity)
632 fprintf (file, "\nSCoP_%d_%d (\n",
633 SCOP_ENTRY (scop)->index, SCOP_EXIT (scop)->index);
635 fprintf (file, " (cloog: \n");
636 cloog_program_print (file, SCOP_PROG (scop));
637 fprintf (file, " )\n");
644 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
645 print_graphite_bb (file, gb, 0, verbosity);
648 fprintf (file, ")\n");
651 /* Print all the SCOPs to FILE. VERBOSITY determines how verbose the
652 code pretty printers are. */
655 print_scops (FILE *file, int verbosity)
660 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
661 print_scop (file, scop, verbosity);
664 /* Debug SCOP. VERBOSITY determines how verbose the code pretty
668 debug_scop (scop_p scop, int verbosity)
670 print_scop (stderr, scop, verbosity);
673 /* Debug all SCOPs from CURRENT_SCOPS. VERBOSITY determines how
674 verbose the code pretty printers are. */
677 debug_scops (int verbosity)
679 print_scops (stderr, verbosity);
682 /* Pretty print to FILE the SCOP in DOT format. */
685 dot_scop_1 (FILE *file, scop_p scop)
690 basic_block entry = SCOP_ENTRY (scop);
691 basic_block exit = SCOP_EXIT (scop);
693 fprintf (file, "digraph SCoP_%d_%d {\n", entry->index,
699 fprintf (file, "%d [shape=triangle];\n", bb->index);
702 fprintf (file, "%d [shape=box];\n", bb->index);
704 if (bb_in_scop_p (bb, scop))
705 fprintf (file, "%d [color=red];\n", bb->index);
707 FOR_EACH_EDGE (e, ei, bb->succs)
708 fprintf (file, "%d -> %d;\n", bb->index, e->dest->index);
711 fputs ("}\n\n", file);
714 /* Display SCOP using dotty. */
717 dot_scop (scop_p scop)
719 dot_scop_1 (stderr, scop);
722 /* Pretty print all SCoPs in DOT format and mark them with different colors.
723 If there are not enough colors, paint later SCoPs gray.
725 - "*" after the node number: entry of a SCoP,
726 - "#" after the node number: exit of a SCoP,
727 - "()" entry or exit not part of SCoP. */
730 dot_all_scops_1 (FILE *file)
739 /* Disable debugging while printing graph. */
740 int tmp_dump_flags = dump_flags;
743 fprintf (file, "digraph all {\n");
747 int part_of_scop = false;
749 /* Use HTML for every bb label. So we are able to print bbs
750 which are part of two different SCoPs, with two different
751 background colors. */
752 fprintf (file, "%d [label=<\n <TABLE BORDER=\"0\" CELLBORDER=\"1\" ",
754 fprintf (file, "CELLSPACING=\"0\">\n");
756 /* Select color for SCoP. */
757 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
758 if (bb_in_scop_p (bb, scop)
759 || (SCOP_EXIT (scop) == bb)
760 || (SCOP_ENTRY (scop) == bb))
819 fprintf (file, " <TR><TD WIDTH=\"50\" BGCOLOR=\"%s\">", color);
821 if (!bb_in_scop_p (bb, scop))
822 fprintf (file, " (");
824 if (bb == SCOP_ENTRY (scop)
825 && bb == SCOP_EXIT (scop))
826 fprintf (file, " %d*# ", bb->index);
827 else if (bb == SCOP_ENTRY (scop))
828 fprintf (file, " %d* ", bb->index);
829 else if (bb == SCOP_EXIT (scop))
830 fprintf (file, " %d# ", bb->index);
832 fprintf (file, " %d ", bb->index);
834 if (!bb_in_scop_p (bb, scop))
837 fprintf (file, "</TD></TR>\n");
843 fprintf (file, " <TR><TD WIDTH=\"50\" BGCOLOR=\"#ffffff\">");
844 fprintf (file, " %d </TD></TR>\n", bb->index);
847 fprintf (file, " </TABLE>>, shape=box, style=\"setlinewidth(0)\"]\n");
852 FOR_EACH_EDGE (e, ei, bb->succs)
853 fprintf (file, "%d -> %d;\n", bb->index, e->dest->index);
856 fputs ("}\n\n", file);
858 /* Enable debugging again. */
859 dump_flags = tmp_dump_flags;
862 /* Display all SCoPs using dotty. */
867 /* When debugging, enable the following code. This cannot be used
868 in production compilers because it calls "system". */
870 FILE *stream = fopen ("/tmp/allscops.dot", "w");
873 dot_all_scops_1 (stream);
876 system ("dotty /tmp/allscops.dot");
878 dot_all_scops_1 (stderr);
882 /* Returns the outermost loop in SCOP that contains BB. */
885 outermost_loop_in_scop (scop_p scop, basic_block bb)
889 nest = bb->loop_father;
890 while (loop_outer (nest) && loop_in_scop_p (loop_outer (nest), scop))
891 nest = loop_outer (nest);
896 /* Returns the block preceding the entry of SCOP. */
899 block_before_scop (scop_p scop)
901 return SESE_ENTRY (SCOP_REGION (scop))->src;
904 /* Return true when EXPR is an affine function in LOOP with parameters
905 instantiated relative to SCOP_ENTRY. */
908 loop_affine_expr (basic_block scop_entry, struct loop *loop, tree expr)
911 tree scev = analyze_scalar_evolution (loop, expr);
913 scev = instantiate_scev (scop_entry, loop, scev);
915 return (evolution_function_is_invariant_p (scev, n)
916 || evolution_function_is_affine_multivariate_p (scev, n));
919 /* Return false if the tree_code of the operand OP or any of its operands
923 exclude_component_ref (tree op)
930 if (TREE_CODE (op) == COMPONENT_REF)
934 len = TREE_OPERAND_LENGTH (op);
935 for (i = 0; i < len; ++i)
937 if (!exclude_component_ref (TREE_OPERAND (op, i)))
946 /* Return true if the operand OP is simple. */
949 is_simple_operand (loop_p loop, gimple stmt, tree op)
951 /* It is not a simple operand when it is a declaration, */
953 /* or a structure, */
954 || AGGREGATE_TYPE_P (TREE_TYPE (op))
955 /* or a memory access that cannot be analyzed by the data
956 reference analysis. */
957 || ((handled_component_p (op) || INDIRECT_REF_P (op))
958 && !stmt_simple_memref_p (loop, stmt, op)))
961 return exclude_component_ref (op);
964 /* Return true only when STMT is simple enough for being handled by
965 Graphite. This depends on SCOP_ENTRY, as the parametetrs are
966 initialized relatively to this basic block. */
969 stmt_simple_for_scop_p (basic_block scop_entry, gimple stmt)
971 basic_block bb = gimple_bb (stmt);
972 struct loop *loop = bb->loop_father;
974 /* GIMPLE_ASM and GIMPLE_CALL may embed arbitrary side effects.
975 Calls have side-effects, except those to const or pure
977 if (gimple_has_volatile_ops (stmt)
978 || (gimple_code (stmt) == GIMPLE_CALL
979 && !(gimple_call_flags (stmt) & (ECF_CONST | ECF_PURE)))
980 || (gimple_code (stmt) == GIMPLE_ASM))
983 switch (gimple_code (stmt))
993 enum tree_code code = gimple_cond_code (stmt);
995 /* We can only handle this kind of conditional expressions.
996 For inequalities like "if (i != 3 * k)" we need unions of
997 polyhedrons. Expressions like "if (a)" or "if (a == 15)" need
998 them for the else branch. */
999 if (!(code == LT_EXPR
1002 || code == GE_EXPR))
1008 FOR_EACH_SSA_TREE_OPERAND (op, stmt, op_iter, SSA_OP_ALL_USES)
1009 if (!loop_affine_expr (scop_entry, loop, op))
1017 enum tree_code code = gimple_assign_rhs_code (stmt);
1019 switch (get_gimple_rhs_class (code))
1021 case GIMPLE_UNARY_RHS:
1022 case GIMPLE_SINGLE_RHS:
1023 return (is_simple_operand (loop, stmt, gimple_assign_lhs (stmt))
1024 && is_simple_operand (loop, stmt, gimple_assign_rhs1 (stmt)));
1026 case GIMPLE_BINARY_RHS:
1027 return (is_simple_operand (loop, stmt, gimple_assign_lhs (stmt))
1028 && is_simple_operand (loop, stmt, gimple_assign_rhs1 (stmt))
1029 && is_simple_operand (loop, stmt, gimple_assign_rhs2 (stmt)));
1031 case GIMPLE_INVALID_RHS:
1040 size_t n = gimple_call_num_args (stmt);
1041 tree lhs = gimple_call_lhs (stmt);
1043 for (i = 0; i < n; i++)
1045 tree arg = gimple_call_arg (stmt, i);
1047 if (!(is_simple_operand (loop, stmt, lhs)
1048 && is_simple_operand (loop, stmt, arg)))
1056 /* These nodes cut a new scope. */
1063 /* Returns the statement of BB that contains a harmful operation: that
1064 can be a function call with side effects, the induction variables
1065 are not linear with respect to SCOP_ENTRY, etc. The current open
1066 scop should end before this statement. */
1069 harmful_stmt_in_bb (basic_block scop_entry, basic_block bb)
1071 gimple_stmt_iterator gsi;
1073 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1074 if (!stmt_simple_for_scop_p (scop_entry, gsi_stmt (gsi)))
1075 return gsi_stmt (gsi);
1080 /* Returns true when BB will be represented in graphite. Return false
1081 for the basic blocks that contain code eliminated in the code
1082 generation pass: i.e. induction variables and exit conditions. */
1085 graphite_stmt_p (scop_p scop, basic_block bb,
1086 VEC (data_reference_p, heap) *drs)
1088 gimple_stmt_iterator gsi;
1089 loop_p loop = bb->loop_father;
1091 if (VEC_length (data_reference_p, drs) > 0)
1094 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1096 gimple stmt = gsi_stmt (gsi);
1098 switch (gimple_code (stmt))
1100 /* Control flow expressions can be ignored, as they are
1101 represented in the iteration domains and will be
1102 regenerated by graphite. */
1110 tree var = gimple_assign_lhs (stmt);
1111 var = analyze_scalar_evolution (loop, var);
1112 var = instantiate_scev (block_before_scop (scop), loop, var);
1114 if (chrec_contains_undetermined (var))
1128 /* Store the GRAPHITE representation of BB. */
1131 new_graphite_bb (scop_p scop, basic_block bb)
1133 struct graphite_bb *gbb;
1134 VEC (data_reference_p, heap) *drs = VEC_alloc (data_reference_p, heap, 5);
1135 struct loop *nest = outermost_loop_in_scop (scop, bb);
1136 gimple_stmt_iterator gsi;
1138 bitmap_set_bit (SCOP_BBS_B (scop), bb->index);
1140 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1141 find_data_references_in_stmt (nest, gsi_stmt (gsi), &drs);
1143 if (!graphite_stmt_p (scop, bb, drs))
1145 free_data_refs (drs);
1149 gbb = XNEW (struct graphite_bb);
1152 GBB_SCOP (gbb) = scop;
1153 GBB_DATA_REFS (gbb) = drs;
1154 GBB_DOMAIN (gbb) = NULL;
1155 GBB_CONDITIONS (gbb) = NULL;
1156 GBB_CONDITION_CASES (gbb) = NULL;
1157 GBB_LOOPS (gbb) = NULL;
1158 GBB_STATIC_SCHEDULE (gbb) = NULL;
1159 GBB_CLOOG_IV_TYPES (gbb) = NULL;
1160 VEC_safe_push (graphite_bb_p, heap, SCOP_BBS (scop), gbb);
1166 free_graphite_bb (struct graphite_bb *gbb)
1168 if (GBB_DOMAIN (gbb))
1169 cloog_matrix_free (GBB_DOMAIN (gbb));
1171 if (GBB_CLOOG_IV_TYPES (gbb))
1172 htab_delete (GBB_CLOOG_IV_TYPES (gbb));
1174 /* FIXME: free_data_refs is disabled for the moment, but should be
1177 free_data_refs (GBB_DATA_REFS (gbb)); */
1179 VEC_free (gimple, heap, GBB_CONDITIONS (gbb));
1180 VEC_free (gimple, heap, GBB_CONDITION_CASES (gbb));
1181 VEC_free (loop_p, heap, GBB_LOOPS (gbb));
1182 GBB_BB (gbb)->aux = 0;
1188 /* Structure containing the mapping between the old names and the new
1189 names used after block copy in the new loop context. */
1190 typedef struct rename_map_elt
1192 tree old_name, new_name;
1196 /* Print to stderr the element ELT. */
1199 debug_rename_elt (rename_map_elt elt)
1201 fprintf (stderr, "(");
1202 print_generic_expr (stderr, elt->old_name, 0);
1203 fprintf (stderr, ", ");
1204 print_generic_expr (stderr, elt->new_name, 0);
1205 fprintf (stderr, ")\n");
1208 /* Helper function for debug_rename_map. */
1211 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
1213 struct rename_map_elt *entry = (struct rename_map_elt *) *slot;
1214 debug_rename_elt (entry);
1218 /* Print to stderr all the elements of MAP. */
1221 debug_rename_map (htab_t map)
1223 htab_traverse (map, debug_rename_map_1, NULL);
1226 /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
1228 static inline rename_map_elt
1229 new_rename_map_elt (tree old_name, tree new_name)
1233 res = XNEW (struct rename_map_elt);
1234 res->old_name = old_name;
1235 res->new_name = new_name;
1240 /* Computes a hash function for database element ELT. */
1243 rename_map_elt_info (const void *elt)
1245 return htab_hash_pointer (((const struct rename_map_elt *) elt)->old_name);
1248 /* Compares database elements E1 and E2. */
1251 eq_rename_map_elts (const void *e1, const void *e2)
1253 const struct rename_map_elt *elt1 = (const struct rename_map_elt *) e1;
1254 const struct rename_map_elt *elt2 = (const struct rename_map_elt *) e2;
1256 return (elt1->old_name == elt2->old_name);
1259 /* Returns the new name associated to OLD_NAME in MAP. */
1262 get_new_name_from_old_name (htab_t map, tree old_name)
1264 struct rename_map_elt tmp;
1267 tmp.old_name = old_name;
1268 slot = htab_find_slot (map, &tmp, NO_INSERT);
1271 return ((rename_map_elt) *slot)->new_name;
1278 /* Returns true when BB is in REGION. */
1281 bb_in_sese_p (basic_block bb, sese region)
1283 return pointer_set_contains (SESE_REGION_BBS (region), bb);
1286 /* For a USE in BB, if BB is outside REGION, mark the USE in the
1287 SESE_LIVEIN and SESE_LIVEOUT sets. */
1290 sese_build_livein_liveouts_use (sese region, basic_block bb, tree use)
1295 if (TREE_CODE (use) != SSA_NAME)
1298 ver = SSA_NAME_VERSION (use);
1299 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
1301 || !bb_in_sese_p (def_bb, region)
1302 || bb_in_sese_p (bb, region))
1305 if (!SESE_LIVEIN_VER (region, ver))
1306 SESE_LIVEIN_VER (region, ver) = BITMAP_ALLOC (NULL);
1308 bitmap_set_bit (SESE_LIVEIN_VER (region, ver), bb->index);
1309 bitmap_set_bit (SESE_LIVEOUT (region), ver);
1312 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
1313 used in BB that is outside of the REGION. */
1316 sese_build_livein_liveouts_bb (sese region, basic_block bb)
1318 gimple_stmt_iterator bsi;
1324 FOR_EACH_EDGE (e, ei, bb->succs)
1325 for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi))
1326 sese_build_livein_liveouts_use (region, bb,
1327 PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
1329 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1330 FOR_EACH_SSA_TREE_OPERAND (var, gsi_stmt (bsi), iter, SSA_OP_ALL_USES)
1331 sese_build_livein_liveouts_use (region, bb, var);
1334 /* Build the SESE_LIVEIN and SESE_LIVEOUT for REGION. */
1337 sese_build_livein_liveouts (sese region)
1341 SESE_LIVEOUT (region) = BITMAP_ALLOC (NULL);
1342 SESE_NUM_VER (region) = num_ssa_names;
1343 SESE_LIVEIN (region) = XCNEWVEC (bitmap, SESE_NUM_VER (region));
1346 sese_build_livein_liveouts_bb (region, bb);
1349 /* Register basic blocks belonging to a region in a pointer set. */
1352 register_bb_in_sese (basic_block entry_bb, basic_block exit_bb, sese region)
1356 basic_block bb = entry_bb;
1358 FOR_EACH_EDGE (e, ei, bb->succs)
1360 if (!pointer_set_contains (SESE_REGION_BBS (region), e->dest) &&
1361 e->dest->index != exit_bb->index)
1363 pointer_set_insert (SESE_REGION_BBS (region), e->dest);
1364 register_bb_in_sese (e->dest, exit_bb, region);
1369 /* Builds a new SESE region from edges ENTRY and EXIT. */
1372 new_sese (edge entry, edge exit)
1374 sese res = XNEW (struct sese);
1376 SESE_ENTRY (res) = entry;
1377 SESE_EXIT (res) = exit;
1378 SESE_REGION_BBS (res) = pointer_set_create ();
1379 register_bb_in_sese (entry->dest, exit->dest, res);
1381 SESE_LIVEOUT (res) = NULL;
1382 SESE_NUM_VER (res) = 0;
1383 SESE_LIVEIN (res) = NULL;
1388 /* Deletes REGION. */
1391 free_sese (sese region)
1395 for (i = 0; i < SESE_NUM_VER (region); i++)
1396 BITMAP_FREE (SESE_LIVEIN_VER (region, i));
1398 if (SESE_LIVEIN (region))
1399 free (SESE_LIVEIN (region));
1401 if (SESE_LIVEOUT (region))
1402 BITMAP_FREE (SESE_LIVEOUT (region));
1404 pointer_set_destroy (SESE_REGION_BBS (region));
1410 /* Creates a new scop starting with ENTRY. */
1413 new_scop (edge entry, edge exit)
1415 scop_p scop = XNEW (struct scop);
1417 gcc_assert (entry && exit);
1419 SCOP_REGION (scop) = new_sese (entry, exit);
1420 SCOP_BBS (scop) = VEC_alloc (graphite_bb_p, heap, 3);
1421 SCOP_OLDIVS (scop) = VEC_alloc (name_tree, heap, 3);
1422 SCOP_BBS_B (scop) = BITMAP_ALLOC (NULL);
1423 SCOP_LOOPS (scop) = BITMAP_ALLOC (NULL);
1424 SCOP_LOOP_NEST (scop) = VEC_alloc (loop_p, heap, 3);
1425 SCOP_ADD_PARAMS (scop) = true;
1426 SCOP_PARAMS (scop) = VEC_alloc (name_tree, heap, 3);
1427 SCOP_PROG (scop) = cloog_program_malloc ();
1428 cloog_program_set_names (SCOP_PROG (scop), cloog_names_malloc ());
1429 SCOP_LOOP2CLOOG_LOOP (scop) = htab_create (10, hash_loop_to_cloog_loop,
1430 eq_loop_to_cloog_loop,
1432 SCOP_LIVEOUT_RENAMES (scop) = htab_create (10, rename_map_elt_info,
1433 eq_rename_map_elts, free);
1440 free_scop (scop_p scop)
1444 struct graphite_bb *gb;
1447 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
1448 free_graphite_bb (gb);
1450 VEC_free (graphite_bb_p, heap, SCOP_BBS (scop));
1451 BITMAP_FREE (SCOP_BBS_B (scop));
1452 BITMAP_FREE (SCOP_LOOPS (scop));
1453 VEC_free (loop_p, heap, SCOP_LOOP_NEST (scop));
1455 for (i = 0; VEC_iterate (name_tree, SCOP_OLDIVS (scop), i, iv); i++)
1457 VEC_free (name_tree, heap, SCOP_OLDIVS (scop));
1459 for (i = 0; VEC_iterate (name_tree, SCOP_PARAMS (scop), i, p); i++)
1462 VEC_free (name_tree, heap, SCOP_PARAMS (scop));
1463 cloog_program_free (SCOP_PROG (scop));
1464 htab_delete (SCOP_LOOP2CLOOG_LOOP (scop));
1465 htab_delete (SCOP_LIVEOUT_RENAMES (scop));
1466 free_sese (SCOP_REGION (scop));
1470 /* Deletes all scops in SCOPS. */
1473 free_scops (VEC (scop_p, heap) *scops)
1478 for (i = 0; VEC_iterate (scop_p, scops, i, scop); i++)
1481 VEC_free (scop_p, heap, scops);
1484 typedef enum gbb_type {
1486 GBB_LOOP_SING_EXIT_HEADER,
1487 GBB_LOOP_MULT_EXIT_HEADER,
1494 /* Detect the type of BB. Loop headers are only marked, if they are
1495 new. This means their loop_father is different to LAST_LOOP.
1496 Otherwise they are treated like any other bb and their type can be
1500 get_bb_type (basic_block bb, struct loop *last_loop)
1502 VEC (basic_block, heap) *dom;
1504 struct loop *loop = bb->loop_father;
1506 /* Check, if we entry into a new loop. */
1507 if (loop != last_loop)
1509 if (single_exit (loop) != NULL)
1510 return GBB_LOOP_SING_EXIT_HEADER;
1511 else if (loop->num != 0)
1512 return GBB_LOOP_MULT_EXIT_HEADER;
1514 return GBB_COND_HEADER;
1517 dom = get_dominated_by (CDI_DOMINATORS, bb);
1518 nb_dom = VEC_length (basic_block, dom);
1519 VEC_free (basic_block, heap, dom);
1524 nb_suc = VEC_length (edge, bb->succs);
1526 if (nb_dom == 1 && nb_suc == 1)
1529 return GBB_COND_HEADER;
1532 /* A SCoP detection region, defined using bbs as borders.
1533 All control flow touching this region, comes in passing basic_block ENTRY and
1534 leaves passing basic_block EXIT. By using bbs instead of edges for the
1535 borders we are able to represent also regions that do not have a single
1537 But as they have a single entry basic_block and a single exit basic_block, we
1538 are able to generate for every sd_region a single entry and exit edge.
1545 / \ This region contains: {3, 4, 5, 6, 7, 8}
1553 typedef struct sd_region_p
1555 /* The entry bb dominates all bbs in the sd_region. It is part of the
1559 /* The exit bb postdominates all bbs in the sd_region, but is not
1560 part of the region. */
1564 DEF_VEC_O(sd_region);
1565 DEF_VEC_ALLOC_O(sd_region, heap);
1568 /* Moves the scops from SOURCE to TARGET and clean up SOURCE. */
1571 move_sd_regions (VEC (sd_region, heap) **source, VEC (sd_region, heap) **target)
1576 for (i = 0; VEC_iterate (sd_region, *source, i, s); i++)
1577 VEC_safe_push (sd_region, heap, *target, s);
1579 VEC_free (sd_region, heap, *source);
1582 /* Store information needed by scopdet_* functions. */
1586 /* Where the last open scop would stop if the current BB is harmful. */
1589 /* Where the next scop would start if the current BB is harmful. */
1592 /* The bb or one of its children contains open loop exits. That means
1593 loop exit nodes that are not surrounded by a loop dominated by bb. */
1596 /* The bb or one of its children contains only structures we can handle. */
1601 static struct scopdet_info build_scops_1 (basic_block, VEC (sd_region, heap) **,
1604 /* Calculates BB infos. If bb is difficult we add valid SCoPs dominated by BB
1605 to SCOPS. TYPE is the gbb_type of BB. */
1607 static struct scopdet_info
1608 scopdet_basic_block_info (basic_block bb, VEC (sd_region, heap) **scops,
1611 struct loop *loop = bb->loop_father;
1612 struct scopdet_info result;
1615 /* XXX: ENTRY_BLOCK_PTR could be optimized in later steps. */
1616 stmt = harmful_stmt_in_bb (ENTRY_BLOCK_PTR, bb);
1617 result.difficult = (stmt != NULL);
1624 result.exits = false;
1629 result.next = single_succ (bb);
1630 result.exits = false;
1634 case GBB_LOOP_SING_EXIT_HEADER:
1636 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap,3);
1637 struct scopdet_info sinfo;
1639 sinfo = build_scops_1 (bb, &tmp_scops, loop);
1641 result.last = single_exit (bb->loop_father)->src;
1642 result.next = single_exit (bb->loop_father)->dest;
1644 /* If we do not dominate result.next, remove it. It's either
1645 the EXIT_BLOCK_PTR, or another bb dominates it and will
1646 call the scop detection for this bb. */
1647 if (!dominated_by_p (CDI_DOMINATORS, result.next, bb))
1650 if (result.last->loop_father != loop)
1653 if (TREE_CODE (number_of_latch_executions (loop))
1655 result.difficult = true;
1657 if (sinfo.difficult)
1658 move_sd_regions (&tmp_scops, scops);
1660 VEC_free (sd_region, heap, tmp_scops);
1662 result.exits = false;
1663 result.difficult |= sinfo.difficult;
1667 case GBB_LOOP_MULT_EXIT_HEADER:
1669 /* XXX: For now we just do not join loops with multiple exits. If the
1670 exits lead to the same bb it may be possible to join the loop. */
1671 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
1672 VEC (edge, heap) *exits = get_loop_exit_edges (loop);
1675 build_scops_1 (bb, &tmp_scops, loop);
1677 /* Scan the code dominated by this loop. This means all bbs, that are
1678 are dominated by a bb in this loop, but are not part of this loop.
1681 - The loop exit destination is dominated by the exit sources.
1683 TODO: We miss here the more complex cases:
1684 - The exit destinations are dominated by another bb inside the
1686 - The loop dominates bbs, that are not exit destinations. */
1687 for (i = 0; VEC_iterate (edge, exits, i, e); i++)
1688 if (e->src->loop_father == loop
1689 && dominated_by_p (CDI_DOMINATORS, e->dest, e->src))
1691 /* Pass loop_outer to recognize e->dest as loop header in
1693 if (e->dest->loop_father->header == e->dest)
1694 build_scops_1 (e->dest, &tmp_scops,
1695 loop_outer (e->dest->loop_father));
1697 build_scops_1 (e->dest, &tmp_scops, e->dest->loop_father);
1702 result.difficult = true;
1703 result.exits = false;
1704 move_sd_regions (&tmp_scops, scops);
1705 VEC_free (edge, heap, exits);
1708 case GBB_COND_HEADER:
1710 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
1711 struct scopdet_info sinfo;
1712 VEC (basic_block, heap) *dominated;
1715 basic_block last_bb = NULL;
1717 result.exits = false;
1719 /* First check the successors of BB, and check if it is possible to join
1720 the different branches. */
1721 for (i = 0; VEC_iterate (edge, bb->succs, i, e); i++)
1723 /* Ignore loop exits. They will be handled after the loop body. */
1724 if (is_loop_exit (loop, e->dest))
1726 result.exits = true;
1730 /* Do not follow edges that lead to the end of the
1731 conditions block. For example, in
1741 the edge from 0 => 6. Only check if all paths lead to
1744 if (!single_pred_p (e->dest))
1746 /* Check, if edge leads directly to the end of this
1753 if (e->dest != last_bb)
1754 result.difficult = true;
1759 if (!dominated_by_p (CDI_DOMINATORS, e->dest, bb))
1761 result.difficult = true;
1765 sinfo = build_scops_1 (e->dest, &tmp_scops, loop);
1767 result.exits |= sinfo.exits;
1768 result.last = sinfo.last;
1769 result.difficult |= sinfo.difficult;
1771 /* Checks, if all branches end at the same point.
1772 If that is true, the condition stays joinable.
1773 Have a look at the example above. */
1774 if (sinfo.last && single_succ_p (sinfo.last))
1776 basic_block next_tmp = single_succ (sinfo.last);
1781 if (next_tmp != last_bb)
1782 result.difficult = true;
1785 result.difficult = true;
1788 /* If the condition is joinable. */
1789 if (!result.exits && !result.difficult)
1791 /* Only return a next pointer if we dominate this pointer.
1792 Otherwise it will be handled by the bb dominating it. */
1793 if (dominated_by_p (CDI_DOMINATORS, last_bb, bb) && last_bb != bb)
1794 result.next = last_bb;
1798 VEC_free (sd_region, heap, tmp_scops);
1802 /* Scan remaining bbs dominated by BB. */
1803 dominated = get_dominated_by (CDI_DOMINATORS, bb);
1805 for (i = 0; VEC_iterate (basic_block, dominated, i, dom_bb); i++)
1807 /* Ignore loop exits: they will be handled after the loop body. */
1808 if (loop_depth (find_common_loop (loop, dom_bb->loop_father))
1809 < loop_depth (loop))
1811 result.exits = true;
1815 /* Ignore the bbs processed above. */
1816 if (single_pred_p (dom_bb) && single_pred (dom_bb) == bb)
1819 if (loop_depth (loop) > loop_depth (dom_bb->loop_father))
1820 sinfo = build_scops_1 (dom_bb, &tmp_scops, loop_outer (loop));
1822 sinfo = build_scops_1 (dom_bb, &tmp_scops, loop);
1825 result.exits |= sinfo.exits;
1826 result.difficult = true;
1830 VEC_free (basic_block, heap, dominated);
1833 move_sd_regions (&tmp_scops, scops);
1845 /* Creates the SCoPs and writes entry and exit points for every SCoP. */
1847 static struct scopdet_info
1848 build_scops_1 (basic_block current, VEC (sd_region, heap) **scops, loop_p loop)
1850 bool in_scop = false;
1851 sd_region open_scop;
1852 struct scopdet_info sinfo;
1854 /* Initialize result. */
1855 struct scopdet_info result;
1856 result.exits = false;
1857 result.difficult = false;
1860 open_scop.entry = NULL;
1861 open_scop.exit = NULL;
1864 /* Loop over the dominance tree. If we meet a difficult bb, close
1865 the current SCoP. Loop and condition header start a new layer,
1866 and can only be added if all bbs in deeper layers are simple. */
1867 while (current != NULL)
1869 sinfo = scopdet_basic_block_info (current, scops, get_bb_type (current,
1872 if (!in_scop && !(sinfo.exits || sinfo.difficult))
1874 open_scop.entry = current;
1875 open_scop.exit = NULL;
1878 else if (in_scop && (sinfo.exits || sinfo.difficult))
1880 open_scop.exit = current;
1881 VEC_safe_push (sd_region, heap, *scops, &open_scop);
1885 result.difficult |= sinfo.difficult;
1886 result.exits |= sinfo.exits;
1888 current = sinfo.next;
1891 /* Try to close open_scop, if we are still in an open SCoP. */
1897 for (i = 0; VEC_iterate (edge, sinfo.last->succs, i, e); i++)
1898 if (dominated_by_p (CDI_POST_DOMINATORS, sinfo.last, e->dest))
1899 open_scop.exit = e->dest;
1901 if (!open_scop.exit && open_scop.entry != sinfo.last)
1902 open_scop.exit = sinfo.last;
1905 VEC_safe_push (sd_region, heap, *scops, &open_scop);
1909 result.last = sinfo.last;
1913 /* Checks if a bb is contained in REGION. */
1916 bb_in_sd_region (basic_block bb, sd_region *region)
1918 return dominated_by_p (CDI_DOMINATORS, bb, region->entry)
1919 && !(dominated_by_p (CDI_DOMINATORS, bb, region->exit)
1920 && !dominated_by_p (CDI_DOMINATORS, region->entry,
1924 /* Returns the single entry edge of REGION, if it does not exits NULL. */
1927 find_single_entry_edge (sd_region *region)
1933 FOR_EACH_EDGE (e, ei, region->entry->preds)
1934 if (!bb_in_sd_region (e->src, region))
1949 /* Returns the single exit edge of REGION, if it does not exits NULL. */
1952 find_single_exit_edge (sd_region *region)
1958 FOR_EACH_EDGE (e, ei, region->exit->preds)
1959 if (bb_in_sd_region (e->src, region))
1974 /* Create a single entry edge for REGION. */
1977 create_single_entry_edge (sd_region *region)
1979 if (find_single_entry_edge (region))
1982 /* There are multiple predecessors for bb_3
1995 There are two edges (1->3, 2->3), that point from outside into the region,
1996 and another one (5->3), a loop latch, lead to bb_3.
2004 | |\ (3.0 -> 3.1) = single entry edge
2013 If the loop is part of the SCoP, we have to redirect the loop latches.
2019 | | (3.0 -> 3.1) = entry edge
2028 if (region->entry->loop_father->header != region->entry
2029 || dominated_by_p (CDI_DOMINATORS,
2030 loop_latch_edge (region->entry->loop_father)->src,
2033 edge forwarder = split_block_after_labels (region->entry);
2034 region->entry = forwarder->dest;
2037 /* This case is never executed, as the loop headers seem always to have a
2038 single edge pointing from outside into the loop. */
2041 #ifdef ENABLE_CHECKING
2042 gcc_assert (find_single_entry_edge (region));
2046 /* Check if the sd_region, mentioned in EDGE, has no exit bb. */
2049 sd_region_without_exit (edge e)
2051 sd_region *r = (sd_region *) e->aux;
2054 return r->exit == NULL;
2059 /* Create a single exit edge for REGION. */
2062 create_single_exit_edge (sd_region *region)
2066 edge forwarder = NULL;
2069 if (find_single_exit_edge (region))
2072 /* We create a forwarder bb (5) for all edges leaving this region
2073 (3->5, 4->5). All other edges leading to the same bb, are moved
2074 to a new bb (6). If these edges where part of another region (2->5)
2075 we update the region->exit pointer, of this region.
2077 To identify which edge belongs to which region we depend on the e->aux
2078 pointer in every edge. It points to the region of the edge or to NULL,
2079 if the edge is not part of any region.
2081 1 2 3 4 1->5 no region, 2->5 region->exit = 5,
2082 \| |/ 3->5 region->exit = NULL, 4->5 region->exit = NULL
2087 1 2 3 4 1->6 no region, 2->6 region->exit = 6,
2088 | | \/ 3->5 no region, 4->5 no region,
2090 \| / 5->6 region->exit = 6
2093 Now there is only a single exit edge (5->6). */
2094 exit = region->exit;
2095 region->exit = NULL;
2096 forwarder = make_forwarder_block (exit, &sd_region_without_exit, NULL);
2098 /* Unmark the edges, that are no longer exit edges. */
2099 FOR_EACH_EDGE (e, ei, forwarder->src->preds)
2103 /* Mark the new exit edge. */
2104 single_succ_edge (forwarder->src)->aux = region;
2106 /* Update the exit bb of all regions, where exit edges lead to
2108 FOR_EACH_EDGE (e, ei, forwarder->dest->preds)
2110 ((sd_region *) e->aux)->exit = forwarder->dest;
2112 #ifdef ENABLE_CHECKING
2113 gcc_assert (find_single_exit_edge (region));
2117 /* Unmark the exit edges of all REGIONS.
2118 See comment in "create_single_exit_edge". */
2121 unmark_exit_edges (VEC (sd_region, heap) *regions)
2128 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2129 FOR_EACH_EDGE (e, ei, s->exit->preds)
2134 /* Mark the exit edges of all REGIONS.
2135 See comment in "create_single_exit_edge". */
2138 mark_exit_edges (VEC (sd_region, heap) *regions)
2145 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2146 FOR_EACH_EDGE (e, ei, s->exit->preds)
2147 if (bb_in_sd_region (e->src, s))
2151 /* Free and compute again all the dominators information. */
2154 recompute_all_dominators (void)
2156 mark_irreducible_loops ();
2157 free_dominance_info (CDI_DOMINATORS);
2158 free_dominance_info (CDI_POST_DOMINATORS);
2159 calculate_dominance_info (CDI_DOMINATORS);
2160 calculate_dominance_info (CDI_POST_DOMINATORS);
2163 /* Verifies properties that GRAPHITE should maintain during translation. */
2166 graphite_verify (void)
2168 #ifdef ENABLE_CHECKING
2169 verify_loop_structure ();
2170 verify_dominators (CDI_DOMINATORS);
2171 verify_dominators (CDI_POST_DOMINATORS);
2176 /* Create for all scop regions a single entry and a single exit edge. */
2179 create_sese_edges (VEC (sd_region, heap) *regions)
2184 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2185 create_single_entry_edge (s);
2187 mark_exit_edges (regions);
2189 for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
2190 create_single_exit_edge (s);
2192 unmark_exit_edges (regions);
2194 fix_loop_structure (NULL);
2196 #ifdef ENABLE_CHECKING
2197 verify_loop_structure ();
2198 verify_dominators (CDI_DOMINATORS);
2203 /* Create graphite SCoPs from an array of scop detection regions. */
2206 build_graphite_scops (VEC (sd_region, heap) *scop_regions)
2211 for (i = 0; VEC_iterate (sd_region, scop_regions, i, s); i++)
2213 edge entry = find_single_entry_edge (s);
2214 edge exit = find_single_exit_edge (s);
2215 scop_p scop = new_scop (entry, exit);
2216 VEC_safe_push (scop_p, heap, current_scops, scop);
2218 /* Are there overlapping SCoPs? */
2219 #ifdef ENABLE_CHECKING
2224 for (j = 0; VEC_iterate (sd_region, scop_regions, j, s2); j++)
2226 gcc_assert (!bb_in_sd_region (s->entry, s2));
2232 /* Find static control parts. */
2237 struct loop *loop = current_loops->tree_root;
2238 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
2240 build_scops_1 (single_succ (ENTRY_BLOCK_PTR), &tmp_scops, loop);
2241 create_sese_edges (tmp_scops);
2242 build_graphite_scops (tmp_scops);
2243 VEC_free (sd_region, heap, tmp_scops);
2246 /* Gather the basic blocks belonging to the SCOP. */
2249 build_scop_bbs (scop_p scop)
2251 basic_block *stack = XNEWVEC (basic_block, n_basic_blocks + 1);
2252 sbitmap visited = sbitmap_alloc (last_basic_block);
2255 sbitmap_zero (visited);
2256 stack[sp++] = SCOP_ENTRY (scop);
2260 basic_block bb = stack[--sp];
2261 int depth = loop_depth (bb->loop_father);
2262 int num = bb->loop_father->num;
2266 /* Scop's exit is not in the scop. Exclude also bbs, which are
2267 dominated by the SCoP exit. These are e.g. loop latches. */
2268 if (TEST_BIT (visited, bb->index)
2269 || dominated_by_p (CDI_DOMINATORS, bb, SCOP_EXIT (scop))
2270 /* Every block in the scop is dominated by scop's entry. */
2271 || !dominated_by_p (CDI_DOMINATORS, bb, SCOP_ENTRY (scop)))
2274 new_graphite_bb (scop, bb);
2275 SET_BIT (visited, bb->index);
2277 /* First push the blocks that have to be processed last. Note
2278 that this means that the order in which the code is organized
2279 below is important: do not reorder the following code. */
2280 FOR_EACH_EDGE (e, ei, bb->succs)
2281 if (! TEST_BIT (visited, e->dest->index)
2282 && (int) loop_depth (e->dest->loop_father) < depth)
2283 stack[sp++] = e->dest;
2285 FOR_EACH_EDGE (e, ei, bb->succs)
2286 if (! TEST_BIT (visited, e->dest->index)
2287 && (int) loop_depth (e->dest->loop_father) == depth
2288 && e->dest->loop_father->num != num)
2289 stack[sp++] = e->dest;
2291 FOR_EACH_EDGE (e, ei, bb->succs)
2292 if (! TEST_BIT (visited, e->dest->index)
2293 && (int) loop_depth (e->dest->loop_father) == depth
2294 && e->dest->loop_father->num == num
2295 && EDGE_COUNT (e->dest->preds) > 1)
2296 stack[sp++] = e->dest;
2298 FOR_EACH_EDGE (e, ei, bb->succs)
2299 if (! TEST_BIT (visited, e->dest->index)
2300 && (int) loop_depth (e->dest->loop_father) == depth
2301 && e->dest->loop_father->num == num
2302 && EDGE_COUNT (e->dest->preds) == 1)
2303 stack[sp++] = e->dest;
2305 FOR_EACH_EDGE (e, ei, bb->succs)
2306 if (! TEST_BIT (visited, e->dest->index)
2307 && (int) loop_depth (e->dest->loop_father) > depth)
2308 stack[sp++] = e->dest;
2312 sbitmap_free (visited);
2315 /* Returns the number of reduction phi nodes in LOOP. */
2318 nb_reductions_in_loop (loop_p loop)
2321 gimple_stmt_iterator gsi;
2323 for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); gsi_next (&gsi))
2325 gimple phi = gsi_stmt (gsi);
2329 if (!is_gimple_reg (PHI_RESULT (phi)))
2332 scev = analyze_scalar_evolution (loop, PHI_RESULT (phi));
2333 scev = instantiate_parameters (loop, scev);
2334 if (!simple_iv (loop, phi, PHI_RESULT (phi), &iv, true))
2341 /* A LOOP is in normal form when it contains only one scalar phi node
2342 that defines the main induction variable of the loop, only one
2343 increment of the IV, and only one exit condition. */
2346 graphite_loop_normal_form (loop_p loop)
2348 struct tree_niter_desc niter;
2351 edge exit = single_dom_exit (loop);
2353 if (!number_of_iterations_exit (loop, exit, &niter, false))
2356 nit = force_gimple_operand (unshare_expr (niter.niter), &stmts, true,
2359 gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
2361 /* One IV per loop. */
2362 if (nb_reductions_in_loop (loop) > 0)
2365 return canonicalize_loop_ivs (loop, NULL, nit);
2368 /* Record LOOP as occuring in SCOP. Returns true when the operation
2372 scop_record_loop (scop_p scop, loop_p loop)
2377 if (bitmap_bit_p (SCOP_LOOPS (scop), loop->num))
2380 bitmap_set_bit (SCOP_LOOPS (scop), loop->num);
2381 VEC_safe_push (loop_p, heap, SCOP_LOOP_NEST (scop), loop);
2383 induction_var = graphite_loop_normal_form (loop);
2387 oldiv = XNEW (struct name_tree);
2388 oldiv->t = induction_var;
2389 oldiv->name = get_name (SSA_NAME_VAR (oldiv->t));
2391 VEC_safe_push (name_tree, heap, SCOP_OLDIVS (scop), oldiv);
2395 /* Build the loop nests contained in SCOP. Returns true when the
2396 operation was successful. */
2399 build_scop_loop_nests (scop_p scop)
2403 struct loop *loop0, *loop1;
2406 if (bb_in_scop_p (bb, scop))
2408 struct loop *loop = bb->loop_father;
2410 /* Only add loops if they are completely contained in the SCoP. */
2411 if (loop->header == bb
2412 && bb_in_scop_p (loop->latch, scop))
2414 if (!scop_record_loop (scop, loop))
2419 /* Make sure that the loops in the SCOP_LOOP_NEST are ordered. It
2420 can be the case that an inner loop is inserted before an outer
2421 loop. To avoid this, semi-sort once. */
2422 for (i = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), i, loop0); i++)
2424 if (VEC_length (loop_p, SCOP_LOOP_NEST (scop)) == i + 1)
2427 loop1 = VEC_index (loop_p, SCOP_LOOP_NEST (scop), i + 1);
2428 if (loop0->num > loop1->num)
2430 VEC_replace (loop_p, SCOP_LOOP_NEST (scop), i, loop1);
2431 VEC_replace (loop_p, SCOP_LOOP_NEST (scop), i + 1, loop0);
2438 /* Build dynamic schedules for all the BBs. */
2441 build_scop_dynamic_schedules (scop_p scop)
2443 int i, dim, loop_num, row, col;
2446 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
2448 loop_num = GBB_BB (gb)->loop_father->num;
2452 dim = nb_loops_around_gb (gb);
2453 GBB_DYNAMIC_SCHEDULE (gb) = cloog_matrix_alloc (dim, dim);
2455 for (row = 0; row < GBB_DYNAMIC_SCHEDULE (gb)->NbRows; row++)
2456 for (col = 0; col < GBB_DYNAMIC_SCHEDULE (gb)->NbColumns; col++)
2458 value_set_si (GBB_DYNAMIC_SCHEDULE (gb)->p[row][col], 1);
2460 value_set_si (GBB_DYNAMIC_SCHEDULE (gb)->p[row][col], 0);
2463 GBB_DYNAMIC_SCHEDULE (gb) = NULL;
2467 /* Build for BB the static schedule.
2469 The STATIC_SCHEDULE is defined like this:
2488 Static schedules for A to F:
2501 build_scop_canonical_schedules (scop_p scop)
2505 int nb = scop_nb_loops (scop) + 1;
2507 SCOP_STATIC_SCHEDULE (scop) = lambda_vector_new (nb);
2509 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
2511 int offset = nb_loops_around_gb (gb);
2513 /* After leaving a loop, it is possible that the schedule is not
2514 set at zero. This loop reinitializes components located
2517 for (j = offset + 1; j < nb; j++)
2518 if (SCOP_STATIC_SCHEDULE (scop)[j])
2520 memset (&(SCOP_STATIC_SCHEDULE (scop)[j]), 0,
2521 sizeof (int) * (nb - j));
2522 ++SCOP_STATIC_SCHEDULE (scop)[offset];
2526 GBB_STATIC_SCHEDULE (gb) = lambda_vector_new (offset + 1);
2527 lambda_vector_copy (SCOP_STATIC_SCHEDULE (scop),
2528 GBB_STATIC_SCHEDULE (gb), offset + 1);
2530 ++SCOP_STATIC_SCHEDULE (scop)[offset];
2534 /* Build the LOOPS vector for all bbs in SCOP. */
2537 build_bb_loops (scop_p scop)
2542 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
2547 depth = nb_loops_around_gb (gb) - 1;
2549 GBB_LOOPS (gb) = VEC_alloc (loop_p, heap, 3);
2550 VEC_safe_grow_cleared (loop_p, heap, GBB_LOOPS (gb), depth + 1);
2552 loop = GBB_BB (gb)->loop_father;
2554 while (scop_contains_loop (scop, loop))
2556 VEC_replace (loop_p, GBB_LOOPS (gb), depth, loop);
2557 loop = loop_outer (loop);
2563 /* Get the index for parameter VAR in SCOP. */
2566 param_index (tree var, scop_p scop)
2572 gcc_assert (TREE_CODE (var) == SSA_NAME);
2574 for (i = 0; VEC_iterate (name_tree, SCOP_PARAMS (scop), i, p); i++)
2578 gcc_assert (SCOP_ADD_PARAMS (scop));
2580 nvar = XNEW (struct name_tree);
2583 VEC_safe_push (name_tree, heap, SCOP_PARAMS (scop), nvar);
2584 return VEC_length (name_tree, SCOP_PARAMS (scop)) - 1;
2587 /* Scan EXPR and translate it to an inequality vector INEQ that will
2588 be added, or subtracted, in the constraint domain matrix C at row
2589 R. K is the number of columns for loop iterators in C. */
2592 scan_tree_for_params (scop_p s, tree e, CloogMatrix *c, int r, Value k,
2595 int cst_col, param_col;
2597 if (e == chrec_dont_know)
2600 switch (TREE_CODE (e))
2602 case POLYNOMIAL_CHREC:
2604 tree left = CHREC_LEFT (e);
2605 tree right = CHREC_RIGHT (e);
2606 int var = CHREC_VARIABLE (e);
2608 if (TREE_CODE (right) != INTEGER_CST)
2613 int loop_col = scop_gimple_loop_depth (s, get_loop (var)) + 1;
2616 value_sub_int (c->p[r][loop_col], c->p[r][loop_col],
2617 int_cst_value (right));
2619 value_add_int (c->p[r][loop_col], c->p[r][loop_col],
2620 int_cst_value (right));
2623 switch (TREE_CODE (left))
2625 case POLYNOMIAL_CHREC:
2626 scan_tree_for_params (s, left, c, r, k, subtract);
2630 /* Constant part. */
2633 int v = int_cst_value (left);
2634 cst_col = c->NbColumns - 1;
2639 subtract = subtract ? false : true;
2643 value_sub_int (c->p[r][cst_col], c->p[r][cst_col], v);
2645 value_add_int (c->p[r][cst_col], c->p[r][cst_col], v);
2650 scan_tree_for_params (s, left, c, r, k, subtract);
2657 if (chrec_contains_symbols (TREE_OPERAND (e, 0)))
2662 gcc_assert (host_integerp (TREE_OPERAND (e, 1), 0));
2664 value_set_si (val, int_cst_value (TREE_OPERAND (e, 1)));
2665 value_multiply (k, k, val);
2668 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2675 gcc_assert (host_integerp (TREE_OPERAND (e, 0), 0));
2677 value_set_si (val, int_cst_value (TREE_OPERAND (e, 0)));
2678 value_multiply (k, k, val);
2681 scan_tree_for_params (s, TREE_OPERAND (e, 1), c, r, k, subtract);
2686 case POINTER_PLUS_EXPR:
2687 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2688 scan_tree_for_params (s, TREE_OPERAND (e, 1), c, r, k, subtract);
2692 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2693 value_oppose (k, k);
2694 scan_tree_for_params (s, TREE_OPERAND (e, 1), c, r, k, subtract);
2698 value_oppose (k, k);
2699 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2703 param_col = param_index (e, s);
2707 param_col += c->NbColumns - scop_nb_params (s) - 1;
2710 value_subtract (c->p[r][param_col], c->p[r][param_col], k);
2712 value_addto (c->p[r][param_col], c->p[r][param_col], k);
2719 int v = int_cst_value (e);
2720 cst_col = c->NbColumns - 1;
2725 subtract = subtract ? false : true;
2729 value_sub_int (c->p[r][cst_col], c->p[r][cst_col], v);
2731 value_add_int (c->p[r][cst_col], c->p[r][cst_col], v);
2737 case NON_LVALUE_EXPR:
2738 scan_tree_for_params (s, TREE_OPERAND (e, 0), c, r, k, subtract);
2747 /* Data structure for idx_record_params. */
2755 /* For a data reference with an ARRAY_REF as its BASE, record the
2756 parameters occurring in IDX. DTA is passed in as complementary
2757 information, and is used by the automatic walker function. This
2758 function is a callback for for_each_index. */
2761 idx_record_params (tree base, tree *idx, void *dta)
2763 struct irp_data *data = (struct irp_data *) dta;
2765 if (TREE_CODE (base) != ARRAY_REF)
2768 if (TREE_CODE (*idx) == SSA_NAME)
2771 scop_p scop = data->scop;
2772 struct loop *loop = data->loop;
2775 scev = analyze_scalar_evolution (loop, *idx);
2776 scev = instantiate_scev (block_before_scop (scop), loop, scev);
2779 value_set_si (one, 1);
2780 scan_tree_for_params (scop, scev, NULL, 0, one, false);
2787 /* Find parameters with respect to SCOP in BB. We are looking in memory
2788 access functions, conditions and loop bounds. */
2791 find_params_in_bb (scop_p scop, graphite_bb_p gb)
2794 data_reference_p dr;
2796 loop_p father = GBB_BB (gb)->loop_father;
2798 for (i = 0; VEC_iterate (data_reference_p, GBB_DATA_REFS (gb), i, dr); i++)
2800 struct irp_data irp;
2804 for_each_index (&dr->ref, idx_record_params, &irp);
2807 /* Find parameters in conditional statements. */
2808 for (i = 0; VEC_iterate (gimple, GBB_CONDITIONS (gb), i, stmt); i++)
2811 loop_p loop = father;
2815 lhs = gimple_cond_lhs (stmt);
2816 lhs = analyze_scalar_evolution (loop, lhs);
2817 lhs = instantiate_scev (block_before_scop (scop), loop, lhs);
2819 rhs = gimple_cond_rhs (stmt);
2820 rhs = analyze_scalar_evolution (loop, rhs);
2821 rhs = instantiate_scev (block_before_scop (scop), loop, rhs);
2824 scan_tree_for_params (scop, lhs, NULL, 0, one, false);
2825 value_set_si (one, 1);
2826 scan_tree_for_params (scop, rhs, NULL, 0, one, false);
2831 /* Saves in NV the name of variable P->T. */
2834 save_var_name (char **nv, int i, name_tree p)
2836 const char *name = get_name (SSA_NAME_VAR (p->t));
2840 int len = strlen (name) + 16;
2841 nv[i] = XNEWVEC (char, len);
2842 snprintf (nv[i], len, "%s_%d", name, SSA_NAME_VERSION (p->t));
2846 nv[i] = XNEWVEC (char, 16);
2847 snprintf (nv[i], 2 + 16, "T_%d", SSA_NAME_VERSION (p->t));
2853 /* Return the maximal loop depth in SCOP. */
2856 scop_max_loop_depth (scop_p scop)
2860 int max_nb_loops = 0;
2862 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gbb); i++)
2864 int nb_loops = gbb_nb_loops (gbb);
2865 if (max_nb_loops < nb_loops)
2866 max_nb_loops = nb_loops;
2869 return max_nb_loops;
2872 /* Initialize Cloog's parameter names from the names used in GIMPLE.
2873 Initialize Cloog's iterator names, using 'graphite_iterator_%d'
2874 from 0 to scop_nb_loops (scop). */
2877 initialize_cloog_names (scop_p scop)
2879 int i, nb_params = VEC_length (name_tree, SCOP_PARAMS (scop));
2880 char **params = XNEWVEC (char *, nb_params);
2881 int nb_iterators = scop_max_loop_depth (scop);
2882 int nb_scattering= cloog_program_nb_scattdims (SCOP_PROG (scop));
2883 char **iterators = XNEWVEC (char *, nb_iterators * 2);
2884 char **scattering = XNEWVEC (char *, nb_scattering);
2887 for (i = 0; VEC_iterate (name_tree, SCOP_PARAMS (scop), i, p); i++)
2888 save_var_name (params, i, p);
2890 cloog_names_set_nb_parameters (cloog_program_names (SCOP_PROG (scop)),
2892 cloog_names_set_parameters (cloog_program_names (SCOP_PROG (scop)),
2895 for (i = 0; i < nb_iterators; i++)
2898 iterators[i] = XNEWVEC (char, len);
2899 snprintf (iterators[i], len, "graphite_iterator_%d", i);
2902 cloog_names_set_nb_iterators (cloog_program_names (SCOP_PROG (scop)),
2904 cloog_names_set_iterators (cloog_program_names (SCOP_PROG (scop)),
2907 for (i = 0; i < nb_scattering; i++)
2910 scattering[i] = XNEWVEC (char, len);
2911 snprintf (scattering[i], len, "s_%d", i);
2914 cloog_names_set_nb_scattering (cloog_program_names (SCOP_PROG (scop)),
2916 cloog_names_set_scattering (cloog_program_names (SCOP_PROG (scop)),
2920 /* Record the parameters used in the SCOP. A variable is a parameter
2921 in a scop if it does not vary during the execution of that scop. */
2924 find_scop_parameters (scop_p scop)
2932 value_set_si (one, 1);
2934 /* Find the parameters used in the loop bounds. */
2935 for (i = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), i, loop); i++)
2937 tree nb_iters = number_of_latch_executions (loop);
2939 if (!chrec_contains_symbols (nb_iters))
2942 nb_iters = analyze_scalar_evolution (loop, nb_iters);
2943 nb_iters = instantiate_scev (block_before_scop (scop), loop, nb_iters);
2944 scan_tree_for_params (scop, nb_iters, NULL, 0, one, false);
2949 /* Find the parameters used in data accesses. */
2950 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
2951 find_params_in_bb (scop, gb);
2953 SCOP_ADD_PARAMS (scop) = false;
2956 /* Build the context constraints for SCOP: constraints and relations
2960 build_scop_context (scop_p scop)
2962 int nb_params = scop_nb_params (scop);
2963 CloogMatrix *matrix = cloog_matrix_alloc (1, nb_params + 2);
2965 /* Insert '0 >= 0' in the context matrix, as it is not allowed to be
2968 value_set_si (matrix->p[0][0], 1);
2970 value_set_si (matrix->p[0][nb_params + 1], 0);
2972 cloog_program_set_context (SCOP_PROG (scop),
2973 cloog_domain_matrix2domain (matrix));
2974 cloog_matrix_free (matrix);
2977 /* Returns a graphite_bb from BB. */
2979 static inline graphite_bb_p
2980 gbb_from_bb (basic_block bb)
2982 return (graphite_bb_p) bb->aux;
2985 /* Builds the constraint matrix for LOOP in SCOP. NB_OUTER_LOOPS is the
2986 number of loops surrounding LOOP in SCOP. OUTER_CSTR gives the
2987 constraints matrix for the surrounding loops. */
2990 build_loop_iteration_domains (scop_p scop, struct loop *loop,
2991 CloogMatrix *outer_cstr, int nb_outer_loops)
2997 int nb_rows = outer_cstr->NbRows + 1;
2998 int nb_cols = outer_cstr->NbColumns + 1;
3000 /* Last column of CSTR is the column of constants. */
3001 int cst_col = nb_cols - 1;
3003 /* The column for the current loop is just after the columns of
3004 other outer loops. */
3005 int loop_col = nb_outer_loops + 1;
3007 tree nb_iters = number_of_latch_executions (loop);
3009 /* When the number of iterations is a constant or a parameter, we
3010 add a constraint for the upper bound of the loop. So add a row
3011 to the constraint matrix before allocating it. */
3012 if (TREE_CODE (nb_iters) == INTEGER_CST
3013 || !chrec_contains_undetermined (nb_iters))
3016 cstr = cloog_matrix_alloc (nb_rows, nb_cols);
3018 /* Copy the outer constraints. */
3019 for (i = 0; i < outer_cstr->NbRows; i++)
3021 /* Copy the eq/ineq and loops columns. */
3022 for (j = 0; j < loop_col; j++)
3023 value_assign (cstr->p[i][j], outer_cstr->p[i][j]);
3025 /* Leave an empty column in CSTR for the current loop, and then
3026 copy the parameter columns. */
3027 for (j = loop_col; j < outer_cstr->NbColumns; j++)
3028 value_assign (cstr->p[i][j + 1], outer_cstr->p[i][j]);
3032 row = outer_cstr->NbRows;
3033 value_set_si (cstr->p[row][0], 1);
3034 value_set_si (cstr->p[row][loop_col], 1);
3036 /* loop_i <= nb_iters */
3037 if (TREE_CODE (nb_iters) == INTEGER_CST)
3040 value_set_si (cstr->p[row][0], 1);
3041 value_set_si (cstr->p[row][loop_col], -1);
3043 value_set_si (cstr->p[row][cst_col],
3044 int_cst_value (nb_iters));
3046 else if (!chrec_contains_undetermined (nb_iters))
3048 /* Otherwise nb_iters contains parameters: scan the nb_iters
3049 expression and build its matrix representation. */
3053 value_set_si (cstr->p[row][0], 1);
3054 value_set_si (cstr->p[row][loop_col], -1);
3056 nb_iters = analyze_scalar_evolution (loop, nb_iters);
3057 nb_iters = instantiate_scev (block_before_scop (scop), loop, nb_iters);
3060 value_set_si (one, 1);
3061 scan_tree_for_params (scop, nb_iters, cstr, row, one, false);
3067 if (loop->inner && loop_in_scop_p (loop->inner, scop))
3068 build_loop_iteration_domains (scop, loop->inner, cstr, nb_outer_loops + 1);
3070 /* Only go to the next loops, if we are not at the outermost layer. These
3071 have to be handled seperately, as we can be sure, that the chain at this
3072 layer will be connected. */
3073 if (nb_outer_loops != 0 && loop->next && loop_in_scop_p (loop->next, scop))
3074 build_loop_iteration_domains (scop, loop->next, outer_cstr, nb_outer_loops);
3076 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
3077 if (gbb_loop (gb) == loop)
3078 GBB_DOMAIN (gb) = cloog_matrix_copy (cstr);
3080 cloog_matrix_free (cstr);
3083 /* Add conditions to the domain of GB. */
3086 add_conditions_to_domain (graphite_bb_p gb)
3090 VEC (gimple, heap) *conditions = GBB_CONDITIONS (gb);
3091 CloogMatrix *domain = GBB_DOMAIN (gb);
3092 scop_p scop = GBB_SCOP (gb);
3096 unsigned nb_new_rows = 0;
3099 if (VEC_empty (gimple, conditions))
3104 nb_rows = domain->NbRows;
3105 nb_cols = domain->NbColumns;
3110 nb_cols = scop_nb_params (scop) + 2;
3113 /* Count number of necessary new rows to add the conditions to the
3115 for (i = 0; VEC_iterate (gimple, conditions, i, stmt); i++)
3117 switch (gimple_code (stmt))
3121 enum tree_code code = gimple_cond_code (stmt);
3127 /* NE and EQ statements are not supported right know. */
3143 /* Switch statements are not supported right know. */
3154 /* Enlarge the matrix. */
3156 CloogMatrix *new_domain;
3157 new_domain = cloog_matrix_alloc (nb_rows + nb_new_rows, nb_cols);
3159 for (i = 0; i < nb_rows; i++)
3160 for (j = 0; j < nb_cols; j++)
3161 value_assign (new_domain->p[i][j], domain->p[i][j]);
3163 cloog_matrix_free (domain);
3164 domain = new_domain;
3165 GBB_DOMAIN (gb) = new_domain;
3168 /* Add the conditions to the new enlarged domain matrix. */
3170 for (i = 0; VEC_iterate (gimple, conditions, i, stmt); i++)
3172 switch (gimple_code (stmt))
3177 enum tree_code code;
3180 loop_p loop = GBB_BB (gb)->loop_father;
3182 left = gimple_cond_lhs (stmt);
3183 right = gimple_cond_rhs (stmt);
3185 left = analyze_scalar_evolution (loop, left);
3186 right = analyze_scalar_evolution (loop, right);
3188 left = instantiate_scev (block_before_scop (scop), loop, left);
3189 right = instantiate_scev (block_before_scop (scop), loop, right);
3191 code = gimple_cond_code (stmt);
3193 /* The conditions for ELSE-branches are inverted. */
3194 if (VEC_index (gimple, gb->condition_cases, i) == NULL)
3195 code = invert_tree_comparison (code, false);
3200 /* NE statements are not supported right know. */
3204 value_set_si (domain->p[row][0], 1);
3206 value_set_si (one, 1);
3207 scan_tree_for_params (scop, left, domain, row, one, true);
3208 value_set_si (one, 1);
3209 scan_tree_for_params (scop, right, domain, row, one, false);
3211 value_set_si (domain->p[row][0], 1);
3212 value_set_si (one, 1);
3213 scan_tree_for_params (scop, left, domain, row, one, false);
3214 value_set_si (one, 1);
3215 scan_tree_for_params (scop, right, domain, row, one, true);
3220 value_set_si (domain->p[row][0], 1);
3222 value_set_si (one, 1);
3223 scan_tree_for_params (scop, left, domain, row, one, true);
3224 value_set_si (one, 1);
3225 scan_tree_for_params (scop, right, domain, row, one, false);
3226 value_sub_int (domain->p[row][nb_cols - 1],
3227 domain->p[row][nb_cols - 1], 1);
3232 value_set_si (domain->p[row][0], 1);
3234 value_set_si (one, 1);
3235 scan_tree_for_params (scop, left, domain, row, one, false);
3236 value_set_si (one, 1);
3237 scan_tree_for_params (scop, right, domain, row, one, true);
3238 value_sub_int (domain->p[row][nb_cols - 1],
3239 domain->p[row][nb_cols - 1], 1);
3244 value_set_si (domain->p[row][0], 1);
3246 value_set_si (one, 1);
3247 scan_tree_for_params (scop, left, domain, row, one, true);
3248 value_set_si (one, 1);
3249 scan_tree_for_params (scop, right, domain, row, one, false);
3254 value_set_si (domain->p[row][0], 1);
3256 value_set_si (one, 1);
3257 scan_tree_for_params (scop, left, domain, row, one, false);
3258 value_set_si (one, 1);
3259 scan_tree_for_params (scop, right, domain, row, one, true);
3270 /* Switch statements are not supported right know. */
3281 /* Helper recursive function. */
3284 build_scop_conditions_1 (VEC (gimple, heap) **conditions,
3285 VEC (gimple, heap) **cases, basic_block bb,
3290 gimple_stmt_iterator gsi;
3291 basic_block bb_child, bb_iter;
3292 VEC (basic_block, heap) *dom;
3294 /* Make sure we are in the SCoP. */
3295 if (!bb_in_scop_p (bb, scop))
3298 /* Record conditions in graphite_bb. */
3299 gbb = gbb_from_bb (bb);
3302 GBB_CONDITIONS (gbb) = VEC_copy (gimple, heap, *conditions);
3303 GBB_CONDITION_CASES (gbb) = VEC_copy (gimple, heap, *cases);
3304 add_conditions_to_domain (gbb);
3307 dom = get_dominated_by (CDI_DOMINATORS, bb);
3309 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3311 gimple stmt = gsi_stmt (gsi);
3312 VEC (edge, gc) *edges;
3315 switch (gimple_code (stmt))
3319 for (i = 0; VEC_iterate (edge, edges, i, e); i++)
3320 if ((dominated_by_p (CDI_DOMINATORS, e->dest, bb))
3321 && VEC_length (edge, e->dest->preds) == 1)
3323 /* Remove the scanned block from the dominator successors. */
3324 for (j = 0; VEC_iterate (basic_block, dom, j, bb_iter); j++)
3325 if (bb_iter == e->dest)
3327 VEC_unordered_remove (basic_block, dom, j);
3331 /* Recursively scan the then or else part. */
3332 if (e->flags & EDGE_TRUE_VALUE)
3333 VEC_safe_push (gimple, heap, *cases, stmt);
3334 else if (e->flags & EDGE_FALSE_VALUE)
3335 VEC_safe_push (gimple, heap, *cases, NULL);
3339 VEC_safe_push (gimple, heap, *conditions, stmt);
3340 build_scop_conditions_1 (conditions, cases, e->dest, scop);
3341 VEC_pop (gimple, *conditions);
3342 VEC_pop (gimple, *cases);
3349 gimple_stmt_iterator gsi_search_gimple_label;
3351 for (i = 0; i < gimple_switch_num_labels (stmt); ++i)
3353 basic_block bb_iter;
3355 size_t n_cases = VEC_length (gimple, *conditions);
3356 unsigned n = gimple_switch_num_labels (stmt);
3358 bb_child = label_to_block
3359 (CASE_LABEL (gimple_switch_label (stmt, i)));
3361 /* Do not handle multiple values for the same block. */
3362 for (k = 0; k < n; k++)
3365 (CASE_LABEL (gimple_switch_label (stmt, k))) == bb_child)
3371 /* Switch cases with more than one predecessor are not
3373 if (VEC_length (edge, bb_child->preds) != 1)
3376 /* Recursively scan the corresponding 'case' block. */
3378 for (gsi_search_gimple_label = gsi_start_bb (bb_child);
3379 !gsi_end_p (gsi_search_gimple_label);
3380 gsi_next (&gsi_search_gimple_label))
3382 gimple stmt_gimple_label
3383 = gsi_stmt (gsi_search_gimple_label);
3385 if (gimple_code (stmt_gimple_label) == GIMPLE_LABEL)
3387 tree t = gimple_label_label (stmt_gimple_label);
3389 if (t == gimple_switch_label (stmt, i))
3390 VEC_replace (gimple, *cases, n_cases,
3397 build_scop_conditions_1 (conditions, cases, bb_child, scop);
3399 /* Remove the scanned block from the dominator successors. */
3400 for (j = 0; VEC_iterate (basic_block, dom, j, bb_iter); j++)
3401 if (bb_iter == bb_child)
3403 VEC_unordered_remove (basic_block, dom, j);
3408 VEC_pop (gimple, *conditions);
3409 VEC_pop (gimple, *cases);
3417 /* Scan all immediate dominated successors. */
3418 for (i = 0; VEC_iterate (basic_block, dom, i, bb_child); i++)
3419 build_scop_conditions_1 (conditions, cases, bb_child, scop);
3421 VEC_free (basic_block, heap, dom);
3424 /* Record all 'if' and 'switch' conditions in each gbb of SCOP. */
3427 build_scop_conditions (scop_p scop)
3429 VEC (gimple, heap) *conditions = NULL;
3430 VEC (gimple, heap) *cases = NULL;
3432 build_scop_conditions_1 (&conditions, &cases, SCOP_ENTRY (scop), scop);
3434 VEC_free (gimple, heap, conditions);
3435 VEC_free (gimple, heap, cases);
3438 /* Build the current domain matrix: the loops belonging to the current
3439 SCOP, and that vary for the execution of the current basic block.
3440 Returns false if there is no loop in SCOP. */
3443 build_scop_iteration_domain (scop_p scop)
3446 CloogMatrix *outer_cstr;
3449 /* Build cloog loop for all loops, that are in the uppermost loop layer of
3451 for (i = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), i, loop); i++)
3452 if (!loop_in_scop_p (loop_outer (loop), scop))
3454 /* The outermost constraints is a matrix that has:
3455 -first column: eq/ineq boolean
3456 -last column: a constant
3457 -scop_nb_params columns for the parameters used in the scop. */
3458 outer_cstr = cloog_matrix_alloc (0, scop_nb_params (scop) + 2);
3459 build_loop_iteration_domains (scop, loop, outer_cstr, 0);
3460 cloog_matrix_free (outer_cstr);
3466 /* Initializes an equation CY of the access matrix using the
3467 information for a subscript from AF, relatively to the loop
3468 indexes from LOOP_NEST and parameter indexes from PARAMS. NDIM is
3469 the dimension of the array access, i.e. the number of
3470 subscripts. Returns true when the operation succeeds. */
3473 build_access_matrix_with_af (tree af, lambda_vector cy,
3474 scop_p scop, int ndim)
3478 switch (TREE_CODE (af))
3480 case POLYNOMIAL_CHREC:
3482 struct loop *outer_loop;
3483 tree left = CHREC_LEFT (af);
3484 tree right = CHREC_RIGHT (af);
3487 if (TREE_CODE (right) != INTEGER_CST)
3490 outer_loop = get_loop (CHREC_VARIABLE (af));
3491 var = nb_loops_around_loop_in_scop (outer_loop, scop);
3492 cy[var] = int_cst_value (right);
3494 switch (TREE_CODE (left))
3496 case POLYNOMIAL_CHREC:
3497 return build_access_matrix_with_af (left, cy, scop, ndim);
3500 cy[ndim - 1] = int_cst_value (left);
3504 return build_access_matrix_with_af (left, cy, scop, ndim);
3509 build_access_matrix_with_af (TREE_OPERAND (af, 0), cy, scop, ndim);
3510 build_access_matrix_with_af (TREE_OPERAND (af, 1), cy, scop, ndim);
3514 build_access_matrix_with_af (TREE_OPERAND (af, 0), cy, scop, ndim);
3515 build_access_matrix_with_af (TREE_OPERAND (af, 1), cy, scop, ndim);
3519 cy[ndim - 1] = int_cst_value (af);
3523 param_col = param_index (af, scop);
3524 cy [ndim - scop_nb_params (scop) + param_col - 1] = 1;
3528 /* FIXME: access_fn can have parameters. */
3533 /* Initialize the access matrix in the data reference REF with respect
3534 to the loop nesting LOOP_NEST. Return true when the operation
3538 build_access_matrix (data_reference_p ref, graphite_bb_p gb)
3540 int i, ndim = DR_NUM_DIMENSIONS (ref);
3541 struct access_matrix *am = GGC_NEW (struct access_matrix);
3543 AM_MATRIX (am) = VEC_alloc (lambda_vector, heap, ndim);
3544 DR_SCOP (ref) = GBB_SCOP (gb);
3546 for (i = 0; i < ndim; i++)
3548 lambda_vector v = lambda_vector_new (ref_nb_loops (ref));
3549 scop_p scop = GBB_SCOP (gb);
3550 tree af = DR_ACCESS_FN (ref, i);
3552 if (!build_access_matrix_with_af (af, v, scop, ref_nb_loops (ref)))
3555 VEC_safe_push (lambda_vector, heap, AM_MATRIX (am), v);
3558 DR_ACCESS_MATRIX (ref) = am;
3562 /* Build the access matrices for the data references in the SCOP. */
3565 build_scop_data_accesses (scop_p scop)
3570 /* FIXME: Construction of access matrix is disabled until some
3571 pass, like the data dependence analysis, is using it. */
3574 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
3577 data_reference_p dr;
3579 /* Construct the access matrix for each data ref, with respect to
3580 the loop nest of the current BB in the considered SCOP. */
3582 VEC_iterate (data_reference_p, GBB_DATA_REFS (gb), j, dr);
3585 bool res = build_access_matrix (dr, gb);
3587 /* FIXME: At this point the DRs should always have an affine
3588 form. For the moment this fails as build_access_matrix
3589 does not build matrices with parameters. */
3595 /* Returns the tree variable from the name NAME that was given in
3596 Cloog representation. All the parameters are stored in PARAMS, and
3597 all the loop induction variables are stored in IVSTACK.
3599 FIXME: This is a hack, and Cloog should be fixed to not work with
3600 variable names represented as "char *string", but with void
3601 pointers that could be casted back to a tree. The only problem in
3602 doing that is that Cloog's pretty printer still assumes that
3603 variable names are char *strings. The solution would be to have a
3604 function pointer for pretty-printing that can be redirected to be
3605 print_generic_stmt in our case, or fprintf by default.
3606 ??? Too ugly to live. */
3609 clast_name_to_gcc (const char *name, VEC (name_tree, heap) *params,
3610 loop_iv_stack ivstack)
3617 for (i = 0; VEC_iterate (name_tree, params, i, t); i++)
3618 if (!strcmp (name, t->name))
3621 iv = loop_iv_stack_get_iv_from_name (ivstack, name);
3628 /* Returns the maximal precision type for expressions E1 and E2. */
3631 max_precision_type (tree e1, tree e2)
3633 tree type1 = TREE_TYPE (e1);
3634 tree type2 = TREE_TYPE (e2);
3635 return TYPE_PRECISION (type1) > TYPE_PRECISION (type2) ? type1 : type2;
3638 /* Converts a Cloog AST expression E back to a GCC expression tree
3642 clast_to_gcc_expression (tree type, struct clast_expr *e,
3643 VEC (name_tree, heap) *params,
3644 loop_iv_stack ivstack)
3650 struct clast_term *t = (struct clast_term *) e;
3654 if (value_one_p (t->val))
3656 tree name = clast_name_to_gcc (t->var, params, ivstack);
3657 return fold_convert (type, name);
3660 else if (value_mone_p (t->val))
3662 tree name = clast_name_to_gcc (t->var, params, ivstack);
3663 name = fold_convert (type, name);
3664 return fold_build1 (NEGATE_EXPR, type, name);
3668 tree name = clast_name_to_gcc (t->var, params, ivstack);
3669 tree cst = gmp_cst_to_tree (type, t->val);
3670 name = fold_convert (type, name);
3671 return fold_build2 (MULT_EXPR, type, cst, name);
3675 return gmp_cst_to_tree (type, t->val);
3680 struct clast_reduction *r = (struct clast_reduction *) e;
3686 return clast_to_gcc_expression (type, r->elts[0], params, ivstack);
3690 tree tl = clast_to_gcc_expression (type, r->elts[0], params, ivstack);
3691 tree tr = clast_to_gcc_expression (type, r->elts[1], params, ivstack);
3693 gcc_assert (r->n >= 1
3694 && r->elts[0]->type == expr_term
3695 && r->elts[1]->type == expr_term);
3697 return fold_build2 (PLUS_EXPR, type, tl, tr);
3704 return clast_to_gcc_expression (type, r->elts[0], params, ivstack);
3708 tree tl = clast_to_gcc_expression (type, r->elts[0], params, ivstack);
3709 tree tr = clast_to_gcc_expression (type, r->elts[1], params, ivstack);
3710 return fold_build2 (MIN_EXPR, type, tl, tr);
3720 return clast_to_gcc_expression (type, r->elts[0], params, ivstack);
3724 tree tl = clast_to_gcc_expression (type, r->elts[0], params, ivstack);
3725 tree tr = clast_to_gcc_expression (type, r->elts[1], params, ivstack);
3726 return fold_build2 (MAX_EXPR, type, tl, tr);
3742 struct clast_binary *b = (struct clast_binary *) e;
3743 struct clast_expr *lhs = (struct clast_expr *) b->LHS;
3744 tree tl = clast_to_gcc_expression (type, lhs, params, ivstack);
3745 tree tr = gmp_cst_to_tree (type, b->RHS);
3749 case clast_bin_fdiv:
3750 return fold_build2 (FLOOR_DIV_EXPR, type, tl, tr);
3752 case clast_bin_cdiv:
3753 return fold_build2 (CEIL_DIV_EXPR, type, tl, tr);
3756 return fold_build2 (EXACT_DIV_EXPR, type, tl, tr);
3759 return fold_build2 (TRUNC_MOD_EXPR, type, tl, tr);
3773 /* Returns the type for the expression E. */
3776 gcc_type_for_clast_expr (struct clast_expr *e,
3777 VEC (name_tree, heap) *params,
3778 loop_iv_stack ivstack)
3784 struct clast_term *t = (struct clast_term *) e;
3787 return TREE_TYPE (clast_name_to_gcc (t->var, params, ivstack));
3794 struct clast_reduction *r = (struct clast_reduction *) e;
3797 return gcc_type_for_clast_expr (r->elts[0], params, ivstack);
3801 for (i = 0; i < r->n; i++)
3803 tree type = gcc_type_for_clast_expr (r->elts[i], params, ivstack);
3813 struct clast_binary *b = (struct clast_binary *) e;
3814 struct clast_expr *lhs = (struct clast_expr *) b->LHS;
3815 return gcc_type_for_clast_expr (lhs, params, ivstack);
3825 /* Returns the type for the equation CLEQ. */
3828 gcc_type_for_clast_eq (struct clast_equation *cleq,
3829 VEC (name_tree, heap) *params,
3830 loop_iv_stack ivstack)
3832 tree type = gcc_type_for_clast_expr (cleq->LHS, params, ivstack);
3836 return gcc_type_for_clast_expr (cleq->RHS, params, ivstack);
3839 /* Translates a clast equation CLEQ to a tree. */
3842 graphite_translate_clast_equation (scop_p scop,
3843 struct clast_equation *cleq,
3844 loop_iv_stack ivstack)
3846 enum tree_code comp;
3847 tree type = gcc_type_for_clast_eq (cleq, SCOP_PARAMS (scop), ivstack);
3848 tree lhs = clast_to_gcc_expression (type, cleq->LHS, SCOP_PARAMS (scop), ivstack);
3849 tree rhs = clast_to_gcc_expression (type, cleq->RHS, SCOP_PARAMS (scop), ivstack);
3851 if (cleq->sign == 0)
3854 else if (cleq->sign > 0)
3860 return fold_build2 (comp, type, lhs, rhs);
3863 /* Creates the test for the condition in STMT. */
3866 graphite_create_guard_cond_expr (scop_p scop, struct clast_guard *stmt,
3867 loop_iv_stack ivstack)
3872 for (i = 0; i < stmt->n; i++)
3874 tree eq = graphite_translate_clast_equation (scop, &stmt->eq[i], ivstack);
3877 cond = fold_build2 (TRUTH_AND_EXPR, TREE_TYPE (eq), cond, eq);
3885 /* Creates a new if region corresponding to Cloog's guard. */
3888 graphite_create_new_guard (scop_p scop, edge entry_edge,
3889 struct clast_guard *stmt,
3890 loop_iv_stack ivstack)
3892 tree cond_expr = graphite_create_guard_cond_expr (scop, stmt, ivstack);
3893 edge exit_edge = create_empty_if_region_on_edge (entry_edge, cond_expr);
3897 /* Walks a CLAST and returns the first statement in the body of a
3900 static struct clast_user_stmt *
3901 clast_get_body_of_loop (struct clast_stmt *stmt)
3904 || CLAST_STMT_IS_A (stmt, stmt_user))
3905 return (struct clast_user_stmt *) stmt;
3907 if (CLAST_STMT_IS_A (stmt, stmt_for))
3908 return clast_get_body_of_loop (((struct clast_for *) stmt)->body);
3910 if (CLAST_STMT_IS_A (stmt, stmt_guard))
3911 return clast_get_body_of_loop (((struct clast_guard *) stmt)->then);
3913 if (CLAST_STMT_IS_A (stmt, stmt_block))
3914 return clast_get_body_of_loop (((struct clast_block *) stmt)->body);
3919 /* Returns the induction variable for the loop that gets translated to
3923 gcc_type_for_iv_of_clast_loop (struct clast_for *stmt_for)
3925 struct clast_user_stmt *stmt = clast_get_body_of_loop ((struct clast_stmt *) stmt_for);
3926 const char *cloog_iv = stmt_for->iterator;
3927 CloogStatement *cs = stmt->statement;
3928 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
3930 return gcc_type_for_cloog_iv (cloog_iv, gbb);
3933 /* Creates a new LOOP corresponding to Cloog's STMT. Inserts an induction
3934 variable for the new LOOP. New LOOP is attached to CFG starting at
3935 ENTRY_EDGE. LOOP is inserted into the loop tree and becomes the child
3936 loop of the OUTER_LOOP. */
3938 static struct loop *
3939 graphite_create_new_loop (scop_p scop, edge entry_edge,
3940 struct clast_for *stmt, loop_iv_stack ivstack,
3943 tree type = gcc_type_for_iv_of_clast_loop (stmt);
3944 VEC (name_tree, heap) *params = SCOP_PARAMS (scop);
3945 tree lb = clast_to_gcc_expression (type, stmt->LB, params, ivstack);
3946 tree ub = clast_to_gcc_expression (type, stmt->UB, params, ivstack);
3947 tree stride = gmp_cst_to_tree (type, stmt->stride);
3948 tree ivvar = create_tmp_var (type, "graphiteIV");
3950 loop_p loop = create_empty_loop_on_edge
3951 (entry_edge, lb, stride, ub, ivvar, &iv_before,
3952 outer ? outer : entry_edge->src->loop_father);
3954 add_referenced_var (ivvar);
3955 loop_iv_stack_push_iv (ivstack, iv_before, stmt->iterator);
3959 /* Rename the SSA_NAMEs used in STMT and that appear in IVSTACK. */
3962 rename_variables_in_stmt (gimple stmt, htab_t map)
3965 use_operand_p use_p;
3967 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
3969 tree use = USE_FROM_PTR (use_p);
3970 tree new_name = get_new_name_from_old_name (map, use);
3972 replace_exp (use_p, new_name);
3978 /* Returns true if SSA_NAME is a parameter of SCOP. */
3981 is_parameter (scop_p scop, tree ssa_name)
3984 VEC (name_tree, heap) *params = SCOP_PARAMS (scop);
3987 for (i = 0; VEC_iterate (name_tree, params, i, param); i++)
3988 if (param->t == ssa_name)
3994 /* Returns true if NAME is an induction variable. */
3999 return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
4002 static void expand_scalar_variables_stmt (gimple, basic_block, scop_p,
4005 /* Constructs a tree which only contains old_ivs and parameters. Any
4006 other variables that are defined outside BB will be eliminated by
4007 using their definitions in the constructed tree. OLD_LOOP_FATHER
4008 is the original loop that contained BB. */
4011 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
4012 tree op1, basic_block bb, scop_p scop,
4013 loop_p old_loop_father, htab_t map)
4015 if ((TREE_CODE_CLASS (code) == tcc_constant
4016 && code == INTEGER_CST)
4017 || TREE_CODE_CLASS (code) == tcc_reference)
4020 if (TREE_CODE_CLASS (code) == tcc_unary)
4022 tree op0_type = TREE_TYPE (op0);
4023 enum tree_code op0_code = TREE_CODE (op0);
4025 expand_scalar_variables_expr (op0_type, op0, op0_code,
4026 NULL, bb, scop, old_loop_father, map);
4028 return fold_build1 (code, type, op0_expr);
4031 if (TREE_CODE_CLASS (code) == tcc_binary)
4033 tree op0_type = TREE_TYPE (op0);
4034 enum tree_code op0_code = TREE_CODE (op0);
4036 expand_scalar_variables_expr (op0_type, op0, op0_code,
4037 NULL, bb, scop, old_loop_father, map);
4038 tree op1_type = TREE_TYPE (op1);
4039 enum tree_code op1_code = TREE_CODE (op1);
4041 expand_scalar_variables_expr (op1_type, op1, op1_code,
4042 NULL, bb, scop, old_loop_father, map);
4044 return fold_build2 (code, type, op0_expr, op1_expr);
4047 if (code == SSA_NAME)
4051 enum tree_code subcode;
4053 if (is_parameter (scop, op0)
4055 return get_new_name_from_old_name (map, op0);
4057 def_stmt = SSA_NAME_DEF_STMT (op0);
4059 if (gimple_bb (def_stmt) == bb)
4061 /* If the defining statement is in the basic block already
4062 we do not need to create a new expression for it, we
4063 only need to ensure its operands are expanded. */
4064 expand_scalar_variables_stmt (def_stmt, bb, scop,
4065 old_loop_father, map);
4066 return get_new_name_from_old_name (map, op0);
4071 if (gimple_code (def_stmt) != GIMPLE_ASSIGN
4072 || !bb_in_scop_p (gimple_bb (def_stmt), scop))
4073 return get_new_name_from_old_name (map, op0);
4075 var0 = gimple_assign_rhs1 (def_stmt);
4076 subcode = gimple_assign_rhs_code (def_stmt);
4077 var1 = gimple_assign_rhs2 (def_stmt);
4079 return expand_scalar_variables_expr (type, var0, subcode, var1,
4080 bb, scop, old_loop_father, map);
4088 /* Replicates any uses of non-parameters and non-old-ivs variablesthat
4089 are defind outside BB with code that is inserted in BB.
4090 OLD_LOOP_FATHER is the original loop that contained STMT. */
4093 expand_scalar_variables_stmt (gimple stmt, basic_block bb, scop_p scop,
4094 loop_p old_loop_father, htab_t map)
4097 use_operand_p use_p;
4099 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
4101 tree use = USE_FROM_PTR (use_p);
4102 tree type = TREE_TYPE (use);
4103 enum tree_code code = TREE_CODE (use);
4104 tree use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
4105 scop, old_loop_father, map);
4106 if (use_expr != use)
4108 gimple_stmt_iterator gsi = gsi_after_labels (bb);
4110 force_gimple_operand_gsi (&gsi, use_expr, true, NULL,
4111 true, GSI_NEW_STMT);
4112 replace_exp (use_p, new_use);
4119 /* Copies the definitions outside of BB of variables that are not
4120 induction variables nor parameters. BB must only contain
4121 "external" references to these types of variables. OLD_LOOP_FATHER
4122 is the original loop that contained BB. */
4125 expand_scalar_variables (basic_block bb, scop_p scop,
4126 loop_p old_loop_father, htab_t map)
4128 gimple_stmt_iterator gsi;
4130 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
4132 gimple stmt = gsi_stmt (gsi);
4133 expand_scalar_variables_stmt (stmt, bb, scop, old_loop_father, map);
4138 /* Rename all the SSA_NAMEs from block BB according to the MAP. */
4141 rename_variables (basic_block bb, htab_t map)
4143 gimple_stmt_iterator gsi;
4145 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4146 rename_variables_in_stmt (gsi_stmt (gsi), map);
4149 /* Remove condition from BB. */
4152 remove_condition (basic_block bb)
4154 gimple last = last_stmt (bb);
4156 if (last && gimple_code (last) == GIMPLE_COND)
4158 gimple_stmt_iterator gsi = gsi_last_bb (bb);
4159 gsi_remove (&gsi, true);
4163 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
4166 get_true_edge_from_guard_bb (basic_block bb)
4171 FOR_EACH_EDGE (e, ei, bb->succs)
4172 if (e->flags & EDGE_TRUE_VALUE)
4179 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */
4182 get_false_edge_from_guard_bb (basic_block bb)
4187 FOR_EACH_EDGE (e, ei, bb->succs)
4188 if (!(e->flags & EDGE_TRUE_VALUE))
4195 /* Inserts in MAP a tuple (OLD_NAME, NEW_NAME) for the induction
4196 variables of the loops around GBB in SCOP, i.e. GBB_LOOPS.
4197 NEW_NAME is obtained from IVSTACK. IVSTACK has the same stack
4198 ordering as GBB_LOOPS. */
4201 build_iv_mapping (loop_iv_stack ivstack, htab_t map, gbb_p gbb, scop_p scop)
4207 for (i = 0; VEC_iterate (name_tree, SCOP_OLDIVS (scop), i, iv); i++)
4209 struct rename_map_elt tmp;
4211 if (!flow_bb_inside_loop_p (iv->loop, GBB_BB (gbb)))
4214 tmp.old_name = iv->t;
4215 slot = htab_find_slot (map, &tmp, INSERT);
4219 tree new_name = loop_iv_stack_get_iv (ivstack,
4220 gbb_loop_index (gbb, iv->loop));
4221 *slot = new_rename_map_elt (iv->t, new_name);
4226 /* Register in MAP the tuple (old_name, new_name). */
4229 register_old_and_new_names (htab_t map, tree old_name, tree new_name)
4231 struct rename_map_elt tmp;
4234 tmp.old_name = old_name;
4235 slot = htab_find_slot (map, &tmp, INSERT);
4238 *slot = new_rename_map_elt (old_name, new_name);
4241 /* Create a duplicate of the basic block BB. NOTE: This does not
4242 preserve SSA form. */
4245 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
4247 gimple_stmt_iterator gsi, gsi_tgt;
4249 gsi_tgt = gsi_start_bb (new_bb);
4250 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4252 def_operand_p def_p;
4253 ssa_op_iter op_iter;
4255 gimple stmt = gsi_stmt (gsi);
4258 if (gimple_code (stmt) == GIMPLE_LABEL)
4261 /* Create a new copy of STMT and duplicate STMT's virtual
4263 copy = gimple_copy (stmt);
4264 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
4265 mark_symbols_for_renaming (copy);
4267 region = lookup_stmt_eh_region (stmt);
4269 add_stmt_to_eh_region (copy, region);
4270 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
4272 /* Create new names for all the definitions created by COPY and
4273 add replacement mappings for each new name. */
4274 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_DEF)
4276 tree old_name = DEF_FROM_PTR (def_p);
4277 tree new_name = create_new_def_for (old_name, copy, def_p);
4278 register_old_and_new_names (map, old_name, new_name);
4283 /* Records in SCOP_LIVEOUT_RENAMES the names that are live out of
4284 the SCOP and that appear in the RENAME_MAP. */
4287 register_scop_liveout_renames (scop_p scop, htab_t rename_map)
4290 sese region = SCOP_REGION (scop);
4292 for (i = 0; i < SESE_NUM_VER (region); i++)
4293 if (bitmap_bit_p (SESE_LIVEOUT (region), i)
4294 && is_gimple_reg (ssa_name (i)))
4296 tree old_name = ssa_name (i);
4297 tree new_name = get_new_name_from_old_name (rename_map, old_name);
4299 register_old_and_new_names (SCOP_LIVEOUT_RENAMES (scop),
4300 old_name, new_name);
4304 /* Copies BB and includes in the copied BB all the statements that can
4305 be reached following the use-def chains from the memory accesses,
4306 and returns the next edge following this new block. */
4309 copy_bb_and_scalar_dependences (basic_block bb, scop_p scop,
4310 loop_p context_loop,
4311 edge next_e, htab_t map)
4313 basic_block new_bb = split_edge (next_e);
4315 next_e = single_succ_edge (new_bb);
4316 graphite_copy_stmts_from_block (bb, new_bb, map);
4317 remove_condition (new_bb);
4318 rename_variables (new_bb, map);
4319 remove_phi_nodes (new_bb);
4320 expand_scalar_variables (new_bb, scop, context_loop, map);
4321 register_scop_liveout_renames (scop, map);
4326 /* Helper function for htab_traverse in insert_loop_close_phis. */
4329 add_loop_exit_phis (void **slot, void *s)
4331 struct rename_map_elt *entry = (struct rename_map_elt *) *slot;
4332 tree new_name = entry->new_name;
4333 basic_block bb = (basic_block) s;
4334 gimple phi = create_phi_node (new_name, bb);
4335 tree res = create_new_def_for (gimple_phi_result (phi), phi,
4336 gimple_phi_result_ptr (phi));
4338 add_phi_arg (phi, new_name, single_pred_edge (bb));
4340 entry->new_name = res;
4345 /* Iterate over the SCOP_LIVEOUT_RENAMES (SCOP) and get tuples of the
4346 form (OLD_NAME, NEW_NAME). Insert in BB "RES = phi (NEW_NAME)",
4347 and finally register in SCOP_LIVEOUT_RENAMES (scop) the tuple
4351 insert_loop_close_phis (scop_p scop, basic_block bb)
4353 update_ssa (TODO_update_ssa);
4354 htab_traverse (SCOP_LIVEOUT_RENAMES (scop), add_loop_exit_phis, bb);
4355 update_ssa (TODO_update_ssa);
4358 /* Helper structure for htab_traverse in insert_guard_phis. */
4362 edge true_edge, false_edge;
4363 htab_t liveout_before_guard;
4366 /* Return the default name that is before the guard. */
4369 default_liveout_before_guard (htab_t liveout_before_guard, tree old_name)
4371 tree res = get_new_name_from_old_name (liveout_before_guard, old_name);
4373 if (res == old_name)
4375 if (is_gimple_reg (res))
4376 return fold_convert (TREE_TYPE (res), integer_zero_node);
4377 return gimple_default_def (cfun, res);
4383 /* Helper function for htab_traverse in insert_guard_phis. */
4386 add_guard_exit_phis (void **slot, void *s)
4388 struct rename_map_elt *entry = (struct rename_map_elt *) *slot;
4389 struct igp *i = (struct igp *) s;
4390 basic_block bb = i->bb;
4391 edge true_edge = i->true_edge;
4392 edge false_edge = i->false_edge;
4393 tree name1 = entry->new_name;
4394 tree name2 = default_liveout_before_guard (i->liveout_before_guard,
4396 gimple phi = create_phi_node (name1, bb);
4397 tree res = create_new_def_for (gimple_phi_result (phi), phi,
4398 gimple_phi_result_ptr (phi));
4400 add_phi_arg (phi, name1, true_edge);
4401 add_phi_arg (phi, name2, false_edge);
4403 entry->new_name = res;
4408 /* Iterate over the SCOP_LIVEOUT_RENAMES (SCOP) and get tuples of the
4409 form (OLD_NAME, NAME1). If there is a correspondent tuple of
4410 OLD_NAME in LIVEOUT_BEFORE_GUARD, i.e. (OLD_NAME, NAME2) then
4413 | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
4415 if there is no tuple for OLD_NAME in LIVEOUT_BEFORE_GUARD, insert
4417 | RES = phi (NAME1 (on TRUE_EDGE),
4418 | DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
4420 Finally register in SCOP_LIVEOUT_RENAMES (scop) the tuple
4424 insert_guard_phis (scop_p scop, basic_block bb, edge true_edge,
4425 edge false_edge, htab_t liveout_before_guard)
4429 i.true_edge = true_edge;
4430 i.false_edge = false_edge;
4431 i.liveout_before_guard = liveout_before_guard;
4433 update_ssa (TODO_update_ssa);
4434 htab_traverse (SCOP_LIVEOUT_RENAMES (scop), add_guard_exit_phis, &i);
4435 update_ssa (TODO_update_ssa);
4438 /* Helper function for htab_traverse. */
4441 copy_renames (void **slot, void *s)
4443 struct rename_map_elt *entry = (struct rename_map_elt *) *slot;
4444 htab_t res = (htab_t) s;
4445 tree old_name = entry->old_name;
4446 tree new_name = entry->new_name;
4447 struct rename_map_elt tmp;
4450 tmp.old_name = old_name;
4451 x = htab_find_slot (res, &tmp, INSERT);
4454 *x = new_rename_map_elt (old_name, new_name);
4459 /* Translates a CLAST statement STMT to GCC representation in the
4462 - NEXT_E is the edge where new generated code should be attached.
4463 - CONTEXT_LOOP is the loop in which the generated code will be placed
4465 - IVSTACK contains the surrounding loops around the statement to be
4470 translate_clast (scop_p scop, struct loop *context_loop,
4471 struct clast_stmt *stmt, edge next_e, loop_iv_stack ivstack)
4476 if (CLAST_STMT_IS_A (stmt, stmt_root))
4477 return translate_clast (scop, context_loop, stmt->next, next_e, ivstack);
4479 if (CLAST_STMT_IS_A (stmt, stmt_user))
4482 CloogStatement *cs = ((struct clast_user_stmt *) stmt)->statement;
4483 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
4485 if (GBB_BB (gbb) == ENTRY_BLOCK_PTR)
4488 map = htab_create (10, rename_map_elt_info, eq_rename_map_elts, free);
4489 loop_iv_stack_patch_for_consts (ivstack, (struct clast_user_stmt *) stmt);
4490 build_iv_mapping (ivstack, map, gbb, scop);
4491 next_e = copy_bb_and_scalar_dependences (GBB_BB (gbb), scop,
4492 context_loop, next_e, map);
4494 loop_iv_stack_remove_constants (ivstack);
4495 update_ssa (TODO_update_ssa);
4496 recompute_all_dominators ();
4498 return translate_clast (scop, context_loop, stmt->next, next_e, ivstack);
4501 if (CLAST_STMT_IS_A (stmt, stmt_for))
4504 = graphite_create_new_loop (scop, next_e, (struct clast_for *) stmt,
4505 ivstack, context_loop ? context_loop
4507 edge last_e = single_exit (loop);
4509 next_e = translate_clast (scop, loop, ((struct clast_for *) stmt)->body,
4510 single_pred_edge (loop->latch), ivstack);
4511 redirect_edge_succ_nodup (next_e, loop->latch);
4513 set_immediate_dominator (CDI_DOMINATORS, next_e->dest, next_e->src);
4514 loop_iv_stack_pop (ivstack);
4515 last_e = single_succ_edge (split_edge (last_e));
4516 insert_loop_close_phis (scop, last_e->src);
4518 recompute_all_dominators ();
4520 return translate_clast (scop, context_loop, stmt->next, last_e, ivstack);
4523 if (CLAST_STMT_IS_A (stmt, stmt_guard))
4525 htab_t liveout_before_guard = htab_create (10, rename_map_elt_info,
4526 eq_rename_map_elts, free);
4527 edge last_e = graphite_create_new_guard (scop, next_e,
4528 ((struct clast_guard *) stmt),
4530 edge true_e = get_true_edge_from_guard_bb (next_e->dest);
4531 edge false_e = get_false_edge_from_guard_bb (next_e->dest);
4532 edge exit_true_e = single_succ_edge (true_e->dest);
4533 edge exit_false_e = single_succ_edge (false_e->dest);
4535 htab_traverse (SCOP_LIVEOUT_RENAMES (scop), copy_renames,
4536 liveout_before_guard);
4538 next_e = translate_clast (scop, context_loop,
4539 ((struct clast_guard *) stmt)->then,
4541 insert_guard_phis (scop, last_e->src, exit_true_e, exit_false_e,
4542 liveout_before_guard);
4543 htab_delete (liveout_before_guard);
4544 recompute_all_dominators ();
4547 return translate_clast (scop, context_loop, stmt->next, last_e, ivstack);
4550 if (CLAST_STMT_IS_A (stmt, stmt_block))
4552 next_e = translate_clast (scop, context_loop,
4553 ((struct clast_block *) stmt)->body,
4555 recompute_all_dominators ();
4557 return translate_clast (scop, context_loop, stmt->next, next_e, ivstack);
4563 /* Free the SCATTERING domain list. */
4566 free_scattering (CloogDomainList *scattering)
4570 CloogDomain *dom = cloog_domain (scattering);
4571 CloogDomainList *next = cloog_next_domain (scattering);
4573 cloog_domain_free (dom);
4579 /* Build cloog program for SCoP. */
4582 build_cloog_prog (scop_p scop)
4585 int max_nb_loops = scop_max_loop_depth (scop);
4587 CloogLoop *loop_list = NULL;
4588 CloogBlockList *block_list = NULL;
4589 CloogDomainList *scattering = NULL;
4590 CloogProgram *prog = SCOP_PROG (scop);
4591 int nbs = 2 * max_nb_loops + 1;
4592 int *scaldims = (int *) xmalloc (nbs * (sizeof (int)));
4594 cloog_program_set_nb_scattdims (prog, nbs);
4595 initialize_cloog_names (scop);
4597 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gbb); i++)
4599 /* Build new block. */
4600 CloogMatrix *domain = GBB_DOMAIN (gbb);
4601 CloogStatement *stmt = cloog_statement_alloc (GBB_BB (gbb)->index);
4602 CloogBlock *block = cloog_block_alloc (stmt, 0, NULL,
4603 nb_loops_around_gb (gbb));
4604 cloog_statement_set_usr (stmt, gbb);
4606 /* Add empty domain to all bbs, which do not yet have a domain, as they
4607 are not part of any loop. */
4610 domain = cloog_matrix_alloc (0, scop_nb_params (scop) + 2);
4611 GBB_DOMAIN (gbb) = domain;
4614 /* Build loop list. */
4616 CloogLoop *new_loop_list = cloog_loop_malloc ();
4617 cloog_loop_set_next (new_loop_list, loop_list);
4618 cloog_loop_set_domain (new_loop_list,
4619 cloog_domain_matrix2domain (domain));
4620 cloog_loop_set_block (new_loop_list, block);
4621 loop_list = new_loop_list;
4624 /* Build block list. */
4626 CloogBlockList *new_block_list = cloog_block_list_malloc ();
4628 cloog_block_list_set_next (new_block_list, block_list);
4629 cloog_block_list_set_block (new_block_list, block);
4630 block_list = new_block_list;
4633 /* Build scattering list. */
4635 /* XXX: Replace with cloog_domain_list_alloc(), when available. */
4636 CloogDomainList *new_scattering
4637 = (CloogDomainList *) xmalloc (sizeof (CloogDomainList));
4638 CloogMatrix *scat_mat = schedule_to_scattering (gbb, nbs);
4640 cloog_set_next_domain (new_scattering, scattering);
4641 cloog_set_domain (new_scattering,
4642 cloog_domain_matrix2domain (scat_mat));
4643 scattering = new_scattering;
4644 cloog_matrix_free (scat_mat);
4648 cloog_program_set_loop (prog, loop_list);
4649 cloog_program_set_blocklist (prog, block_list);
4651 for (i = 0; i < nbs; i++)
4654 cloog_program_set_scaldims (prog, scaldims);
4656 /* Extract scalar dimensions to simplify the code generation problem. */
4657 cloog_program_extract_scalars (prog, scattering);
4659 /* Apply scattering. */
4660 cloog_program_scatter (prog, scattering);
4661 free_scattering (scattering);
4663 /* Iterators corresponding to scalar dimensions have to be extracted. */
4664 cloog_names_scalarize (cloog_program_names (prog), nbs,
4665 cloog_program_scaldims (prog));
4667 /* Free blocklist. */
4669 CloogBlockList *next = cloog_program_blocklist (prog);
4673 CloogBlockList *toDelete = next;
4674 next = cloog_block_list_next (next);
4675 cloog_block_list_set_next (toDelete, NULL);
4676 cloog_block_list_set_block (toDelete, NULL);
4677 cloog_block_list_free (toDelete);
4679 cloog_program_set_blocklist (prog, NULL);
4683 /* Return the options that will be used in GLOOG. */
4685 static CloogOptions *
4686 set_cloog_options (void)
4688 CloogOptions *options = cloog_options_malloc ();
4690 /* Change cloog output language to C. If we do use FORTRAN instead, cloog
4691 will stop e.g. with "ERROR: unbounded loops not allowed in FORTRAN.", if
4692 we pass an incomplete program to cloog. */
4693 options->language = LANGUAGE_C;
4695 /* Enable complex equality spreading: removes dummy statements
4696 (assignments) in the generated code which repeats the
4697 substitution equations for statements. This is useless for
4701 /* Enable C pretty-printing mode: normalizes the substitution
4702 equations for statements. */
4705 /* Allow cloog to build strides with a stride width different to one.
4706 This example has stride = 4:
4708 for (i = 0; i < 20; i += 4)
4710 options->strides = 1;
4712 /* Disable optimizations and make cloog generate source code closer to the
4713 input. This is useful for debugging, but later we want the optimized
4716 XXX: We can not disable optimizations, as loop blocking is not working
4721 options->l = INT_MAX;
4727 /* Prints STMT to STDERR. */
4730 debug_clast_stmt (struct clast_stmt *stmt)
4732 CloogOptions *options = set_cloog_options ();
4734 pprint (stderr, stmt, 0, options);
4737 /* Find the right transform for the SCOP, and return a Cloog AST
4738 representing the new form of the program. */
4740 static struct clast_stmt *
4741 find_transform (scop_p scop)
4743 struct clast_stmt *stmt;
4744 CloogOptions *options = set_cloog_options ();
4746 /* Connect new cloog prog generation to graphite. */
4747 build_cloog_prog (scop);
4749 if (dump_file && (dump_flags & TDF_DETAILS))
4751 fprintf (dump_file, "Cloog Input [\n");
4752 cloog_program_print (dump_file, SCOP_PROG(scop));
4753 fprintf (dump_file, "]\n");
4756 SCOP_PROG (scop) = cloog_program_generate (SCOP_PROG (scop), options);
4757 stmt = cloog_clast_create (SCOP_PROG (scop), options);
4759 if (dump_file && (dump_flags & TDF_DETAILS))
4761 fprintf (dump_file, "Cloog Output[\n");
4762 pprint (dump_file, stmt, 0, options);
4763 cloog_program_dump_cloog (dump_file, SCOP_PROG (scop));
4764 fprintf (dump_file, "]\n");
4767 cloog_options_free (options);
4771 /* Returns true when it is possible to generate code for this STMT.
4772 For the moment we cannot generate code when Cloog decides to
4773 duplicate a statement, as we do not do a copy, but a move.
4774 USED_BASIC_BLOCKS records the blocks that have already been seen.
4775 We return false if we have to generate code twice for the same
4779 can_generate_code_stmt (struct clast_stmt *stmt,
4780 struct pointer_set_t *used_basic_blocks)
4785 if (CLAST_STMT_IS_A (stmt, stmt_root))
4786 return can_generate_code_stmt (stmt->next, used_basic_blocks);
4788 if (CLAST_STMT_IS_A (stmt, stmt_user))
4790 CloogStatement *cs = ((struct clast_user_stmt *) stmt)->statement;
4791 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
4793 if (pointer_set_contains (used_basic_blocks, gbb))
4795 pointer_set_insert (used_basic_blocks, gbb);
4796 return can_generate_code_stmt (stmt->next, used_basic_blocks);
4799 if (CLAST_STMT_IS_A (stmt, stmt_for))
4800 return can_generate_code_stmt (((struct clast_for *) stmt)->body,
4802 && can_generate_code_stmt (stmt->next, used_basic_blocks);
4804 if (CLAST_STMT_IS_A (stmt, stmt_guard))
4805 return can_generate_code_stmt (((struct clast_guard *) stmt)->then,
4808 if (CLAST_STMT_IS_A (stmt, stmt_block))
4809 return can_generate_code_stmt (((struct clast_block *) stmt)->body,
4811 && can_generate_code_stmt (stmt->next, used_basic_blocks);
4816 /* Returns true when it is possible to generate code for this STMT. */
4819 can_generate_code (struct clast_stmt *stmt)
4822 struct pointer_set_t *used_basic_blocks = pointer_set_create ();
4824 result = can_generate_code_stmt (stmt, used_basic_blocks);
4825 pointer_set_destroy (used_basic_blocks);
4829 /* Remove from the CFG the REGION. */
4832 remove_sese_region (sese region)
4834 VEC (basic_block, heap) *bbs = NULL;
4835 basic_block entry_bb = SESE_ENTRY (region)->dest;
4836 basic_block exit_bb = SESE_EXIT (region)->dest;
4840 VEC_safe_push (basic_block, heap, bbs, entry_bb);
4841 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
4843 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
4844 delete_basic_block (bb);
4846 VEC_free (basic_block, heap, bbs);
4849 typedef struct ifsese {
4856 if_region_entry (ifsese if_region)
4858 return SESE_ENTRY (if_region->region);
4862 if_region_exit (ifsese if_region)
4864 return SESE_EXIT (if_region->region);
4867 static inline basic_block
4868 if_region_get_condition_block (ifsese if_region)
4870 return if_region_entry (if_region)->dest;
4874 if_region_set_false_region (ifsese if_region, sese region)
4876 basic_block condition = if_region_get_condition_block (if_region);
4877 edge false_edge = get_false_edge_from_guard_bb (condition);
4878 edge entry_region = SESE_ENTRY (region);
4879 edge exit_region = SESE_EXIT (region);
4880 basic_block before_region = entry_region->src;
4881 basic_block last_in_region = exit_region->src;
4882 void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
4883 htab_hash_pointer (exit_region),
4886 entry_region->flags = false_edge->flags;
4887 false_edge->flags = exit_region->flags;
4889 redirect_edge_pred (entry_region, condition);
4890 redirect_edge_pred (exit_region, before_region);
4891 redirect_edge_pred (false_edge, last_in_region);
4893 exit_region->flags = EDGE_FALLTHRU;
4894 recompute_all_dominators ();
4896 SESE_EXIT (region) = single_succ_edge (false_edge->dest);
4897 if_region->false_region = region;
4901 struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
4903 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
4904 htab_clear_slot (current_loops->exits, slot);
4906 slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
4907 htab_hash_pointer (false_edge),
4909 loop_exit->e = false_edge;
4911 false_edge->src->loop_father->exits->next = loop_exit;
4916 create_if_region_on_edge (edge entry, tree condition)
4920 sese sese_region = GGC_NEW (struct sese);
4921 sese true_region = GGC_NEW (struct sese);
4922 sese false_region = GGC_NEW (struct sese);
4923 ifsese if_region = GGC_NEW (struct ifsese);
4924 edge exit = create_empty_if_region_on_edge (entry, condition);
4926 if_region->region = sese_region;
4927 if_region->region->entry = entry;
4928 if_region->region->exit = exit;
4930 FOR_EACH_EDGE (e, ei, entry->dest->succs)
4932 if (e->flags & EDGE_TRUE_VALUE)
4934 true_region->entry = e;
4935 true_region->exit = single_succ_edge (e->dest);
4936 if_region->true_region = true_region;
4938 else if (e->flags & EDGE_FALSE_VALUE)
4940 false_region->entry = e;
4941 false_region->exit = single_succ_edge (e->dest);
4942 if_region->false_region = false_region;
4949 /* Moves REGION in a condition expression:
4957 move_sese_in_condition (sese region)
4959 basic_block pred_block = split_edge (SESE_ENTRY (region));
4960 ifsese if_region = NULL;
4962 SESE_ENTRY (region) = single_succ_edge (pred_block);
4963 if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
4964 if_region_set_false_region (if_region, region);
4969 /* Add exit phis for USE on EXIT. */
4972 scop_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
4974 gimple phi = create_phi_node (use, exit);
4976 create_new_def_for (gimple_phi_result (phi), phi,
4977 gimple_phi_result_ptr (phi));
4978 add_phi_arg (phi, use, false_e);
4979 add_phi_arg (phi, use, true_e);
4982 /* Add phi nodes for VAR that is used in LIVEIN. Phi nodes are
4983 inserted in block BB. */
4986 scop_add_exit_phis_var (basic_block bb, tree var, bitmap livein,
4987 edge false_e, edge true_e)
4990 basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
4992 if (is_gimple_reg (var))
4993 bitmap_clear_bit (livein, def_bb->index);
4995 bitmap_set_bit (livein, def_bb->index);
4997 def = BITMAP_ALLOC (NULL);
4998 bitmap_set_bit (def, def_bb->index);
4999 compute_global_livein (livein, def);
5002 scop_add_exit_phis_edge (bb, var, false_e, true_e);
5005 /* Insert in the block BB phi nodes for variables defined in REGION
5006 and used outside the REGION. The code generation moves REGION in
5007 the else clause of an "if (1)" and generates code in the then
5008 clause that is at this point empty:
5017 scop_insert_phis_for_liveouts (sese region, basic_block bb,
5018 edge false_e, edge true_e)
5023 update_ssa (TODO_update_ssa);
5025 EXECUTE_IF_SET_IN_BITMAP (SESE_LIVEOUT (region), 0, i, bi)
5026 scop_add_exit_phis_var (bb, ssa_name (i), SESE_LIVEIN_VER (region, i),
5029 update_ssa (TODO_update_ssa);
5032 /* Adjusts the phi nodes in the block BB for variables defined in
5033 SCOP_REGION and used outside the SCOP_REGION. The code generation
5034 moves SCOP_REGION in the else clause of an "if (1)" and generates
5035 code in the then clause:
5038 | generated code from REGION;
5042 To adjust the phi nodes after the condition, SCOP_LIVEOUT_RENAMES
5043 hash table is used: this stores for a name that is part of the
5044 LIVEOUT of SCOP_REGION its new name in the generated code. */
5047 scop_adjust_phis_for_liveouts (scop_p scop, basic_block bb, edge false_e,
5050 gimple_stmt_iterator si;
5052 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
5054 unsigned i, false_i;
5055 gimple phi = gsi_stmt (si);
5057 if (!is_gimple_reg (PHI_RESULT (phi)))
5060 for (i = 0; i < gimple_phi_num_args (phi); i++)
5061 if (gimple_phi_arg_edge (phi, i) == false_e)
5067 for (i = 0; i < gimple_phi_num_args (phi); i++)
5068 if (gimple_phi_arg_edge (phi, i) == true_e)
5070 tree old_name = gimple_phi_arg_def (phi, false_i);
5071 tree new_name = get_new_name_from_old_name
5072 (SCOP_LIVEOUT_RENAMES (scop), old_name);
5074 gcc_assert (old_name != new_name);
5075 SET_PHI_ARG_DEF (phi, i, new_name);
5080 /* Returns the first cloog name used in EXPR. */
5083 find_cloog_iv_in_expr (struct clast_expr *expr)
5085 struct clast_term *term = (struct clast_term *) expr;
5087 if (expr->type == expr_term
5091 if (expr->type == expr_term)
5094 if (expr->type == expr_red)
5097 struct clast_reduction *red = (struct clast_reduction *) expr;
5099 for (i = 0; i < red->n; i++)
5101 const char *res = find_cloog_iv_in_expr ((red)->elts[i]);
5111 /* Build for a clast_user_stmt USER_STMT a map between the CLAST
5112 induction variables and the corresponding GCC old induction
5113 variables. This information is stored on each GRAPHITE_BB. */
5116 compute_cloog_iv_types_1 (graphite_bb_p gbb,
5117 struct clast_user_stmt *user_stmt)
5119 struct clast_stmt *t;
5122 for (t = user_stmt->substitutions; t; t = t->next, index++)
5125 struct ivtype_map_elt tmp;
5126 struct clast_expr *expr = (struct clast_expr *)
5127 ((struct clast_assignment *)t)->RHS;
5129 /* Create an entry (clast_var, type). */
5130 tmp.cloog_iv = find_cloog_iv_in_expr (expr);
5134 slot = htab_find_slot (GBB_CLOOG_IV_TYPES (gbb), &tmp, INSERT);
5138 loop_p loop = gbb_loop_at_index (gbb, index);
5139 tree oldiv = oldiv_for_loop (GBB_SCOP (gbb), loop);
5140 tree type = oldiv ? TREE_TYPE (oldiv) : integer_type_node;
5141 *slot = new_ivtype_map_elt (tmp.cloog_iv, type);
5146 /* Walk the CLAST tree starting from STMT and build for each
5147 clast_user_stmt a map between the CLAST induction variables and the
5148 corresponding GCC old induction variables. This information is
5149 stored on each GRAPHITE_BB. */
5152 compute_cloog_iv_types (struct clast_stmt *stmt)
5157 if (CLAST_STMT_IS_A (stmt, stmt_root))
5160 if (CLAST_STMT_IS_A (stmt, stmt_user))
5162 CloogStatement *cs = ((struct clast_user_stmt *) stmt)->statement;
5163 graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs);
5164 GBB_CLOOG_IV_TYPES (gbb) = htab_create (10, ivtype_map_elt_info,
5165 eq_ivtype_map_elts, free);
5166 compute_cloog_iv_types_1 (gbb, (struct clast_user_stmt *) stmt);
5170 if (CLAST_STMT_IS_A (stmt, stmt_for))
5172 struct clast_stmt *s = ((struct clast_for *) stmt)->body;
5173 compute_cloog_iv_types (s);
5177 if (CLAST_STMT_IS_A (stmt, stmt_guard))
5179 struct clast_stmt *s = ((struct clast_guard *) stmt)->then;
5180 compute_cloog_iv_types (s);
5184 if (CLAST_STMT_IS_A (stmt, stmt_block))
5186 struct clast_stmt *s = ((struct clast_block *) stmt)->body;
5187 compute_cloog_iv_types (s);
5194 compute_cloog_iv_types (stmt->next);
5197 /* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for
5201 gloog (scop_p scop, struct clast_stmt *stmt)
5203 edge new_scop_exit_edge = NULL;
5204 VEC (iv_stack_entry_p, heap) *ivstack = VEC_alloc (iv_stack_entry_p, heap,
5206 loop_p context_loop;
5207 ifsese if_region = NULL;
5209 if (!can_generate_code (stmt))
5211 cloog_clast_free (stmt);
5215 if_region = move_sese_in_condition (SCOP_REGION (scop));
5216 sese_build_livein_liveouts (SCOP_REGION (scop));
5217 scop_insert_phis_for_liveouts (SCOP_REGION (scop),
5218 if_region->region->exit->src,
5219 if_region->false_region->exit,
5220 if_region->true_region->exit);
5221 recompute_all_dominators ();
5223 context_loop = SESE_ENTRY (SCOP_REGION (scop))->src->loop_father;
5224 compute_cloog_iv_types (stmt);
5226 new_scop_exit_edge = translate_clast (scop, context_loop, stmt,
5227 if_region->true_region->entry,
5229 free_loop_iv_stack (&ivstack);
5230 cloog_clast_free (stmt);
5233 scop_adjust_phis_for_liveouts (scop,
5234 if_region->region->exit->src,
5235 if_region->false_region->exit,
5236 if_region->true_region->exit);
5238 recompute_all_dominators ();
5240 cleanup_tree_cfg ();
5241 recompute_all_dominators ();
5245 /* Returns the number of data references in SCOP. */
5248 nb_data_refs_in_scop (scop_p scop)
5254 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gbb); i++)
5255 res += VEC_length (data_reference_p, GBB_DATA_REFS (gbb));
5260 /* Move the loop at index LOOP and insert it before index NEW_LOOP_POS.
5261 This transformartion is only valid, if the loop nest between i and k is
5262 perfectly nested. Therefore we do not need to change the static schedule.
5266 for (i = 0; i < 50; i++)
5268 for (k = 5; k < 100; k++)
5271 To move k before i use:
5273 graphite_trans_bb_move_loop (A, 2, 0)
5275 for (k = 5; k < 100; k++)
5276 for (i = 0; i < 50; i++)
5282 graphite_trans_bb_move_loop (A, 0, 2)
5284 This function does not check the validity of interchanging loops.
5285 This should be checked before calling this function. */
5288 graphite_trans_bb_move_loop (graphite_bb_p gb, int loop,
5291 CloogMatrix *domain = GBB_DOMAIN (gb);
5295 gcc_assert (loop < gbb_nb_loops (gb)
5296 && new_loop_pos < gbb_nb_loops (gb));
5298 /* Update LOOPS vector. */
5299 tmp_loop_p = VEC_index (loop_p, GBB_LOOPS (gb), loop);
5300 VEC_ordered_remove (loop_p, GBB_LOOPS (gb), loop);
5301 VEC_safe_insert (loop_p, heap, GBB_LOOPS (gb), new_loop_pos, tmp_loop_p);
5303 /* Move the domain columns. */
5304 if (loop < new_loop_pos)
5305 for (row = 0; row < domain->NbRows; row++)
5309 value_assign (tmp, domain->p[row][loop + 1]);
5311 for (j = loop ; j < new_loop_pos - 1; j++)
5312 value_assign (domain->p[row][j + 1], domain->p[row][j + 2]);
5314 value_assign (domain->p[row][new_loop_pos], tmp);
5318 for (row = 0; row < domain->NbRows; row++)
5322 value_assign (tmp, domain->p[row][loop + 1]);
5324 for (j = loop ; j > new_loop_pos; j--)
5325 value_assign (domain->p[row][j + 1], domain->p[row][j]);
5327 value_assign (domain->p[row][new_loop_pos + 1], tmp);
5332 /* Get the index of the column representing constants in the DOMAIN
5336 const_column_index (CloogMatrix *domain)
5338 return domain->NbColumns - 1;
5342 /* Get the first index that is positive or negative, determined
5343 following the value of POSITIVE, in matrix DOMAIN in COLUMN. */
5346 get_first_matching_sign_row_index (CloogMatrix *domain, int column,
5351 for (row = 0; row < domain->NbRows; row++)
5353 int val = value_get_si (domain->p[row][column]);
5355 if (val > 0 && positive)
5358 else if (val < 0 && !positive)
5365 /* Get the lower bound of COLUMN in matrix DOMAIN. */
5368 get_lower_bound_row (CloogMatrix *domain, int column)
5370 return get_first_matching_sign_row_index (domain, column, true);
5373 /* Get the upper bound of COLUMN in matrix DOMAIN. */
5376 get_upper_bound_row (CloogMatrix *domain, int column)
5378 return get_first_matching_sign_row_index (domain, column, false);
5381 /* Get the lower bound of LOOP. */
5384 get_lower_bound (CloogMatrix *domain, int loop, Value lower_bound_result)
5386 int lower_bound_row = get_lower_bound_row (domain, loop);
5387 value_assign (lower_bound_result,
5388 domain->p[lower_bound_row][const_column_index(domain)]);
5391 /* Get the upper bound of LOOP. */
5394 get_upper_bound (CloogMatrix *domain, int loop, Value upper_bound_result)
5396 int upper_bound_row = get_upper_bound_row (domain, loop);
5397 value_assign (upper_bound_result,
5398 domain->p[upper_bound_row][const_column_index(domain)]);
5401 /* Strip mines the loop of BB at the position LOOP_DEPTH with STRIDE.
5402 Always valid, but not always a performance improvement. */
5405 graphite_trans_bb_strip_mine (graphite_bb_p gb, int loop_depth, int stride)
5409 CloogMatrix *domain = GBB_DOMAIN (gb);
5410 CloogMatrix *new_domain = cloog_matrix_alloc (domain->NbRows + 3,
5411 domain->NbColumns + 1);
5413 int col_loop_old = loop_depth + 2;
5414 int col_loop_strip = col_loop_old - 1;
5416 Value old_lower_bound;
5417 Value old_upper_bound;
5419 gcc_assert (loop_depth <= gbb_nb_loops (gb) - 1);
5421 VEC_safe_insert (loop_p, heap, GBB_LOOPS (gb), loop_depth, NULL);
5423 GBB_DOMAIN (gb) = new_domain;
5426 nrows = 4, ncols = 4
5435 for (row = 0; row < domain->NbRows; row++)
5436 for (col = 0; col < domain->NbColumns; col++)
5437 if (col <= loop_depth)
5438 value_assign (new_domain->p[row][col], domain->p[row][col]);
5440 value_assign (new_domain->p[row][col + 1], domain->p[row][col]);
5444 nrows = 6, ncols = 5
5456 row = domain->NbRows;
5458 /* Add outer loop. */
5459 value_init (old_lower_bound);
5460 value_init (old_upper_bound);
5461 get_lower_bound (new_domain, col_loop_old, old_lower_bound);
5462 get_upper_bound (new_domain, col_loop_old, old_upper_bound);
5464 /* Set Lower Bound */
5465 value_set_si (new_domain->p[row][0], 1);
5466 value_set_si (new_domain->p[row][col_loop_strip], 1);
5467 value_assign (new_domain->p[row][const_column_index (new_domain)],
5469 value_clear (old_lower_bound);
5479 1 0 0 -1 99 | copy old lower bound
5486 Value new_upper_bound;
5487 Value strip_size_value;
5489 value_init (new_upper_bound);
5490 value_init (strip_size_value);
5491 value_set_si (strip_size_value, (int) stride);
5493 value_pdivision (new_upper_bound, old_upper_bound, strip_size_value);
5494 value_add_int (new_upper_bound, new_upper_bound, 1);
5496 /* Set Upper Bound */
5497 value_set_si (new_domain->p[row][0], 1);
5498 value_set_si (new_domain->p[row][col_loop_strip], -1);
5499 value_assign (new_domain->p[row][const_column_index (new_domain)],
5502 value_clear (strip_size_value);
5503 value_clear (old_upper_bound);
5504 value_clear (new_upper_bound);
5515 1 0 -1 0 25 (divide old upper bound with stride)
5520 row = get_lower_bound_row (new_domain, col_loop_old);
5521 /* Add local variable to keep linear representation. */
5522 value_set_si (new_domain->p[row][0], 1);
5523 value_set_si (new_domain->p[row][const_column_index (new_domain)],0);
5524 value_set_si (new_domain->p[row][col_loop_old], 1);
5525 value_set_si (new_domain->p[row][col_loop_strip], -1*((int)stride));
5536 1 0 -1 0 25 (divide old upper bound with stride)
5541 row = new_domain->NbRows-1;
5543 value_set_si (new_domain->p[row][0], 1);
5544 value_set_si (new_domain->p[row][col_loop_old], -1);
5545 value_set_si (new_domain->p[row][col_loop_strip], stride);
5546 value_set_si (new_domain->p[row][const_column_index (new_domain)],
5555 1 0 -4 1 0 j >= 4*jj
5558 1 0 -1 0 25 25 >= jj
5559 0 0 4 -1 3 jj+3 >= j
5562 cloog_matrix_free (domain);
5564 /* Update static schedule. */
5567 int nb_loops = gbb_nb_loops (gb);
5568 lambda_vector new_schedule = lambda_vector_new (nb_loops + 1);
5570 for (i = 0; i <= loop_depth; i++)
5571 new_schedule[i] = GBB_STATIC_SCHEDULE (gb)[i];
5573 for (i = loop_depth + 1; i <= nb_loops - 2; i++)
5574 new_schedule[i + 2] = GBB_STATIC_SCHEDULE (gb)[i];
5576 GBB_STATIC_SCHEDULE (gb) = new_schedule;
5580 /* Returns true when the strip mining of LOOP_INDEX by STRIDE is
5581 profitable or undecidable. GB is the statement around which the
5582 loops will be strip mined. */
5585 strip_mine_profitable_p (graphite_bb_p gb, int stride,
5594 loop = VEC_index (loop_p, GBB_LOOPS (gb), loop_index);
5595 exit = single_exit (loop);
5597 niter = find_loop_niter (loop, &exit);
5598 if (niter == chrec_dont_know
5599 || TREE_CODE (niter) != INTEGER_CST)
5602 niter_val = int_cst_value (niter);
5604 if (niter_val < stride)
5607 if (dump_file && (dump_flags & TDF_DETAILS))
5609 fprintf (dump_file, "\nStrip Mining is not profitable for loop %d:",
5611 fprintf (dump_file, "number of iterations is too low.\n");
5618 /* Determines when the interchange of LOOP_A and LOOP_B belonging to
5622 is_interchange_valid (scop_p scop, int loop_a, int loop_b)
5625 VEC (ddr_p, heap) *dependence_relations;
5626 VEC (data_reference_p, heap) *datarefs;
5628 struct loop *nest = VEC_index (loop_p, SCOP_LOOP_NEST (scop), loop_a);
5629 int depth = perfect_loop_nest_depth (nest);
5630 lambda_trans_matrix trans;
5632 gcc_assert (loop_a < loop_b);
5634 dependence_relations = VEC_alloc (ddr_p, heap, 10 * 10);
5635 datarefs = VEC_alloc (data_reference_p, heap, 10);
5637 if (!compute_data_dependences_for_loop (nest, true, &datarefs,
5638 &dependence_relations))
5641 if (dump_file && (dump_flags & TDF_DETAILS))
5642 dump_ddrs (dump_file, dependence_relations);
5644 trans = lambda_trans_matrix_new (depth, depth);
5645 lambda_matrix_id (LTM_MATRIX (trans), depth);
5647 lambda_matrix_row_exchange (LTM_MATRIX (trans), 0, loop_b - loop_a);
5649 if (!lambda_transform_legal_p (trans, depth, dependence_relations))
5651 lambda_matrix_row_exchange (LTM_MATRIX (trans), 0, loop_b - loop_a);
5657 free_dependence_relations (dependence_relations);
5658 free_data_refs (datarefs);
5662 /* Loop block the LOOPS innermost loops of GB with stride size STRIDE.
5666 for (i = 0; i <= 50; i++=4)
5667 for (k = 0; k <= 100; k++=4)
5668 for (l = 0; l <= 200; l++=4)
5671 To strip mine the two inner most loops with stride = 4 call:
5673 graphite_trans_bb_block (A, 4, 2)
5675 for (i = 0; i <= 50; i++)
5676 for (kk = 0; kk <= 100; kk+=4)
5677 for (ll = 0; ll <= 200; ll+=4)
5678 for (k = kk; k <= min (100, kk + 3); k++)
5679 for (l = ll; l <= min (200, ll + 3); l++)
5684 graphite_trans_bb_block (graphite_bb_p gb, int stride, int loops)
5687 int nb_loops = gbb_nb_loops (gb);
5688 int start = nb_loops - loops;
5689 scop_p scop = GBB_SCOP (gb);
5691 gcc_assert (scop_contains_loop (scop, gbb_loop (gb)));
5693 for (i = start ; i < nb_loops; i++)
5694 for (j = i + 1; j < nb_loops; j++)
5695 if (!is_interchange_valid (scop, i, j))
5697 if (dump_file && (dump_flags & TDF_DETAILS))
5699 "\nInterchange not valid for loops %d and %d:\n", i, j);
5702 else if (dump_file && (dump_flags & TDF_DETAILS))
5704 "\nInterchange valid for loops %d and %d:\n", i, j);
5706 /* Check if strip mining is profitable for every loop. */
5707 for (i = 0; i < nb_loops - start; i++)
5708 if (!strip_mine_profitable_p (gb, stride, start + i))
5711 /* Strip mine loops. */
5712 for (i = 0; i < nb_loops - start; i++)
5713 graphite_trans_bb_strip_mine (gb, start + 2 * i, stride);
5715 /* Interchange loops. */
5716 for (i = 1; i < nb_loops - start; i++)
5717 graphite_trans_bb_move_loop (gb, start + 2 * i, start + i);
5722 /* Loop block LOOPS innermost loops of a loop nest. BBS represent the
5723 basic blocks that belong to the loop nest to be blocked. */
5726 graphite_trans_loop_block (VEC (graphite_bb_p, heap) *bbs, int loops)
5730 bool transform_done = false;
5732 /* TODO: - Calculate the stride size automatically. */
5733 int stride_size = 64;
5735 for (i = 0; VEC_iterate (graphite_bb_p, bbs, i, gb); i++)
5736 transform_done |= graphite_trans_bb_block (gb, stride_size, loops);
5738 return transform_done;
5741 /* Loop block all basic blocks of SCOP. Return false when the
5742 transform is not performed. */
5745 graphite_trans_scop_block (scop_p scop)
5751 bool perfect = true;
5752 bool transform_done = false;
5754 VEC (graphite_bb_p, heap) *bbs = VEC_alloc (graphite_bb_p, heap, 3);
5755 int max_schedule = scop_max_loop_depth (scop) + 1;
5756 lambda_vector last_schedule = lambda_vector_new (max_schedule);
5758 if (VEC_length (graphite_bb_p, SCOP_BBS (scop)) == 0)
5761 /* Get the data of the first bb. */
5762 gb = VEC_index (graphite_bb_p, SCOP_BBS (scop), 0);
5763 last_nb_loops = gbb_nb_loops (gb);
5764 lambda_vector_copy (GBB_STATIC_SCHEDULE (gb), last_schedule,
5766 VEC_safe_push (graphite_bb_p, heap, bbs, gb);
5768 for (i = 0; VEC_iterate (graphite_bb_p, SCOP_BBS (scop), i, gb); i++)
5770 /* We did the first bb before. */
5774 nb_loops = gbb_nb_loops (gb);
5776 /* If the number of loops is unchanged and only the last element of the
5777 schedule changes, we stay in the loop nest. */
5778 if (nb_loops == last_nb_loops
5779 && (last_schedule [nb_loops + 1]
5780 != GBB_STATIC_SCHEDULE (gb)[nb_loops + 1]))
5782 VEC_safe_push (graphite_bb_p, heap, bbs, gb);
5786 /* Otherwise, we left the innermost loop. So check, if the last bb was in
5787 a perfect loop nest and how many loops are contained in this perfect
5790 Count the number of zeros from the end of the schedule. They are the
5791 number of surrounding loops.
5794 last_bb 2 3 2 0 0 0 0 3
5798 last_bb 2 3 2 0 0 0 0 3
5802 If there is no zero, there were other bbs in outer loops and the loop
5803 nest is not perfect. */
5804 for (j = last_nb_loops - 1; j >= 0; j--)
5806 if (last_schedule [j] != 0
5807 || (j <= nb_loops && GBB_STATIC_SCHEDULE (gb)[j] == 1))
5816 /* Found perfect loop nest. */
5817 if (perfect && last_nb_loops - j >= 2)
5818 transform_done |= graphite_trans_loop_block (bbs, last_nb_loops - j);
5820 /* Check if we start with a new loop.
5824 last_bb 2 3 2 0 0 0 0 3
5827 Here we start with the loop "2 3 2 0 0 1"
5829 last_bb 2 3 2 0 0 0 0 3
5832 But here not, so the loop nest can never be perfect. */
5834 perfect = (GBB_STATIC_SCHEDULE (gb)[nb_loops] == 0);
5836 /* Update the last_bb infos. We do not do that for the bbs in the same
5837 loop, as the data we use is not changed. */
5838 last_nb_loops = nb_loops;
5839 lambda_vector_copy (GBB_STATIC_SCHEDULE (gb), last_schedule,
5841 VEC_truncate (graphite_bb_p, bbs, 0);
5842 VEC_safe_push (graphite_bb_p, heap, bbs, gb);
5845 /* Check if the last loop nest was perfect. It is the same check as above,
5846 but the comparison with the next bb is missing. */
5847 for (j = last_nb_loops - 1; j >= 0; j--)
5848 if (last_schedule [j] != 0)
5856 /* Found perfect loop nest. */
5857 if (last_nb_loops - j > 0)
5858 transform_done |= graphite_trans_loop_block (bbs, last_nb_loops - j);
5859 VEC_free (graphite_bb_p, heap, bbs);
5861 if (dump_file && (dump_flags & TDF_DETAILS))
5862 fprintf (dump_file, "\nLoop blocked.\n");
5864 return transform_done;
5867 /* Apply graphite transformations to all the basic blocks of SCOP. */
5870 graphite_apply_transformations (scop_p scop)
5872 bool transform_done = false;
5874 /* Sort the list of bbs. Keep them always sorted. */
5875 graphite_sort_gbbs (scop);
5877 if (flag_loop_block)
5878 transform_done = graphite_trans_scop_block (scop);
5880 /* Generate code even if we did not apply any real transformation.
5881 This also allows to check the performance for the identity
5882 transformation: GIMPLE -> GRAPHITE -> GIMPLE
5883 Keep in mind that CLooG optimizes in control, so the loop structure
5884 may change, even if we only use -fgraphite-identity. */
5885 if (flag_graphite_identity)
5886 transform_done = true;
5888 return transform_done;
5891 /* We limit all SCoPs to SCoPs, that are completely surrounded by a loop.
5901 * SCoP frontier, as this line is not surrounded by any loop. *
5905 This is necessary as scalar evolution and parameter detection need a
5906 outermost loop to initialize parameters correctly.
5908 TODO: FIX scalar evolution and parameter detection to allow more flexible
5914 VEC (sd_region, heap) *tmp_scops = VEC_alloc (sd_region, heap, 3);
5919 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
5923 build_scop_bbs (scop);
5925 if (!build_scop_loop_nests (scop))
5928 for (j = 0; VEC_iterate (loop_p, SCOP_LOOP_NEST (scop), j, loop); j++)
5929 if (!loop_in_scop_p (loop_outer (loop), scop))
5931 sd_region open_scop;
5932 open_scop.entry = loop->header;
5933 open_scop.exit = single_exit (loop)->dest;
5934 VEC_safe_push (sd_region, heap, tmp_scops, &open_scop);
5938 free_scops (current_scops);
5939 current_scops = VEC_alloc (scop_p, heap, 3);
5941 create_sese_edges (tmp_scops);
5942 build_graphite_scops (tmp_scops);
5943 VEC_free (sd_region, heap, tmp_scops);
5946 /* Perform a set of linear transforms on the loops of the current
5950 graphite_transform_loops (void)
5955 if (number_of_loops () <= 1)
5958 current_scops = VEC_alloc (scop_p, heap, 3);
5959 recompute_all_dominators ();
5961 if (dump_file && (dump_flags & TDF_DETAILS))
5962 fprintf (dump_file, "Graphite loop transformations \n");
5964 initialize_original_copy_tables ();
5965 cloog_initialize ();
5969 if (dump_file && (dump_flags & TDF_DETAILS))
5970 fprintf (dump_file, "\nnumber of SCoPs: %d\n",
5971 VEC_length (scop_p, current_scops));
5973 for (i = 0; VEC_iterate (scop_p, current_scops, i, scop); i++)
5975 build_scop_bbs (scop);
5976 if (!build_scop_loop_nests (scop))
5979 build_scop_canonical_schedules (scop);
5980 build_bb_loops (scop);
5981 build_scop_conditions (scop);
5982 find_scop_parameters (scop);
5983 build_scop_context (scop);
5985 if (dump_file && (dump_flags & TDF_DETAILS))
5987 fprintf (dump_file, "\n(In SCoP %d:\n", i);
5988 fprintf (dump_file, "\nnumber of bbs: %d\n",
5989 VEC_length (graphite_bb_p, SCOP_BBS (scop)));
5990 fprintf (dump_file, "\nnumber of loops: %d)\n",
5991 VEC_length (loop_p, SCOP_LOOP_NEST (scop)));
5994 if (!build_scop_iteration_domain (scop))
5997 build_scop_data_accesses (scop);
5998 build_scop_dynamic_schedules (scop);
6000 if (dump_file && (dump_flags & TDF_DETAILS))
6002 int nbrefs = nb_data_refs_in_scop (scop);
6003 fprintf (dump_file, "\nnumber of data refs: %d\n", nbrefs);
6006 if (graphite_apply_transformations (scop))
6007 gloog (scop, find_transform (scop));
6008 #ifdef ENABLE_CHECKING
6011 struct clast_stmt *stmt = find_transform (scop);
6012 cloog_clast_free (stmt);
6018 free_scops (current_scops);
6020 free_original_copy_tables ();
6023 #else /* If Cloog is not available: #ifndef HAVE_cloog. */
6026 graphite_transform_loops (void)
6028 sorry ("Graphite loop optimizations cannot be used");