1 /* Single entry single exit control flow regions.
2 Copyright (C) 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Jan Sjodin <jan.sjodin@amd.com> and
5 Sebastian Pop <sebastian.pop@amd.com>.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
25 #include "coretypes.h"
30 #include "basic-block.h"
31 #include "diagnostic.h"
32 #include "tree-pretty-print.h"
33 #include "tree-flow.h"
35 #include "tree-dump.h"
38 #include "tree-chrec.h"
39 #include "tree-data-ref.h"
40 #include "tree-scalar-evolution.h"
41 #include "tree-pass.h"
43 #include "value-prof.h"
44 #include "pointer-set.h"
48 /* Print to stderr the element ELT. */
51 debug_rename_elt (rename_map_elt elt)
53 fprintf (stderr, "(");
54 print_generic_expr (stderr, elt->old_name, 0);
55 fprintf (stderr, ", ");
56 print_generic_expr (stderr, elt->expr, 0);
57 fprintf (stderr, ")\n");
60 /* Helper function for debug_rename_map. */
63 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
65 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
66 debug_rename_elt (entry);
70 /* Print to stderr all the elements of MAP. */
73 debug_rename_map (htab_t map)
75 htab_traverse (map, debug_rename_map_1, NULL);
78 /* Computes a hash function for database element ELT. */
81 rename_map_elt_info (const void *elt)
83 return SSA_NAME_VERSION (((const struct rename_map_elt_s *) elt)->old_name);
86 /* Compares database elements E1 and E2. */
89 eq_rename_map_elts (const void *e1, const void *e2)
91 const struct rename_map_elt_s *elt1 = (const struct rename_map_elt_s *) e1;
92 const struct rename_map_elt_s *elt2 = (const struct rename_map_elt_s *) e2;
94 return (elt1->old_name == elt2->old_name);
99 /* Print to stderr the element ELT. */
102 debug_ivtype_elt (ivtype_map_elt elt)
104 fprintf (stderr, "(%s, ", elt->cloog_iv);
105 print_generic_expr (stderr, elt->type, 0);
106 fprintf (stderr, ")\n");
109 /* Helper function for debug_ivtype_map. */
112 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
114 struct ivtype_map_elt_s *entry = (struct ivtype_map_elt_s *) *slot;
115 debug_ivtype_elt (entry);
119 /* Print to stderr all the elements of MAP. */
122 debug_ivtype_map (htab_t map)
124 htab_traverse (map, debug_ivtype_map_1, NULL);
127 /* Computes a hash function for database element ELT. */
130 ivtype_map_elt_info (const void *elt)
132 return htab_hash_pointer (((const struct ivtype_map_elt_s *) elt)->cloog_iv);
135 /* Compares database elements E1 and E2. */
138 eq_ivtype_map_elts (const void *e1, const void *e2)
140 const struct ivtype_map_elt_s *elt1 = (const struct ivtype_map_elt_s *) e1;
141 const struct ivtype_map_elt_s *elt2 = (const struct ivtype_map_elt_s *) e2;
143 return (elt1->cloog_iv == elt2->cloog_iv);
148 /* Record LOOP as occuring in REGION. */
151 sese_record_loop (sese region, loop_p loop)
153 if (sese_contains_loop (region, loop))
156 bitmap_set_bit (SESE_LOOPS (region), loop->num);
157 VEC_safe_push (loop_p, heap, SESE_LOOP_NEST (region), loop);
160 /* Build the loop nests contained in REGION. Returns true when the
161 operation was successful. */
164 build_sese_loop_nests (sese region)
168 struct loop *loop0, *loop1;
171 if (bb_in_sese_p (bb, region))
173 struct loop *loop = bb->loop_father;
175 /* Only add loops if they are completely contained in the SCoP. */
176 if (loop->header == bb
177 && bb_in_sese_p (loop->latch, region))
178 sese_record_loop (region, loop);
181 /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It
182 can be the case that an inner loop is inserted before an outer
183 loop. To avoid this, semi-sort once. */
184 for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop0); i++)
186 if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1)
189 loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1);
190 if (loop0->num > loop1->num)
192 VEC_replace (loop_p, SESE_LOOP_NEST (region), i, loop1);
193 VEC_replace (loop_p, SESE_LOOP_NEST (region), i + 1, loop0);
198 /* For a USE in BB, if BB is outside REGION, mark the USE in the
202 sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb,
208 if (TREE_CODE (use) != SSA_NAME)
211 ver = SSA_NAME_VERSION (use);
212 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
215 || !bb_in_sese_p (def_bb, region)
216 || bb_in_sese_p (bb, region))
219 bitmap_set_bit (liveouts, ver);
222 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
223 used in BB that is outside of the REGION. */
226 sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
228 gimple_stmt_iterator bsi;
234 FOR_EACH_EDGE (e, ei, bb->succs)
235 for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi))
236 sese_build_liveouts_use (region, liveouts, bb,
237 PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
239 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
241 gimple stmt = gsi_stmt (bsi);
243 if (is_gimple_debug (stmt))
246 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
247 sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
251 /* For a USE in BB, return true if BB is outside REGION and it's not
252 in the LIVEOUTS set. */
255 sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
261 if (TREE_CODE (use) != SSA_NAME)
264 ver = SSA_NAME_VERSION (use);
266 /* If it's in liveouts, the variable will get a new PHI node, and
267 the debug use will be properly adjusted. */
268 if (bitmap_bit_p (liveouts, ver))
271 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
274 || !bb_in_sese_p (def_bb, region)
275 || bb_in_sese_p (bb, region))
281 /* Reset debug stmts that reference SSA_NAMES defined in REGION that
282 are not marked as liveouts. */
285 sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
287 gimple_stmt_iterator bsi;
291 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
293 gimple stmt = gsi_stmt (bsi);
295 if (!is_gimple_debug (stmt))
298 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
299 if (sese_bad_liveouts_use (region, liveouts, bb,
300 USE_FROM_PTR (use_p)))
302 gimple_debug_bind_reset_value (stmt);
309 /* Build the LIVEOUTS of REGION: the set of variables defined inside
310 and used outside the REGION. */
313 sese_build_liveouts (sese region, bitmap liveouts)
318 sese_build_liveouts_bb (region, liveouts, bb);
319 if (MAY_HAVE_DEBUG_INSNS)
321 sese_reset_debug_liveouts_bb (region, liveouts, bb);
324 /* Builds a new SESE region from edges ENTRY and EXIT. */
327 new_sese (edge entry, edge exit)
329 sese region = XNEW (struct sese_s);
331 SESE_ENTRY (region) = entry;
332 SESE_EXIT (region) = exit;
333 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
334 SESE_LOOP_NEST (region) = VEC_alloc (loop_p, heap, 3);
335 SESE_ADD_PARAMS (region) = true;
336 SESE_PARAMS (region) = VEC_alloc (tree, heap, 3);
341 /* Deletes REGION. */
344 free_sese (sese region)
346 if (SESE_LOOPS (region))
347 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
349 VEC_free (tree, heap, SESE_PARAMS (region));
350 VEC_free (loop_p, heap, SESE_LOOP_NEST (region));
355 /* Add exit phis for USE on EXIT. */
358 sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
360 gimple phi = create_phi_node (use, exit);
362 create_new_def_for (gimple_phi_result (phi), phi,
363 gimple_phi_result_ptr (phi));
364 add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
365 add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
368 /* Insert in the block BB phi nodes for variables defined in REGION
369 and used outside the REGION. The code generation moves REGION in
370 the else clause of an "if (1)" and generates code in the then
371 clause that is at this point empty:
380 sese_insert_phis_for_liveouts (sese region, basic_block bb,
381 edge false_e, edge true_e)
385 bitmap liveouts = BITMAP_ALLOC (NULL);
387 update_ssa (TODO_update_ssa);
389 sese_build_liveouts (region, liveouts);
390 EXECUTE_IF_SET_IN_BITMAP (liveouts, 0, i, bi)
391 sese_add_exit_phis_edge (bb, ssa_name (i), false_e, true_e);
392 BITMAP_FREE (liveouts);
394 update_ssa (TODO_update_ssa);
397 /* Returns the expression associated to OLD_NAME in MAP. */
400 get_rename (htab_t map, tree old_name)
402 struct rename_map_elt_s tmp;
405 gcc_assert (TREE_CODE (old_name) == SSA_NAME);
406 tmp.old_name = old_name;
407 slot = htab_find_slot (map, &tmp, NO_INSERT);
410 return ((rename_map_elt) *slot)->expr;
415 /* Register in MAP the rename tuple (OLD_NAME, EXPR). */
418 set_rename (htab_t map, tree old_name, tree expr)
420 struct rename_map_elt_s tmp;
423 if (old_name == expr)
426 tmp.old_name = old_name;
427 slot = htab_find_slot (map, &tmp, INSERT);
435 *slot = new_rename_map_elt (old_name, expr);
438 /* Rename the SSA_NAMEs used in STMT and that appear in MAP. */
441 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
446 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
448 tree use = USE_FROM_PTR (use_p);
449 tree expr, type_use, type_expr;
452 if (TREE_CODE (use) != SSA_NAME)
455 expr = get_rename (map, use);
459 type_use = TREE_TYPE (use);
460 type_expr = TREE_TYPE (expr);
462 if (type_use != type_expr
463 || (TREE_CODE (expr) != SSA_NAME
464 && is_gimple_reg (use)))
468 if (is_gimple_debug (stmt))
470 if (gimple_debug_bind_p (stmt))
471 gimple_debug_bind_reset_value (stmt);
478 var = create_tmp_var (type_use, "var");
480 if (type_use != type_expr)
481 expr = fold_convert (type_use, expr);
483 expr = build2 (MODIFY_EXPR, type_use, var, expr);
484 expr = force_gimple_operand (expr, &stmts, true, NULL);
485 gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT);
488 replace_exp (use_p, expr);
494 /* Returns true if NAME is a parameter of SESE. */
497 is_parameter (sese region, tree name)
502 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
509 /* Returns true if NAME is an induction variable. */
514 return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
517 static void expand_scalar_variables_stmt (gimple, basic_block, sese,
518 htab_t, gimple_stmt_iterator *);
520 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
521 sese, htab_t, gimple_stmt_iterator *);
524 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
525 htab_t map, gimple_stmt_iterator *gsi)
527 int i, nargs = gimple_call_num_args (stmt);
528 VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs);
529 tree fn_type = TREE_TYPE (gimple_call_fn (stmt));
530 tree fn = gimple_call_fndecl (stmt);
531 tree call_expr, var, lhs;
534 for (i = 0; i < nargs; i++)
536 tree arg = gimple_call_arg (stmt, i);
537 tree t = TREE_TYPE (arg);
539 var = create_tmp_var (t, "var");
540 arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL,
541 bb, region, map, gsi);
542 arg = build2 (MODIFY_EXPR, t, var, arg);
543 arg = force_gimple_operand_gsi (gsi, arg, true, NULL,
544 true, GSI_SAME_STMT);
545 VEC_quick_push (tree, args, arg);
548 lhs = gimple_call_lhs (stmt);
549 var = create_tmp_var (TREE_TYPE (lhs), "var");
550 call_expr = build_call_vec (fn_type, fn, args);
551 call = gimple_build_call_from_tree (call_expr);
552 var = make_ssa_name (var, call);
553 gimple_call_set_lhs (call, var);
554 gsi_insert_before (gsi, call, GSI_SAME_STMT);
559 /* Copies at GSI all the scalar computations on which the ssa_name OP0
560 depends on in the SESE: these are all the scalar variables used in
561 the definition of OP0, that are defined outside BB and still in the
562 SESE, i.e. not a parameter of the SESE. The expression that is
563 returned contains only induction variables from the generated code:
564 MAP contains the induction variables renaming mapping, and is used
565 to translate the names of induction variables. */
568 expand_scalar_variables_ssa_name (tree type, tree op0, basic_block bb,
569 sese region, htab_t map,
570 gimple_stmt_iterator *gsi)
575 if (is_parameter (region, op0)
577 return fold_convert (type, get_rename (map, op0));
579 def_stmt = SSA_NAME_DEF_STMT (op0);
581 /* Check whether we already have a rename for OP0. */
582 new_op = get_rename (map, op0);
585 && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
586 return fold_convert (type, new_op);
588 if (gimple_bb (def_stmt) == bb)
590 /* If the defining statement is in the basic block already
591 we do not need to create a new expression for it, we
592 only need to ensure its operands are expanded. */
593 expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi);
594 return fold_convert (type, new_op);
598 if (!gimple_bb (def_stmt)
599 || !bb_in_sese_p (gimple_bb (def_stmt), region))
600 return fold_convert (type, new_op);
602 switch (gimple_code (def_stmt))
606 tree var0 = gimple_assign_rhs1 (def_stmt);
607 enum tree_code subcode = gimple_assign_rhs_code (def_stmt);
608 tree var1 = gimple_assign_rhs2 (def_stmt);
609 tree type = gimple_expr_type (def_stmt);
611 return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
616 return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
625 /* Copies at GSI all the scalar computations on which the expression
626 OP0 CODE OP1 depends on in the SESE: these are all the scalar
627 variables used in OP0 and OP1, defined outside BB and still defined
628 in the SESE, i.e. not a parameter of the SESE. The expression that
629 is returned contains only induction variables from the generated
630 code: MAP contains the induction variables renaming mapping, and is
631 used to translate the names of induction variables. */
634 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
635 tree op1, basic_block bb, sese region,
636 htab_t map, gimple_stmt_iterator *gsi)
638 if (TREE_CODE_CLASS (code) == tcc_constant
639 || TREE_CODE_CLASS (code) == tcc_declaration)
642 /* For data references we have to duplicate also its memory
644 if (TREE_CODE_CLASS (code) == tcc_reference)
651 tree op = TREE_OPERAND (op0, 0);
652 tree res = expand_scalar_variables_expr
653 (type, op, TREE_CODE (op), NULL, bb, region, map, gsi);
654 return build1 (code, type, res);
659 tree old_name = TREE_OPERAND (op0, 0);
660 tree expr = expand_scalar_variables_ssa_name
661 (type, old_name, bb, region, map, gsi);
663 if (TREE_CODE (expr) != SSA_NAME
664 && is_gimple_reg (old_name))
666 tree type = TREE_TYPE (old_name);
667 tree var = create_tmp_var (type, "var");
669 expr = build2 (MODIFY_EXPR, type, var, expr);
670 expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
671 true, GSI_SAME_STMT);
674 return fold_build1 (code, type, expr);
679 tree op00 = TREE_OPERAND (op0, 0);
680 tree op01 = TREE_OPERAND (op0, 1);
681 tree op02 = TREE_OPERAND (op0, 2);
682 tree op03 = TREE_OPERAND (op0, 3);
683 tree base = expand_scalar_variables_expr
684 (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region,
686 tree subscript = expand_scalar_variables_expr
687 (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region,
690 return build4 (ARRAY_REF, type, base, subscript, op02, op03);
697 /* The above cases should catch everything. */
702 if (TREE_CODE_CLASS (code) == tcc_unary)
704 tree op0_type = TREE_TYPE (op0);
705 enum tree_code op0_code = TREE_CODE (op0);
706 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
707 NULL, bb, region, map, gsi);
709 return fold_build1 (code, type, op0_expr);
712 if (TREE_CODE_CLASS (code) == tcc_binary
713 || TREE_CODE_CLASS (code) == tcc_comparison)
715 tree op0_type = TREE_TYPE (op0);
716 enum tree_code op0_code = TREE_CODE (op0);
717 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
718 NULL, bb, region, map, gsi);
719 tree op1_type = TREE_TYPE (op1);
720 enum tree_code op1_code = TREE_CODE (op1);
721 tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
722 NULL, bb, region, map, gsi);
724 return fold_build2 (code, type, op0_expr, op1_expr);
727 if (code == SSA_NAME)
728 return expand_scalar_variables_ssa_name (type, op0, bb, region, map, gsi);
730 if (code == ADDR_EXPR)
732 tree op00 = TREE_OPERAND (op0, 0);
734 if (handled_component_p (op00)
735 && TREE_CODE (op00) == ARRAY_REF)
737 tree e = expand_scalar_variables_expr (TREE_TYPE (op00), op00,
739 NULL, bb, region, map, gsi);
740 return fold_build1 (code, TREE_TYPE (op0), e);
750 /* Copies at the beginning of BB all the scalar computations on which
751 STMT depends on in the SESE: these are all the scalar variables used
752 in STMT, defined outside BB and still defined in the SESE, i.e. not a
753 parameter of the SESE. The expression that is returned contains
754 only induction variables from the generated code: MAP contains the
755 induction variables renaming mapping, and is used to translate the
756 names of induction variables. */
759 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
760 htab_t map, gimple_stmt_iterator *gsi)
765 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
767 tree use = USE_FROM_PTR (use_p);
768 tree type = TREE_TYPE (use);
769 enum tree_code code = TREE_CODE (use);
772 if (!is_gimple_reg (use))
775 /* Don't expand USE if we already have a rename for it. */
776 use_expr = get_rename (map, use);
780 use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
782 use_expr = fold_convert (type, use_expr);
787 if (is_gimple_debug (stmt))
789 if (gimple_debug_bind_p (stmt))
790 gimple_debug_bind_reset_value (stmt);
797 if (TREE_CODE (use_expr) != SSA_NAME)
799 tree var = create_tmp_var (type, "var");
801 use_expr = build2 (MODIFY_EXPR, type, var, use_expr);
802 use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL,
803 true, GSI_SAME_STMT);
806 replace_exp (use_p, use_expr);
812 /* Copies at the beginning of BB all the scalar computations on which
813 BB depends on in the SESE: these are all the scalar variables used
814 in BB, defined outside BB and still defined in the SESE, i.e. not a
815 parameter of the SESE. The expression that is returned contains
816 only induction variables from the generated code: MAP contains the
817 induction variables renaming mapping, and is used to translate the
818 names of induction variables. */
821 expand_scalar_variables (basic_block bb, sese region, htab_t map)
823 gimple_stmt_iterator gsi;
825 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
827 gimple stmt = gsi_stmt (gsi);
828 expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
833 /* Rename all the SSA_NAMEs from block BB according to the MAP. */
836 rename_variables (basic_block bb, htab_t map)
838 gimple_stmt_iterator gsi;
839 gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
841 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
842 rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi);
845 /* Remove condition from BB. */
848 remove_condition (basic_block bb)
850 gimple last = last_stmt (bb);
852 if (last && gimple_code (last) == GIMPLE_COND)
854 gimple_stmt_iterator gsi = gsi_last_bb (bb);
855 gsi_remove (&gsi, true);
859 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
862 get_true_edge_from_guard_bb (basic_block bb)
867 FOR_EACH_EDGE (e, ei, bb->succs)
868 if (e->flags & EDGE_TRUE_VALUE)
875 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */
878 get_false_edge_from_guard_bb (basic_block bb)
883 FOR_EACH_EDGE (e, ei, bb->succs)
884 if (!(e->flags & EDGE_TRUE_VALUE))
891 /* Returns true when NAME is defined in LOOP. */
894 name_defined_in_loop_p (tree name, loop_p loop)
896 return !SSA_NAME_IS_DEFAULT_DEF (name)
897 && gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father == loop;
900 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP. */
903 expr_defined_in_loop_p (tree expr, loop_p loop)
905 switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
908 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
909 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop)
910 || expr_defined_in_loop_p (TREE_OPERAND (expr, 2), loop);
913 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
914 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop);
917 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop);
920 return TREE_CODE (expr) == SSA_NAME
921 && name_defined_in_loop_p (expr, loop);
928 /* Returns the gimple statement that uses NAME outside the loop it is
929 defined in, returns NULL if there is no such loop close phi node.
930 An invariant of the loop closed SSA form is that the only use of a
931 variable, outside the loop it is defined in, is in the loop close
932 phi node that just follows the loop. */
935 alive_after_loop (tree name)
938 imm_use_iterator imm_iter;
939 loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father;
941 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
943 gimple stmt = USE_STMT (use_p);
945 if (gimple_code (stmt) == GIMPLE_PHI
946 && gimple_bb (stmt)->loop_father != loop)
953 /* Return true if a close phi has not yet been inserted for the use of
954 variable NAME on the single exit of LOOP. */
957 close_phi_not_yet_inserted_p (loop_p loop, tree name)
959 gimple_stmt_iterator psi;
960 basic_block bb = single_exit (loop)->dest;
962 for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
963 if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name)
969 /* A structure for passing parameters to add_loop_exit_phis. */
971 typedef struct alep {
973 VEC (rename_map_elt, heap) *new_renames;
976 /* Helper function for htab_traverse in insert_loop_close_phis. */
979 add_loop_exit_phis (void **slot, void *data)
981 struct rename_map_elt_s *entry;
984 tree expr, new_name, old_name;
985 bool def_in_loop_p, used_outside_p, need_close_phi_p;
986 gimple old_close_phi;
988 if (!slot || !*slot || !data)
991 entry = (struct rename_map_elt_s *) *slot;
994 new_name = expr = entry->expr;
995 old_name = entry->old_name;
997 def_in_loop_p = expr_defined_in_loop_p (expr, loop);
1001 /* Remove the old rename from the map when the expression is defined
1002 in the loop that we're closing. */
1006 if (TREE_CODE (expr) != SSA_NAME)
1009 old_close_phi = alive_after_loop (old_name);
1010 used_outside_p = (old_close_phi != NULL);
1011 need_close_phi_p = (used_outside_p
1012 && close_phi_not_yet_inserted_p (loop, new_name));
1014 /* Insert a loop close phi node. */
1015 if (need_close_phi_p)
1017 basic_block bb = single_exit (loop)->dest;
1018 gimple phi = create_phi_node (new_name, bb);
1019 tree new_res = create_new_def_for (gimple_phi_result (phi), phi,
1020 gimple_phi_result_ptr (phi));
1022 add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION);
1023 VEC_safe_push (rename_map_elt, heap, a->new_renames,
1024 new_rename_map_elt (gimple_phi_result (old_close_phi),
1031 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where
1032 NEW is defined in LOOP. Inserts on the exit of LOOP the close phi
1033 node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in
1034 the original code. Inserts in MAP the tuple (OLD_RES, RES). */
1037 insert_loop_close_phis (htab_t map, loop_p loop)
1044 a.new_renames = VEC_alloc (rename_map_elt, heap, 3);
1045 update_ssa (TODO_update_ssa);
1046 htab_traverse (map, add_loop_exit_phis, &a);
1047 update_ssa (TODO_update_ssa);
1049 for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1051 set_rename (map, elt->old_name, elt->expr);
1055 VEC_free (rename_map_elt, heap, a.new_renames);
1058 /* Helper structure for htab_traverse in insert_guard_phis. */
1062 edge true_edge, false_edge;
1063 htab_t before_guard;
1066 /* Return the default name that is before the guard. */
1069 default_before_guard (htab_t before_guard, tree old_name)
1071 tree res = get_rename (before_guard, old_name);
1073 if (res == old_name)
1075 if (is_gimple_reg (res))
1076 return fold_convert (TREE_TYPE (res), integer_zero_node);
1077 return gimple_default_def (cfun, SSA_NAME_VAR (res));
1083 /* Prepares EXPR to be a good phi argument when the phi result is
1084 RES. Insert needed statements on edge E. */
1087 convert_for_phi_arg (tree expr, tree res, edge e)
1089 tree type = TREE_TYPE (res);
1091 if (TREE_TYPE (expr) != type)
1092 expr = fold_convert (type, expr);
1094 if (TREE_CODE (expr) != SSA_NAME
1095 && !is_gimple_min_invariant (expr))
1097 tree var = create_tmp_var (type, "var");
1100 expr = build2 (MODIFY_EXPR, type, var, expr);
1101 expr = force_gimple_operand (expr, &stmts, true, NULL);
1102 gsi_insert_seq_on_edge_immediate (e, stmts);
1108 /* Helper function for htab_traverse in insert_guard_phis. */
1111 add_guard_exit_phis (void **slot, void *s)
1113 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
1114 struct igp *i = (struct igp *) s;
1115 basic_block bb = i->bb;
1116 edge true_edge = i->true_edge;
1117 edge false_edge = i->false_edge;
1118 tree res = entry->old_name;
1119 tree name1 = entry->expr;
1120 tree name2 = default_before_guard (i->before_guard, res);
1123 /* Nothing to be merged if the name before the guard is the same as
1128 name1 = convert_for_phi_arg (name1, res, true_edge);
1129 name2 = convert_for_phi_arg (name2, res, false_edge);
1131 phi = create_phi_node (res, bb);
1132 res = create_new_def_for (gimple_phi_result (phi), phi,
1133 gimple_phi_result_ptr (phi));
1135 add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1136 add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1143 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1).
1144 If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD,
1145 with NAME1 different than NAME2, then insert in BB the phi node:
1147 | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1149 if there is no tuple for OLD in BEFORE_GUARD, insert
1151 | RES = phi (NAME1 (on TRUE_EDGE),
1152 | DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1154 Finally register in RENAME_MAP the tuple (OLD, RES). */
1157 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1158 htab_t before_guard, htab_t rename_map)
1162 i.true_edge = true_edge;
1163 i.false_edge = false_edge;
1164 i.before_guard = before_guard;
1166 update_ssa (TODO_update_ssa);
1167 htab_traverse (rename_map, add_guard_exit_phis, &i);
1168 update_ssa (TODO_update_ssa);
1171 /* Create a duplicate of the basic block BB. NOTE: This does not
1172 preserve SSA form. */
1175 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1177 gimple_stmt_iterator gsi, gsi_tgt;
1179 gsi_tgt = gsi_start_bb (new_bb);
1180 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1182 def_operand_p def_p;
1183 ssa_op_iter op_iter;
1184 gimple stmt = gsi_stmt (gsi);
1187 if (gimple_code (stmt) == GIMPLE_LABEL)
1190 /* Create a new copy of STMT and duplicate STMT's virtual
1192 copy = gimple_copy (stmt);
1193 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
1194 mark_sym_for_renaming (gimple_vop (cfun));
1196 maybe_duplicate_eh_stmt (copy, stmt);
1197 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1199 /* Create new names for all the definitions created by COPY and
1200 add replacement mappings for each new name. */
1201 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
1203 tree old_name = DEF_FROM_PTR (def_p);
1204 tree new_name = create_new_def_for (old_name, copy, def_p);
1205 set_rename (map, old_name, new_name);
1210 /* Copies BB and includes in the copied BB all the statements that can
1211 be reached following the use-def chains from the memory accesses,
1212 and returns the next edge following this new block. */
1215 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1216 edge next_e, htab_t map)
1218 basic_block new_bb = split_edge (next_e);
1220 next_e = single_succ_edge (new_bb);
1221 graphite_copy_stmts_from_block (bb, new_bb, map);
1222 remove_condition (new_bb);
1223 remove_phi_nodes (new_bb);
1224 expand_scalar_variables (new_bb, region, map);
1225 rename_variables (new_bb, map);
1230 /* Returns the outermost loop in SCOP that contains BB. */
1233 outermost_loop_in_sese (sese region, basic_block bb)
1237 nest = bb->loop_father;
1238 while (loop_outer (nest)
1239 && loop_in_sese_p (loop_outer (nest), region))
1240 nest = loop_outer (nest);
1245 /* Sets the false region of an IF_REGION to REGION. */
1248 if_region_set_false_region (ifsese if_region, sese region)
1250 basic_block condition = if_region_get_condition_block (if_region);
1251 edge false_edge = get_false_edge_from_guard_bb (condition);
1252 basic_block dummy = false_edge->dest;
1253 edge entry_region = SESE_ENTRY (region);
1254 edge exit_region = SESE_EXIT (region);
1255 basic_block before_region = entry_region->src;
1256 basic_block last_in_region = exit_region->src;
1257 void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
1258 htab_hash_pointer (exit_region),
1261 entry_region->flags = false_edge->flags;
1262 false_edge->flags = exit_region->flags;
1264 redirect_edge_pred (entry_region, condition);
1265 redirect_edge_pred (exit_region, before_region);
1266 redirect_edge_pred (false_edge, last_in_region);
1267 redirect_edge_succ (false_edge, single_succ (dummy));
1268 delete_basic_block (dummy);
1270 exit_region->flags = EDGE_FALLTHRU;
1271 recompute_all_dominators ();
1273 SESE_EXIT (region) = false_edge;
1275 if (if_region->false_region)
1276 free (if_region->false_region);
1277 if_region->false_region = region;
1281 struct loop_exit *loop_exit = ggc_alloc_cleared_loop_exit ();
1283 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1284 htab_clear_slot (current_loops->exits, slot);
1286 slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
1287 htab_hash_pointer (false_edge),
1289 loop_exit->e = false_edge;
1291 false_edge->src->loop_father->exits->next = loop_exit;
1295 /* Creates an IFSESE with CONDITION on edge ENTRY. */
1298 create_if_region_on_edge (edge entry, tree condition)
1302 sese sese_region = XNEW (struct sese_s);
1303 sese true_region = XNEW (struct sese_s);
1304 sese false_region = XNEW (struct sese_s);
1305 ifsese if_region = XNEW (struct ifsese_s);
1306 edge exit = create_empty_if_region_on_edge (entry, condition);
1308 if_region->region = sese_region;
1309 if_region->region->entry = entry;
1310 if_region->region->exit = exit;
1312 FOR_EACH_EDGE (e, ei, entry->dest->succs)
1314 if (e->flags & EDGE_TRUE_VALUE)
1316 true_region->entry = e;
1317 true_region->exit = single_succ_edge (e->dest);
1318 if_region->true_region = true_region;
1320 else if (e->flags & EDGE_FALSE_VALUE)
1322 false_region->entry = e;
1323 false_region->exit = single_succ_edge (e->dest);
1324 if_region->false_region = false_region;
1331 /* Moves REGION in a condition expression:
1339 move_sese_in_condition (sese region)
1341 basic_block pred_block = split_edge (SESE_ENTRY (region));
1344 SESE_ENTRY (region) = single_succ_edge (pred_block);
1345 if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
1346 if_region_set_false_region (if_region, region);
1351 /* Replaces the condition of the IF_REGION with CONDITION:
1359 set_ifsese_condition (ifsese if_region, tree condition)
1361 sese region = if_region->region;
1362 edge entry = region->entry;
1363 basic_block bb = entry->dest;
1364 gimple last = last_stmt (bb);
1365 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1368 gcc_assert (gimple_code (last) == GIMPLE_COND);
1370 gsi_remove (&gsi, true);
1371 gsi = gsi_last_bb (bb);
1372 condition = force_gimple_operand_gsi (&gsi, condition, true, NULL,
1373 false, GSI_NEW_STMT);
1374 cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE);
1375 gsi = gsi_last_bb (bb);
1376 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
1379 /* Returns the scalar evolution of T in REGION. Every variable that
1380 is not defined in the REGION is considered a parameter. */
1383 scalar_evolution_in_region (sese region, loop_p loop, tree t)
1386 struct loop *def_loop;
1387 basic_block before = block_before_sese (region);
1389 if (TREE_CODE (t) != SSA_NAME
1390 || loop_in_sese_p (loop, region))
1391 return instantiate_scev (before, loop,
1392 analyze_scalar_evolution (loop, t));
1394 if (!defined_in_sese_p (t, region))
1397 def = SSA_NAME_DEF_STMT (t);
1398 def_loop = loop_containing_stmt (def);
1400 if (loop_in_sese_p (def_loop, region))
1402 t = analyze_scalar_evolution (def_loop, t);
1403 def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
1404 t = compute_overall_effect_of_inner_loop (def_loop, t);
1408 return instantiate_scev (before, loop, t);