1 /* Single entry single exit control flow regions.
2 Copyright (C) 2008, 2009 Free Software Foundation, Inc.
3 Contributed by Jan Sjodin <jan.sjodin@amd.com> and
4 Sebastian Pop <sebastian.pop@amd.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
29 #include "basic-block.h"
30 #include "diagnostic.h"
31 #include "tree-flow.h"
33 #include "tree-dump.h"
36 #include "tree-chrec.h"
37 #include "tree-data-ref.h"
38 #include "tree-scalar-evolution.h"
39 #include "tree-pass.h"
41 #include "value-prof.h"
42 #include "pointer-set.h"
46 /* Print to stderr the element ELT. */
49 debug_rename_elt (rename_map_elt elt)
51 fprintf (stderr, "(");
52 print_generic_expr (stderr, elt->old_name, 0);
53 fprintf (stderr, ", ");
54 print_generic_expr (stderr, elt->expr, 0);
55 fprintf (stderr, ")\n");
58 /* Helper function for debug_rename_map. */
61 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
63 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
64 debug_rename_elt (entry);
68 /* Print to stderr all the elements of MAP. */
71 debug_rename_map (htab_t map)
73 htab_traverse (map, debug_rename_map_1, NULL);
76 /* Computes a hash function for database element ELT. */
79 rename_map_elt_info (const void *elt)
81 return SSA_NAME_VERSION (((const struct rename_map_elt_s *) elt)->old_name);
84 /* Compares database elements E1 and E2. */
87 eq_rename_map_elts (const void *e1, const void *e2)
89 const struct rename_map_elt_s *elt1 = (const struct rename_map_elt_s *) e1;
90 const struct rename_map_elt_s *elt2 = (const struct rename_map_elt_s *) e2;
92 return (elt1->old_name == elt2->old_name);
97 /* Print to stderr the element ELT. */
100 debug_ivtype_elt (ivtype_map_elt elt)
102 fprintf (stderr, "(%s, ", elt->cloog_iv);
103 print_generic_expr (stderr, elt->type, 0);
104 fprintf (stderr, ")\n");
107 /* Helper function for debug_ivtype_map. */
110 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
112 struct ivtype_map_elt_s *entry = (struct ivtype_map_elt_s *) *slot;
113 debug_ivtype_elt (entry);
117 /* Print to stderr all the elements of MAP. */
120 debug_ivtype_map (htab_t map)
122 htab_traverse (map, debug_ivtype_map_1, NULL);
125 /* Computes a hash function for database element ELT. */
128 ivtype_map_elt_info (const void *elt)
130 return htab_hash_pointer (((const struct ivtype_map_elt_s *) elt)->cloog_iv);
133 /* Compares database elements E1 and E2. */
136 eq_ivtype_map_elts (const void *e1, const void *e2)
138 const struct ivtype_map_elt_s *elt1 = (const struct ivtype_map_elt_s *) e1;
139 const struct ivtype_map_elt_s *elt2 = (const struct ivtype_map_elt_s *) e2;
141 return (elt1->cloog_iv == elt2->cloog_iv);
146 /* Record LOOP as occuring in REGION. */
149 sese_record_loop (sese region, loop_p loop)
151 if (sese_contains_loop (region, loop))
154 bitmap_set_bit (SESE_LOOPS (region), loop->num);
155 VEC_safe_push (loop_p, heap, SESE_LOOP_NEST (region), loop);
158 /* Build the loop nests contained in REGION. Returns true when the
159 operation was successful. */
162 build_sese_loop_nests (sese region)
166 struct loop *loop0, *loop1;
169 if (bb_in_sese_p (bb, region))
171 struct loop *loop = bb->loop_father;
173 /* Only add loops if they are completely contained in the SCoP. */
174 if (loop->header == bb
175 && bb_in_sese_p (loop->latch, region))
176 sese_record_loop (region, loop);
179 /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It
180 can be the case that an inner loop is inserted before an outer
181 loop. To avoid this, semi-sort once. */
182 for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop0); i++)
184 if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1)
187 loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1);
188 if (loop0->num > loop1->num)
190 VEC_replace (loop_p, SESE_LOOP_NEST (region), i, loop1);
191 VEC_replace (loop_p, SESE_LOOP_NEST (region), i + 1, loop0);
196 /* For a USE in BB, if BB is outside REGION, mark the USE in the
200 sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb,
206 if (TREE_CODE (use) != SSA_NAME)
209 ver = SSA_NAME_VERSION (use);
210 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
213 || !bb_in_sese_p (def_bb, region)
214 || bb_in_sese_p (bb, region))
217 bitmap_set_bit (liveouts, ver);
220 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
221 used in BB that is outside of the REGION. */
224 sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
226 gimple_stmt_iterator bsi;
232 FOR_EACH_EDGE (e, ei, bb->succs)
233 for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi))
234 sese_build_liveouts_use (region, liveouts, bb,
235 PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
237 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
239 gimple stmt = gsi_stmt (bsi);
241 if (is_gimple_debug (stmt))
244 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
245 sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
249 /* For a USE in BB, return true if BB is outside REGION and it's not
250 in the LIVEOUTS set. */
253 sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
259 if (TREE_CODE (use) != SSA_NAME)
262 ver = SSA_NAME_VERSION (use);
264 /* If it's in liveouts, the variable will get a new PHI node, and
265 the debug use will be properly adjusted. */
266 if (bitmap_bit_p (liveouts, ver))
269 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
272 || !bb_in_sese_p (def_bb, region)
273 || bb_in_sese_p (bb, region))
279 /* Reset debug stmts that reference SSA_NAMES defined in REGION that
280 are not marked as liveouts. */
283 sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
285 gimple_stmt_iterator bsi;
289 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
291 gimple stmt = gsi_stmt (bsi);
293 if (!is_gimple_debug (stmt))
296 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
297 if (sese_bad_liveouts_use (region, liveouts, bb,
298 USE_FROM_PTR (use_p)))
300 gimple_debug_bind_reset_value (stmt);
307 /* Build the LIVEOUTS of REGION: the set of variables defined inside
308 and used outside the REGION. */
311 sese_build_liveouts (sese region, bitmap liveouts)
316 sese_build_liveouts_bb (region, liveouts, bb);
317 if (MAY_HAVE_DEBUG_INSNS)
319 sese_reset_debug_liveouts_bb (region, liveouts, bb);
322 /* Builds a new SESE region from edges ENTRY and EXIT. */
325 new_sese (edge entry, edge exit)
327 sese region = XNEW (struct sese_s);
329 SESE_ENTRY (region) = entry;
330 SESE_EXIT (region) = exit;
331 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
332 SESE_LOOP_NEST (region) = VEC_alloc (loop_p, heap, 3);
333 SESE_ADD_PARAMS (region) = true;
334 SESE_PARAMS (region) = VEC_alloc (tree, heap, 3);
339 /* Deletes REGION. */
342 free_sese (sese region)
344 if (SESE_LOOPS (region))
345 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
347 VEC_free (tree, heap, SESE_PARAMS (region));
348 VEC_free (loop_p, heap, SESE_LOOP_NEST (region));
353 /* Add exit phis for USE on EXIT. */
356 sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
358 gimple phi = create_phi_node (use, exit);
360 create_new_def_for (gimple_phi_result (phi), phi,
361 gimple_phi_result_ptr (phi));
362 add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
363 add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
366 /* Insert in the block BB phi nodes for variables defined in REGION
367 and used outside the REGION. The code generation moves REGION in
368 the else clause of an "if (1)" and generates code in the then
369 clause that is at this point empty:
378 sese_insert_phis_for_liveouts (sese region, basic_block bb,
379 edge false_e, edge true_e)
383 bitmap liveouts = BITMAP_ALLOC (NULL);
385 update_ssa (TODO_update_ssa);
387 sese_build_liveouts (region, liveouts);
388 EXECUTE_IF_SET_IN_BITMAP (liveouts, 0, i, bi)
389 sese_add_exit_phis_edge (bb, ssa_name (i), false_e, true_e);
390 BITMAP_FREE (liveouts);
392 update_ssa (TODO_update_ssa);
395 /* Get the definition of NAME before the SESE. Keep track of the
396 basic blocks that have been VISITED in a bitmap. */
399 get_vdef_before_sese (sese region, tree name, sbitmap visited)
402 gimple stmt = SSA_NAME_DEF_STMT (name);
403 basic_block def_bb = gimple_bb (stmt);
405 if (!def_bb || !bb_in_sese_p (def_bb, region))
408 if (TEST_BIT (visited, def_bb->index))
411 SET_BIT (visited, def_bb->index);
413 switch (gimple_code (stmt))
416 for (i = 0; i < gimple_phi_num_args (stmt); i++)
418 tree arg = gimple_phi_arg_def (stmt, i);
421 if (gimple_bb (SSA_NAME_DEF_STMT (arg))
422 && def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (arg))->index)
425 res = get_vdef_before_sese (region, arg, visited);
434 use_operand_p use_p = gimple_vuse_op (stmt);
435 tree use = USE_FROM_PTR (use_p);
437 if (def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (use))->index)
438 RESET_BIT (visited, def_bb->index);
440 return get_vdef_before_sese (region, use, visited);
448 /* Adjust a virtual phi node PHI that is placed at the end of the
449 generated code for SCOP:
452 | generated code from REGION;
456 The FALSE_E edge comes from the original code, TRUE_E edge comes
457 from the code generated for the SCOP. */
460 sese_adjust_vphi (sese region, gimple phi, edge true_e)
464 gcc_assert (gimple_phi_num_args (phi) == 2);
466 for (i = 0; i < gimple_phi_num_args (phi); i++)
467 if (gimple_phi_arg_edge (phi, i) == true_e)
469 tree true_arg, false_arg, before_scop_arg;
472 true_arg = gimple_phi_arg_def (phi, i);
473 if (!SSA_NAME_IS_DEFAULT_DEF (true_arg))
476 false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0);
477 if (SSA_NAME_IS_DEFAULT_DEF (false_arg))
480 visited = sbitmap_alloc (last_basic_block);
481 sbitmap_zero (visited);
482 before_scop_arg = get_vdef_before_sese (region, false_arg, visited);
483 gcc_assert (before_scop_arg != NULL_TREE);
484 SET_PHI_ARG_DEF (phi, i, before_scop_arg);
485 sbitmap_free (visited);
489 /* Returns the expression associated to OLD_NAME in MAP. */
492 get_rename (htab_t map, tree old_name)
494 struct rename_map_elt_s tmp;
497 tmp.old_name = old_name;
498 slot = htab_find_slot (map, &tmp, NO_INSERT);
501 return ((rename_map_elt) *slot)->expr;
506 /* Register in MAP the rename tuple (OLD_NAME, EXPR). */
509 set_rename (htab_t map, tree old_name, tree expr)
511 struct rename_map_elt_s tmp;
514 if (old_name == expr)
517 tmp.old_name = old_name;
518 slot = htab_find_slot (map, &tmp, INSERT);
526 *slot = new_rename_map_elt (old_name, expr);
529 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in
530 the rename map M. Returns the expression T after renaming. */
533 rename_variables_in_expr (htab_t m, tree t)
538 if (TREE_CODE (t) == SSA_NAME)
539 return get_rename (m, t);
541 switch (TREE_CODE_LENGTH (TREE_CODE (t)))
544 TREE_OPERAND (t, 2) = rename_variables_in_expr (m, TREE_OPERAND (t, 2));
547 TREE_OPERAND (t, 1) = rename_variables_in_expr (m, TREE_OPERAND (t, 1));
550 TREE_OPERAND (t, 0) = rename_variables_in_expr (m, TREE_OPERAND (t, 0));
557 /* Renames all the loop->nb_iterations expressions following the
558 tuples (OLD_NAME, EXPR) in RENAME_MAP. */
561 rename_nb_iterations (htab_t rename_map)
566 FOR_EACH_LOOP (li, loop, 0)
567 loop->nb_iterations = rename_variables_in_expr (rename_map,
568 loop->nb_iterations);
571 /* Renames all the parameters of SESE following the tuples (OLD_NAME,
572 EXPR) in RENAME_MAP. */
575 rename_sese_parameters (htab_t rename_map, sese region)
580 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
581 VEC_replace (tree, SESE_PARAMS (region), i,
582 rename_variables_in_expr (rename_map, p));
585 /* Adjusts the phi nodes in the block BB for variables defined in
586 SCOP_REGION and used outside the SCOP_REGION. The code generation
587 moves SCOP_REGION in the else clause of an "if (1)" and generates
588 code in the then clause:
591 | generated code from REGION;
595 To adjust the phi nodes after the condition, the RENAME_MAP is
599 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
600 edge false_e, edge true_e)
602 gimple_stmt_iterator si;
604 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
607 unsigned false_i = 0;
608 gimple phi = gsi_stmt (si);
609 tree res = gimple_phi_result (phi);
611 if (!is_gimple_reg (res))
613 sese_adjust_vphi (region, phi, true_e);
617 for (i = 0; i < gimple_phi_num_args (phi); i++)
618 if (gimple_phi_arg_edge (phi, i) == false_e)
624 for (i = 0; i < gimple_phi_num_args (phi); i++)
625 if (gimple_phi_arg_edge (phi, i) == true_e)
627 tree old_name = gimple_phi_arg_def (phi, false_i);
628 tree expr = get_rename (rename_map, old_name);
631 gcc_assert (old_name != expr);
633 if (TREE_CODE (expr) != SSA_NAME
634 && is_gimple_reg (old_name))
636 tree type = TREE_TYPE (old_name);
637 tree var = create_tmp_var (type, "var");
639 expr = build2 (MODIFY_EXPR, type, var, expr);
640 expr = force_gimple_operand (expr, &stmts, true, NULL);
641 gsi_insert_seq_on_edge_immediate (true_e, stmts);
644 SET_PHI_ARG_DEF (phi, i, expr);
645 set_rename (rename_map, old_name, res);
650 /* Rename the SSA_NAMEs used in STMT and that appear in MAP. */
653 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
658 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
660 tree use = USE_FROM_PTR (use_p);
661 tree expr = get_rename (map, use);
662 tree type_use = TREE_TYPE (use);
663 tree type_expr = TREE_TYPE (expr);
669 if (type_use != type_expr
670 || (TREE_CODE (expr) != SSA_NAME
671 && is_gimple_reg (use)))
675 if (is_gimple_debug (stmt))
677 if (gimple_debug_bind_p (stmt))
678 gimple_debug_bind_reset_value (stmt);
685 var = create_tmp_var (type_use, "var");
687 if (type_use != type_expr)
688 expr = fold_convert (type_use, expr);
690 expr = build2 (MODIFY_EXPR, type_use, var, expr);
691 expr = force_gimple_operand (expr, &stmts, true, NULL);
692 gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT);
695 replace_exp (use_p, expr);
701 /* Returns true if NAME is a parameter of SESE. */
704 is_parameter (sese region, tree name)
709 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
716 /* Returns true if NAME is an induction variable. */
721 return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
724 static void expand_scalar_variables_stmt (gimple, basic_block, sese,
725 htab_t, gimple_stmt_iterator *);
727 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
728 sese, htab_t, gimple_stmt_iterator *);
731 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
732 htab_t map, gimple_stmt_iterator *gsi)
734 int i, nargs = gimple_call_num_args (stmt);
735 VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs);
736 tree fn_type = TREE_TYPE (gimple_call_fn (stmt));
737 tree fn = gimple_call_fndecl (stmt);
738 tree call_expr, var, lhs;
741 for (i = 0; i < nargs; i++)
743 tree arg = gimple_call_arg (stmt, i);
744 tree t = TREE_TYPE (arg);
746 var = create_tmp_var (t, "var");
747 arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL,
748 bb, region, map, gsi);
749 arg = build2 (MODIFY_EXPR, t, var, arg);
750 arg = force_gimple_operand_gsi (gsi, arg, true, NULL,
751 true, GSI_SAME_STMT);
752 VEC_quick_push (tree, args, arg);
755 lhs = gimple_call_lhs (stmt);
756 var = create_tmp_var (TREE_TYPE (lhs), "var");
757 call_expr = build_call_vec (fn_type, fn, args);
758 call = gimple_build_call_from_tree (call_expr);
759 var = make_ssa_name (var, call);
760 gimple_call_set_lhs (call, var);
761 gsi_insert_before (gsi, call, GSI_SAME_STMT);
766 /* Copies at GSI all the scalar computations on which the ssa_name OP0
767 depends on in the SESE: these are all the scalar variables used in
768 the definition of OP0, that are defined outside BB and still in the
769 SESE, i.e. not a parameter of the SESE. The expression that is
770 returned contains only induction variables from the generated code:
771 MAP contains the induction variables renaming mapping, and is used
772 to translate the names of induction variables. */
775 expand_scalar_variables_ssa_name (tree op0, basic_block bb,
776 sese region, htab_t map,
777 gimple_stmt_iterator *gsi)
782 if (is_parameter (region, op0)
784 return get_rename (map, op0);
786 def_stmt = SSA_NAME_DEF_STMT (op0);
788 /* Check whether we already have a rename for OP0. */
789 new_op = get_rename (map, op0);
792 && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
795 if (gimple_bb (def_stmt) == bb)
797 /* If the defining statement is in the basic block already
798 we do not need to create a new expression for it, we
799 only need to ensure its operands are expanded. */
800 expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi);
805 if (!gimple_bb (def_stmt)
806 || !bb_in_sese_p (gimple_bb (def_stmt), region))
809 switch (gimple_code (def_stmt))
813 tree var0 = gimple_assign_rhs1 (def_stmt);
814 enum tree_code subcode = gimple_assign_rhs_code (def_stmt);
815 tree var1 = gimple_assign_rhs2 (def_stmt);
816 tree type = gimple_expr_type (def_stmt);
818 return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
823 return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
832 /* Copies at GSI all the scalar computations on which the expression
833 OP0 CODE OP1 depends on in the SESE: these are all the scalar
834 variables used in OP0 and OP1, defined outside BB and still defined
835 in the SESE, i.e. not a parameter of the SESE. The expression that
836 is returned contains only induction variables from the generated
837 code: MAP contains the induction variables renaming mapping, and is
838 used to translate the names of induction variables. */
841 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
842 tree op1, basic_block bb, sese region,
843 htab_t map, gimple_stmt_iterator *gsi)
845 if (TREE_CODE_CLASS (code) == tcc_constant
846 || TREE_CODE_CLASS (code) == tcc_declaration)
849 /* For data references we have to duplicate also its memory
851 if (TREE_CODE_CLASS (code) == tcc_reference)
858 tree op = TREE_OPERAND (op0, 0);
859 tree res = expand_scalar_variables_expr
860 (type, op, TREE_CODE (op), NULL, bb, region, map, gsi);
861 return build1 (code, type, res);
866 tree old_name = TREE_OPERAND (op0, 0);
867 tree expr = expand_scalar_variables_ssa_name
868 (old_name, bb, region, map, gsi);
870 if (TREE_CODE (expr) != SSA_NAME
871 && is_gimple_reg (old_name))
873 tree type = TREE_TYPE (old_name);
874 tree var = create_tmp_var (type, "var");
876 expr = build2 (MODIFY_EXPR, type, var, expr);
877 expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
878 true, GSI_SAME_STMT);
881 return fold_build1 (code, type, expr);
886 tree op00 = TREE_OPERAND (op0, 0);
887 tree op01 = TREE_OPERAND (op0, 1);
888 tree op02 = TREE_OPERAND (op0, 2);
889 tree op03 = TREE_OPERAND (op0, 3);
890 tree base = expand_scalar_variables_expr
891 (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region,
893 tree subscript = expand_scalar_variables_expr
894 (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region,
897 return build4 (ARRAY_REF, type, base, subscript, op02, op03);
904 /* The above cases should catch everything. */
909 if (TREE_CODE_CLASS (code) == tcc_unary)
911 tree op0_type = TREE_TYPE (op0);
912 enum tree_code op0_code = TREE_CODE (op0);
913 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
914 NULL, bb, region, map, gsi);
916 return fold_build1 (code, type, op0_expr);
919 if (TREE_CODE_CLASS (code) == tcc_binary
920 || TREE_CODE_CLASS (code) == tcc_comparison)
922 tree op0_type = TREE_TYPE (op0);
923 enum tree_code op0_code = TREE_CODE (op0);
924 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
925 NULL, bb, region, map, gsi);
926 tree op1_type = TREE_TYPE (op1);
927 enum tree_code op1_code = TREE_CODE (op1);
928 tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
929 NULL, bb, region, map, gsi);
931 return fold_build2 (code, type, op0_expr, op1_expr);
934 if (code == SSA_NAME)
935 return expand_scalar_variables_ssa_name (op0, bb, region, map, gsi);
937 if (code == ADDR_EXPR)
939 tree op00 = TREE_OPERAND (op0, 0);
941 if (handled_component_p (op00)
942 && TREE_CODE (op00) == ARRAY_REF)
944 tree e = expand_scalar_variables_expr (TREE_TYPE (op00), op00,
946 NULL, bb, region, map, gsi);
947 return fold_build1 (code, TREE_TYPE (op0), e);
957 /* Copies at the beginning of BB all the scalar computations on which
958 STMT depends on in the SESE: these are all the scalar variables used
959 in STMT, defined outside BB and still defined in the SESE, i.e. not a
960 parameter of the SESE. The expression that is returned contains
961 only induction variables from the generated code: MAP contains the
962 induction variables renaming mapping, and is used to translate the
963 names of induction variables. */
966 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
967 htab_t map, gimple_stmt_iterator *gsi)
972 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
974 tree use = USE_FROM_PTR (use_p);
975 tree type = TREE_TYPE (use);
976 enum tree_code code = TREE_CODE (use);
979 if (!is_gimple_reg (use))
982 /* Don't expand USE if we already have a rename for it. */
983 use_expr = get_rename (map, use);
987 use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
989 use_expr = fold_convert (type, use_expr);
994 if (is_gimple_debug (stmt))
996 if (gimple_debug_bind_p (stmt))
997 gimple_debug_bind_reset_value (stmt);
1004 if (TREE_CODE (use_expr) != SSA_NAME)
1006 tree var = create_tmp_var (type, "var");
1008 use_expr = build2 (MODIFY_EXPR, type, var, use_expr);
1009 use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL,
1010 true, GSI_SAME_STMT);
1013 replace_exp (use_p, use_expr);
1019 /* Copies at the beginning of BB all the scalar computations on which
1020 BB depends on in the SESE: these are all the scalar variables used
1021 in BB, defined outside BB and still defined in the SESE, i.e. not a
1022 parameter of the SESE. The expression that is returned contains
1023 only induction variables from the generated code: MAP contains the
1024 induction variables renaming mapping, and is used to translate the
1025 names of induction variables. */
1028 expand_scalar_variables (basic_block bb, sese region, htab_t map)
1030 gimple_stmt_iterator gsi;
1032 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
1034 gimple stmt = gsi_stmt (gsi);
1035 expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
1040 /* Rename all the SSA_NAMEs from block BB according to the MAP. */
1043 rename_variables (basic_block bb, htab_t map)
1045 gimple_stmt_iterator gsi;
1046 gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
1048 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1049 rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi);
1052 /* Remove condition from BB. */
1055 remove_condition (basic_block bb)
1057 gimple last = last_stmt (bb);
1059 if (last && gimple_code (last) == GIMPLE_COND)
1061 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1062 gsi_remove (&gsi, true);
1066 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
1069 get_true_edge_from_guard_bb (basic_block bb)
1074 FOR_EACH_EDGE (e, ei, bb->succs)
1075 if (e->flags & EDGE_TRUE_VALUE)
1082 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */
1085 get_false_edge_from_guard_bb (basic_block bb)
1090 FOR_EACH_EDGE (e, ei, bb->succs)
1091 if (!(e->flags & EDGE_TRUE_VALUE))
1098 /* Returns true when NAME is defined in LOOP. */
1101 name_defined_in_loop_p (tree name, loop_p loop)
1103 gimple stmt = SSA_NAME_DEF_STMT (name);
1105 return (gimple_bb (stmt)->loop_father == loop);
1108 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP. */
1111 expr_defined_in_loop_p (tree expr, loop_p loop)
1113 switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
1116 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1117 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop)
1118 || expr_defined_in_loop_p (TREE_OPERAND (expr, 2), loop);
1121 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1122 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop);
1125 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop);
1128 return TREE_CODE (expr) == SSA_NAME
1129 && name_defined_in_loop_p (expr, loop);
1136 /* Returns the gimple statement that uses NAME outside the loop it is
1137 defined in, returns NULL if there is no such loop close phi node.
1138 An invariant of the loop closed SSA form is that the only use of a
1139 variable, outside the loop it is defined in, is in the loop close
1140 phi node that just follows the loop. */
1143 alive_after_loop (tree name)
1145 use_operand_p use_p;
1146 imm_use_iterator imm_iter;
1147 loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father;
1149 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
1151 gimple stmt = USE_STMT (use_p);
1153 if (gimple_code (stmt) == GIMPLE_PHI
1154 && gimple_bb (stmt)->loop_father != loop)
1161 /* Return true if a close phi has not yet been inserted for the use of
1162 variable NAME on the single exit of LOOP. */
1165 close_phi_not_yet_inserted_p (loop_p loop, tree name)
1167 gimple_stmt_iterator psi;
1168 basic_block bb = single_exit (loop)->dest;
1170 for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
1171 if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name)
1177 /* A structure for passing parameters to add_loop_exit_phis. */
1179 typedef struct alep {
1181 VEC (rename_map_elt, heap) *new_renames;
1184 /* Helper function for htab_traverse in insert_loop_close_phis. */
1187 add_loop_exit_phis (void **slot, void *data)
1189 struct rename_map_elt_s *entry;
1192 tree expr, new_name, old_name;
1193 bool def_in_loop_p, used_outside_p, need_close_phi_p;
1194 gimple old_close_phi;
1196 if (!slot || !*slot || !data)
1199 entry = (struct rename_map_elt_s *) *slot;
1202 new_name = expr = entry->expr;
1203 old_name = entry->old_name;
1205 def_in_loop_p = expr_defined_in_loop_p (expr, loop);
1209 /* Remove the old rename from the map when the expression is defined
1210 in the loop that we're closing. */
1214 if (TREE_CODE (expr) != SSA_NAME)
1217 old_close_phi = alive_after_loop (old_name);
1218 used_outside_p = (old_close_phi != NULL);
1219 need_close_phi_p = (used_outside_p
1220 && close_phi_not_yet_inserted_p (loop, new_name));
1222 /* Insert a loop close phi node. */
1223 if (need_close_phi_p)
1225 basic_block bb = single_exit (loop)->dest;
1226 gimple phi = create_phi_node (new_name, bb);
1227 tree new_res = create_new_def_for (gimple_phi_result (phi), phi,
1228 gimple_phi_result_ptr (phi));
1230 add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION);
1231 VEC_safe_push (rename_map_elt, heap, a->new_renames,
1232 new_rename_map_elt (gimple_phi_result (old_close_phi),
1239 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where
1240 NEW is defined in LOOP. Inserts on the exit of LOOP the close phi
1241 node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in
1242 the original code. Inserts in MAP the tuple (OLD_RES, RES). */
1245 insert_loop_close_phis (htab_t map, loop_p loop)
1252 a.new_renames = VEC_alloc (rename_map_elt, heap, 3);
1253 update_ssa (TODO_update_ssa);
1254 htab_traverse (map, add_loop_exit_phis, &a);
1255 update_ssa (TODO_update_ssa);
1257 for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1259 set_rename (map, elt->old_name, elt->expr);
1263 VEC_free (rename_map_elt, heap, a.new_renames);
1266 /* Helper structure for htab_traverse in insert_guard_phis. */
1270 edge true_edge, false_edge;
1271 htab_t before_guard;
1274 /* Return the default name that is before the guard. */
1277 default_before_guard (htab_t before_guard, tree old_name)
1279 tree res = get_rename (before_guard, old_name);
1281 if (res == old_name)
1283 if (is_gimple_reg (res))
1284 return fold_convert (TREE_TYPE (res), integer_zero_node);
1285 return gimple_default_def (cfun, SSA_NAME_VAR (res));
1291 /* Prepares EXPR to be a good phi argument when the phi result is
1292 RES. Insert needed statements on edge E. */
1295 convert_for_phi_arg (tree expr, tree res, edge e)
1297 tree type = TREE_TYPE (res);
1299 if (TREE_TYPE (expr) != type)
1300 expr = fold_convert (type, expr);
1302 if (TREE_CODE (expr) != SSA_NAME
1303 && !is_gimple_min_invariant (expr))
1305 tree var = create_tmp_var (type, "var");
1308 expr = build2 (MODIFY_EXPR, type, var, expr);
1309 expr = force_gimple_operand (expr, &stmts, true, NULL);
1310 gsi_insert_seq_on_edge_immediate (e, stmts);
1316 /* Helper function for htab_traverse in insert_guard_phis. */
1319 add_guard_exit_phis (void **slot, void *s)
1321 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
1322 struct igp *i = (struct igp *) s;
1323 basic_block bb = i->bb;
1324 edge true_edge = i->true_edge;
1325 edge false_edge = i->false_edge;
1326 tree res = entry->old_name;
1327 tree name1 = entry->expr;
1328 tree name2 = default_before_guard (i->before_guard, res);
1331 /* Nothing to be merged if the name before the guard is the same as
1336 name1 = convert_for_phi_arg (name1, res, true_edge);
1337 name2 = convert_for_phi_arg (name2, res, false_edge);
1339 phi = create_phi_node (res, bb);
1340 res = create_new_def_for (gimple_phi_result (phi), phi,
1341 gimple_phi_result_ptr (phi));
1343 add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1344 add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1351 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1).
1352 If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD,
1353 with NAME1 different than NAME2, then insert in BB the phi node:
1355 | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1357 if there is no tuple for OLD in BEFORE_GUARD, insert
1359 | RES = phi (NAME1 (on TRUE_EDGE),
1360 | DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1362 Finally register in RENAME_MAP the tuple (OLD, RES). */
1365 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1366 htab_t before_guard, htab_t rename_map)
1370 i.true_edge = true_edge;
1371 i.false_edge = false_edge;
1372 i.before_guard = before_guard;
1374 update_ssa (TODO_update_ssa);
1375 htab_traverse (rename_map, add_guard_exit_phis, &i);
1376 update_ssa (TODO_update_ssa);
1379 /* Create a duplicate of the basic block BB. NOTE: This does not
1380 preserve SSA form. */
1383 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1385 gimple_stmt_iterator gsi, gsi_tgt;
1387 gsi_tgt = gsi_start_bb (new_bb);
1388 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1390 def_operand_p def_p;
1391 ssa_op_iter op_iter;
1392 gimple stmt = gsi_stmt (gsi);
1395 if (gimple_code (stmt) == GIMPLE_LABEL)
1398 /* Create a new copy of STMT and duplicate STMT's virtual
1400 copy = gimple_copy (stmt);
1401 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
1402 mark_sym_for_renaming (gimple_vop (cfun));
1404 maybe_duplicate_eh_stmt (copy, stmt);
1405 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1407 /* Create new names for all the definitions created by COPY and
1408 add replacement mappings for each new name. */
1409 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
1411 tree old_name = DEF_FROM_PTR (def_p);
1412 tree new_name = create_new_def_for (old_name, copy, def_p);
1413 set_rename (map, old_name, new_name);
1418 /* Copies BB and includes in the copied BB all the statements that can
1419 be reached following the use-def chains from the memory accesses,
1420 and returns the next edge following this new block. */
1423 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1424 edge next_e, htab_t map)
1426 basic_block new_bb = split_edge (next_e);
1428 next_e = single_succ_edge (new_bb);
1429 graphite_copy_stmts_from_block (bb, new_bb, map);
1430 remove_condition (new_bb);
1431 remove_phi_nodes (new_bb);
1432 expand_scalar_variables (new_bb, region, map);
1433 rename_variables (new_bb, map);
1438 /* Returns the outermost loop in SCOP that contains BB. */
1441 outermost_loop_in_sese (sese region, basic_block bb)
1445 nest = bb->loop_father;
1446 while (loop_outer (nest)
1447 && loop_in_sese_p (loop_outer (nest), region))
1448 nest = loop_outer (nest);
1453 /* Sets the false region of an IF_REGION to REGION. */
1456 if_region_set_false_region (ifsese if_region, sese region)
1458 basic_block condition = if_region_get_condition_block (if_region);
1459 edge false_edge = get_false_edge_from_guard_bb (condition);
1460 basic_block dummy = false_edge->dest;
1461 edge entry_region = SESE_ENTRY (region);
1462 edge exit_region = SESE_EXIT (region);
1463 basic_block before_region = entry_region->src;
1464 basic_block last_in_region = exit_region->src;
1465 void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
1466 htab_hash_pointer (exit_region),
1469 entry_region->flags = false_edge->flags;
1470 false_edge->flags = exit_region->flags;
1472 redirect_edge_pred (entry_region, condition);
1473 redirect_edge_pred (exit_region, before_region);
1474 redirect_edge_pred (false_edge, last_in_region);
1475 redirect_edge_succ (false_edge, single_succ (dummy));
1476 delete_basic_block (dummy);
1478 exit_region->flags = EDGE_FALLTHRU;
1479 recompute_all_dominators ();
1481 SESE_EXIT (region) = false_edge;
1483 if (if_region->false_region)
1484 free (if_region->false_region);
1485 if_region->false_region = region;
1489 struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
1491 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1492 htab_clear_slot (current_loops->exits, slot);
1494 slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
1495 htab_hash_pointer (false_edge),
1497 loop_exit->e = false_edge;
1499 false_edge->src->loop_father->exits->next = loop_exit;
1503 /* Creates an IFSESE with CONDITION on edge ENTRY. */
1506 create_if_region_on_edge (edge entry, tree condition)
1510 sese sese_region = XNEW (struct sese_s);
1511 sese true_region = XNEW (struct sese_s);
1512 sese false_region = XNEW (struct sese_s);
1513 ifsese if_region = XNEW (struct ifsese_s);
1514 edge exit = create_empty_if_region_on_edge (entry, condition);
1516 if_region->region = sese_region;
1517 if_region->region->entry = entry;
1518 if_region->region->exit = exit;
1520 FOR_EACH_EDGE (e, ei, entry->dest->succs)
1522 if (e->flags & EDGE_TRUE_VALUE)
1524 true_region->entry = e;
1525 true_region->exit = single_succ_edge (e->dest);
1526 if_region->true_region = true_region;
1528 else if (e->flags & EDGE_FALSE_VALUE)
1530 false_region->entry = e;
1531 false_region->exit = single_succ_edge (e->dest);
1532 if_region->false_region = false_region;
1539 /* Moves REGION in a condition expression:
1547 move_sese_in_condition (sese region)
1549 basic_block pred_block = split_edge (SESE_ENTRY (region));
1552 SESE_ENTRY (region) = single_succ_edge (pred_block);
1553 if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
1554 if_region_set_false_region (if_region, region);
1559 /* Replaces the condition of the IF_REGION with CONDITION:
1567 set_ifsese_condition (ifsese if_region, tree condition)
1569 sese region = if_region->region;
1570 edge entry = region->entry;
1571 basic_block bb = entry->dest;
1572 gimple last = last_stmt (bb);
1573 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1576 gcc_assert (gimple_code (last) == GIMPLE_COND);
1578 gsi_remove (&gsi, true);
1579 gsi = gsi_last_bb (bb);
1580 condition = force_gimple_operand_gsi (&gsi, condition, true, NULL,
1581 false, GSI_NEW_STMT);
1582 cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE);
1583 gsi = gsi_last_bb (bb);
1584 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
1587 /* Returns the scalar evolution of T in REGION. Every variable that
1588 is not defined in the REGION is considered a parameter. */
1591 scalar_evolution_in_region (sese region, loop_p loop, tree t)
1594 struct loop *def_loop;
1595 basic_block before = block_before_sese (region);
1597 if (TREE_CODE (t) != SSA_NAME
1598 || loop_in_sese_p (loop, region))
1599 return instantiate_scev (before, loop,
1600 analyze_scalar_evolution (loop, t));
1602 if (!defined_in_sese_p (t, region))
1605 def = SSA_NAME_DEF_STMT (t);
1606 def_loop = loop_containing_stmt (def);
1608 if (loop_in_sese_p (def_loop, region))
1610 t = analyze_scalar_evolution (def_loop, t);
1611 def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
1612 t = compute_overall_effect_of_inner_loop (def_loop, t);
1616 return instantiate_scev (before, loop, t);