diff options
author | Richard Biener <rguenther@suse.de> | 2017-09-22 07:31:32 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-09-22 07:31:32 +0000 |
commit | ab0e5308484abccb6c21d3a6593ab653a02784a2 (patch) | |
tree | 021bf36f1ccc132d37c48e39b7cde0e5b57beba2 /gcc/graphite-scop-detection.c | |
parent | e7ba6a6041df85d7027a4e776f144a2f21204fdf (diff) |
graphite-isl-ast-to-gimple.c (translate_pending_phi_nodes): Verify both BBs contain loop PHI nodes before dispatching to copy_loop_phi_args.
2017-09-21 Richard Biener <rguenther@suse.de>
* graphite-isl-ast-to-gimple.c (translate_pending_phi_nodes):
Verify both BBs contain loop PHI nodes before dispatching to
copy_loop_phi_args.
(graphite_regenerate_ast_isl): Do not recompute dominators,
do not verify three times. Restructure for clarity.
* graphite-scop-detection.c (same_close_phi_node,
remove_duplicate_close_phi, make_close_phi_nodes_unique,
defined_in_loop_p, canonicalize_loop_closed_ssa,
canonicalize_loop_closed_ssa_form): Simplify, remove excess
checking and SSA rewrite, move to ...
* graphite.c: ... here. Include ssa.h and tree-ssa-loop-manip.h.
(graphite_initialize): Do not pass in ctx, do not reset the
SCEV cache, compute only dominators.
(graphite_transform_loops): Allocate ISL ctx after
graphite_initialize. Call canonicalize_loop_closed_ssa_form.
Maintain post-dominators only around build_scops.
* sese.c (if_region_set_false_region): Make static. Free
and recompute dominators.
(move_sese_in_condition): Assert we don't get called with
post-dominators computed.
* sese.h (if_region_set_false_region): Remove.
From-SVN: r253090
Diffstat (limited to 'gcc/graphite-scop-detection.c')
-rw-r--r-- | gcc/graphite-scop-detection.c | 183 |
1 files changed, 0 insertions, 183 deletions
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 68e86ec7967..594cf89c090 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -268,187 +268,6 @@ trivially_empty_bb_p (basic_block bb) return true; } -/* Returns true when P1 and P2 are close phis with the same - argument. */ - -static inline bool -same_close_phi_node (gphi *p1, gphi *p2) -{ - return (types_compatible_p (TREE_TYPE (gimple_phi_result (p1)), - TREE_TYPE (gimple_phi_result (p2))) - && operand_equal_p (gimple_phi_arg_def (p1, 0), - gimple_phi_arg_def (p2, 0), 0)); -} - -static void make_close_phi_nodes_unique (basic_block bb); - -/* Remove the close phi node at GSI and replace its rhs with the rhs - of PHI. */ - -static void -remove_duplicate_close_phi (gphi *phi, gphi_iterator *gsi) -{ - gimple *use_stmt; - use_operand_p use_p; - imm_use_iterator imm_iter; - tree res = gimple_phi_result (phi); - tree def = gimple_phi_result (gsi->phi ()); - - gcc_assert (same_close_phi_node (phi, gsi->phi ())); - - FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def) - { - FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) - SET_USE (use_p, res); - - update_stmt (use_stmt); - - /* It is possible that we just created a duplicate close-phi - for an already-processed containing loop. Check for this - case and clean it up. */ - if (gimple_code (use_stmt) == GIMPLE_PHI - && gimple_phi_num_args (use_stmt) == 1) - make_close_phi_nodes_unique (gimple_bb (use_stmt)); - } - - remove_phi_node (gsi, true); -} - -/* Removes all the close phi duplicates from BB. */ - -static void -make_close_phi_nodes_unique (basic_block bb) -{ - gphi_iterator psi; - - for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi)) - { - gphi_iterator gsi = psi; - gphi *phi = psi.phi (); - - /* At this point, PHI should be a close phi in normal form. */ - gcc_assert (gimple_phi_num_args (phi) == 1); - - /* Iterate over the next phis and remove duplicates. */ - gsi_next (&gsi); - while (!gsi_end_p (gsi)) - if (same_close_phi_node (phi, gsi.phi ())) - remove_duplicate_close_phi (phi, &gsi); - else - gsi_next (&gsi); - } -} - -/* Return true when NAME is defined in LOOP. */ - -static bool -defined_in_loop_p (tree name, loop_p loop) -{ - gcc_assert (TREE_CODE (name) == SSA_NAME); - return loop == loop_containing_stmt (SSA_NAME_DEF_STMT (name)); -} - -/* Transforms LOOP to the canonical loop closed SSA form. */ - -static void -canonicalize_loop_closed_ssa (loop_p loop) -{ - edge e = single_exit (loop); - basic_block bb; - - if (!e || (e->flags & EDGE_COMPLEX)) - return; - - bb = e->dest; - - if (single_pred_p (bb)) - { - e = split_block_after_labels (bb); - DEBUG_PRINT (dp << "Splitting bb_" << bb->index << ".\n"); - make_close_phi_nodes_unique (e->src); - } - else - { - gphi_iterator psi; - basic_block close = split_edge (e); - - e = single_succ_edge (close); - DEBUG_PRINT (dp << "Splitting edge (" << e->src->index << "," - << e->dest->index << ")\n"); - - for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi)) - { - gphi *phi = psi.phi (); - unsigned i; - - for (i = 0; i < gimple_phi_num_args (phi); i++) - if (gimple_phi_arg_edge (phi, i) == e) - { - tree res, arg = gimple_phi_arg_def (phi, i); - use_operand_p use_p; - gphi *close_phi; - - /* Only add close phi nodes for SSA_NAMEs defined in LOOP. */ - if (TREE_CODE (arg) != SSA_NAME - || !defined_in_loop_p (arg, loop)) - continue; - - close_phi = create_phi_node (NULL_TREE, close); - res = create_new_def_for (arg, close_phi, - gimple_phi_result_ptr (close_phi)); - add_phi_arg (close_phi, arg, - gimple_phi_arg_edge (close_phi, 0), - UNKNOWN_LOCATION); - use_p = gimple_phi_arg_imm_use_ptr (phi, i); - replace_exp (use_p, res); - update_stmt (phi); - } - } - - make_close_phi_nodes_unique (close); - } - - /* The code above does not properly handle changes in the post dominance - information (yet). */ - recompute_all_dominators (); -} - -/* Converts the current loop closed SSA form to a canonical form - expected by the Graphite code generation. - - The loop closed SSA form has the following invariant: a variable - defined in a loop that is used outside the loop appears only in the - phi nodes in the destination of the loop exit. These phi nodes are - called close phi nodes. - - The canonical loop closed SSA form contains the extra invariants: - - - when the loop contains only one exit, the close phi nodes contain - only one argument. That implies that the basic block that contains - the close phi nodes has only one predecessor, that is a basic block - in the loop. - - - the basic block containing the close phi nodes does not contain - other statements. - - - there exist only one phi node per definition in the loop. -*/ - -static void -canonicalize_loop_closed_ssa_form (void) -{ - checking_verify_loop_closed_ssa (true); - - loop_p loop; - FOR_EACH_LOOP (loop, 0) - canonicalize_loop_closed_ssa (loop); - - rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa); - update_ssa (TODO_update_ssa); - - checking_verify_loop_closed_ssa (true); -} - /* Can all ivs be represented by a signed integer? As isl might generate negative values in its expressions, signed loop ivs are required in the backend. */ @@ -2038,8 +1857,6 @@ build_scops (vec<scop_p> *scops) if (dump_file) dp.set_dump_file (dump_file); - canonicalize_loop_closed_ssa_form (); - /* ??? We walk the loop tree assuming loop->next is ordered. This is not so but we'd be free to order it here. */ scop_detection sb; |