diff options
Diffstat (limited to 'gcc/graphite-scop-detection.c')
-rw-r--r-- | gcc/graphite-scop-detection.c | 134 |
1 files changed, 47 insertions, 87 deletions
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 4b04315..7e5039c 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -56,42 +56,6 @@ along with GCC; see the file COPYING3. If not see #include "graphite-scop-detection.h" #include "gimple-pretty-print.h" -/* Lightweight representation of sese for scop detection. - TODO: Make all this as a constant_edge. */ -struct sese_l -{ - sese_l (edge e, edge x) : entry (e), exit (x) {} - - /* This is to push objects of sese_l in a vec. */ - sese_l (int i) : entry (NULL), exit (NULL) { gcc_assert (i == 0); } - - operator bool () const { return entry && exit; } - - const sese_l & - operator= (const sese_l &s) - { - entry = s.entry; - exit = s.exit; - return *this; - } - - edge entry; - edge exit; -}; - -/* APIs for getting entry/exit of an sese. */ -static basic_block -get_entry_bb (edge e) -{ - return e->dest; -} - -static basic_block -get_exit_bb (edge e) -{ - return e->src; -} - class debug_printer { private: @@ -684,16 +648,16 @@ scop_detection::merge_sese (sese_l first, sese_l second) const /* Find the common dominators for entry, and common post-dominators for the exit. */ basic_block dom = nearest_common_dominator (CDI_DOMINATORS, - get_entry_bb (first.entry), - get_entry_bb (second.entry)); + get_entry_bb (first), + get_entry_bb (second)); edge entry = get_nearest_dom_with_single_entry (dom); if (!entry) return invalid_sese; basic_block pdom = nearest_common_dominator (CDI_POST_DOMINATORS, - get_exit_bb (first.exit), - get_exit_bb (second.exit)); + get_exit_bb (first), + get_exit_bb (second)); pdom = nearest_common_dominator (CDI_POST_DOMINATORS, dom, pdom); edge exit = get_nearest_pdom_with_single_exit (pdom); @@ -713,10 +677,10 @@ scop_detection::merge_sese (sese_l first, sese_l second) const /* For now we just want to bail out when exit does not post-dominate entry. TODO: We might just add a basic_block at the exit to make exit post-dominate entry (the entire region). */ - if (!dominated_by_p (CDI_POST_DOMINATORS, get_entry_bb (entry), - get_exit_bb (exit)) - || !dominated_by_p (CDI_DOMINATORS, get_exit_bb (exit), - get_entry_bb (entry))) + if (!dominated_by_p (CDI_POST_DOMINATORS, get_entry_bb (combined), + get_exit_bb (combined)) + || !dominated_by_p (CDI_DOMINATORS, get_exit_bb (combined), + get_entry_bb (combined))) { DEBUG_PRINT (dp << "[scop-detection-fail] cannot merge seses.\n"); return invalid_sese; @@ -725,7 +689,7 @@ scop_detection::merge_sese (sese_l first, sese_l second) const /* FIXME: We should remove this piece of code once canonicalize_loop_closed_ssa has been removed, because that function adds a BB with single exit. */ - if (!trivially_empty_bb_p (get_exit_bb (combined.exit))) + if (!trivially_empty_bb_p (get_exit_bb (combined))) { /* Find the first empty succ (with single exit) of combined.exit. */ basic_block imm_succ = combined.exit->dest; @@ -897,7 +861,7 @@ scop_detection::add_scop (sese_l s) return; } - if (get_exit_bb (s.exit) == EXIT_BLOCK_PTR_FOR_FN (cfun)) + if (get_exit_bb (s) == EXIT_BLOCK_PTR_FOR_FN (cfun)) { DEBUG_PRINT (dp << "\n[scop-detection-fail] " << "Discarding SCoP exiting to return"; @@ -923,8 +887,8 @@ scop_detection::add_scop (sese_l s) bool scop_detection::harmful_stmt_in_region (sese_l scop) const { - basic_block exit_bb = get_exit_bb (scop.exit); - basic_block entry_bb = get_entry_bb (scop.entry); + basic_block exit_bb = get_exit_bb (scop); + basic_block entry_bb = get_entry_bb (scop); DEBUG_PRINT (dp << "\n[checking-harmful-bbs] "; print_sese (dump_file, scop)); @@ -958,10 +922,10 @@ scop_detection::harmful_stmt_in_region (sese_l scop) const bool scop_detection::subsumes (sese_l s1, sese_l s2) { - if (dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2.entry), - get_entry_bb (s1.entry)) - && dominated_by_p (CDI_POST_DOMINATORS, get_entry_bb (s2.exit), - get_entry_bb (s1.exit))) + if (dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2), + get_entry_bb (s1)) + && dominated_by_p (CDI_POST_DOMINATORS, s2.exit->dest, + s1.exit->dest)) return true; return false; } @@ -989,10 +953,10 @@ scop_detection::remove_subscops (sese_l s1) bool scop_detection::intersects (sese_l s1, sese_l s2) { - if (dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2.entry), - get_entry_bb (s1.entry)) - && !dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2.entry), - get_exit_bb (s1.exit))) + if (dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2), + get_entry_bb (s1)) + && !dominated_by_p (CDI_DOMINATORS, get_entry_bb (s2), + get_exit_bb (s1))) return true; if ((s1.exit == s2.entry) || (s2.exit == s1.entry)) return true; @@ -1137,9 +1101,7 @@ bool scop_detection::graphite_can_represent_expr (sese_l scop, loop_p loop, tree expr) { - sese region = new_sese (scop.entry, scop.exit); - tree scev = scalar_evolution_in_region (region, loop, expr); - free_sese (region); + tree scev = scalar_evolution_in_region (scop, loop, expr); return graphite_can_represent_scev (scev); } @@ -1149,8 +1111,7 @@ scop_detection::graphite_can_represent_expr (sese_l scop, loop_p loop, bool scop_detection::stmt_has_simple_data_refs_p (sese_l scop, gimple *stmt) { - sese region = new_sese (scop.entry, scop.exit); - loop_p nest = outermost_loop_in_sese (region, gimple_bb (stmt)); + loop_p nest = outermost_loop_in_sese (scop, gimple_bb (stmt)); loop_p loop = loop_containing_stmt (stmt); vec<data_reference_p> drs = vNULL; @@ -1359,9 +1320,9 @@ dot_all_scops_1 (FILE *file, vec<scop_p> scops) /* Select color for SCoP. */ FOR_EACH_VEC_ELT (scops, i, scop) { - sese region = SCOP_REGION (scop); - if (bb_in_sese_p (bb, region) || (SESE_EXIT_BB (region) == bb) - || (SESE_ENTRY_BB (region) == bb)) + sese_l region = scop->region->region; + if (bb_in_sese_p (bb, region) || (region.exit->dest == bb) + || (region.entry->dest == bb)) { switch (i % 17) { @@ -1426,11 +1387,11 @@ dot_all_scops_1 (FILE *file, vec<scop_p> scops) if (!bb_in_sese_p (bb, region)) fprintf (file, " ("); - if (bb == SESE_ENTRY_BB (region) && bb == SESE_EXIT_BB (region)) + if (bb == region.entry->dest && bb == region.exit->dest) fprintf (file, " %d*# ", bb->index); - else if (bb == SESE_ENTRY_BB (region)) + else if (bb == region.entry->dest) fprintf (file, " %d* ", bb->index); - else if (bb == SESE_EXIT_BB (region)) + else if (bb == region.exit->dest) fprintf (file, " %d# ", bb->index); else fprintf (file, " %d ", bb->index); @@ -1566,7 +1527,7 @@ scop_detection::try_generate_gimple_bb (scop_p scop, basic_block bb) { vec<data_reference_p> drs; drs.create (5); - sese region = SCOP_REGION (scop); + sese_l region = scop->region->region; loop_p nest = outermost_loop_in_sese (region, bb); loop_p loop = bb->loop_father; @@ -1609,9 +1570,8 @@ scop_detection::all_non_dominated_preds_marked_p (basic_block bb, sbitmap map) void scop_detection::build_scop_bbs_1 (scop_p scop, sbitmap visited, basic_block bb) { - sese region = SCOP_REGION (scop); - - if (bitmap_bit_p (visited, bb->index) || !bb_in_sese_p (bb, region)) + if (bitmap_bit_p (visited, bb->index) + || !bb_in_sese_p (bb, scop->region->region)) return; poly_bb_p pbb = new_poly_bb (scop, try_generate_gimple_bb (scop, bb)); @@ -1648,10 +1608,10 @@ void scop_detection::build_scop_bbs (scop_p scop) { sbitmap visited = sbitmap_alloc (last_basic_block_for_fn (cfun)); - sese region = SCOP_REGION (scop); + sese_l region = scop->region->region; bitmap_clear (visited); - build_scop_bbs_1 (scop, visited, SESE_ENTRY_BB (region)); + build_scop_bbs_1 (scop, visited, region.entry->dest); sbitmap_free (visited); } @@ -1665,7 +1625,7 @@ scop_detection::nb_pbbs_in_loops (scop_p scop) int res = 0; FOR_EACH_VEC_ELT (SCOP_BBS (scop), i, pbb) - if (loop_in_sese_p (gbb_loop (PBB_BLACK_BOX (pbb)), SCOP_REGION (scop))) + if (loop_in_sese_p (gbb_loop (PBB_BLACK_BOX (pbb)), scop->region->region)) res++; return res; @@ -1675,7 +1635,7 @@ scop_detection::nb_pbbs_in_loops (scop_p scop) Otherwise returns -1. */ static inline int -parameter_index_in_region_1 (tree name, sese region) +parameter_index_in_region_1 (tree name, sese_info_p region) { int i; tree p; @@ -1694,7 +1654,7 @@ parameter_index_in_region_1 (tree name, sese region) and returns the index of NAME. */ static int -parameter_index_in_region (tree name, sese region) +parameter_index_in_region (tree name, sese_info_p region) { int i; @@ -1704,7 +1664,7 @@ parameter_index_in_region (tree name, sese region) if (TREE_CODE (TREE_TYPE (name)) != INTEGER_TYPE) return -1; - if (!invariant_in_sese_p_rec (name, region)) + if (!invariant_in_sese_p_rec (name, region->region)) return -1; i = parameter_index_in_region_1 (name, region); @@ -1724,7 +1684,7 @@ parameter_index_in_region (tree name, sese region) parameters. */ static void -scan_tree_for_params (sese s, tree e) +scan_tree_for_params (sese_info_p s, tree e) { if (e == chrec_dont_know) return; @@ -1777,7 +1737,7 @@ scan_tree_for_params (sese s, tree e) access functions, conditions and loop bounds. */ static void -find_params_in_bb (sese region, gimple_poly_bb_p gbb) +find_params_in_bb (sese_info_p region, gimple_poly_bb_p gbb) { /* Find parameters in the access functions of data references. */ int i; @@ -1791,9 +1751,9 @@ find_params_in_bb (sese region, gimple_poly_bb_p gbb) loop_p loop = GBB_BB (gbb)->loop_father; FOR_EACH_VEC_ELT (GBB_CONDITIONS (gbb), i, stmt) { - tree lhs = scalar_evolution_in_region (region, loop, + tree lhs = scalar_evolution_in_region (region->region, loop, gimple_cond_lhs (stmt)); - tree rhs = scalar_evolution_in_region (region, loop, + tree rhs = scalar_evolution_in_region (region->region, loop, gimple_cond_rhs (stmt)); scan_tree_for_params (region, lhs); @@ -1808,7 +1768,7 @@ static void find_scop_parameters (scop_p scop) { unsigned i; - sese region = SCOP_REGION (scop); + sese_info_p region = scop->region; struct loop *loop; /* Find the parameters used in the loop bounds. */ @@ -1819,7 +1779,7 @@ find_scop_parameters (scop_p scop) if (!chrec_contains_symbols (nb_iters)) continue; - nb_iters = scalar_evolution_in_region (region, loop, nb_iters); + nb_iters = scalar_evolution_in_region (region->region, loop, nb_iters); scan_tree_for_params (region, nb_iters); } @@ -1836,17 +1796,17 @@ find_scop_parameters (scop_p scop) class sese_dom_walker : public dom_walker { public: - sese_dom_walker (cdi_direction, sese); + sese_dom_walker (cdi_direction, sese_l); virtual void before_dom_children (basic_block); virtual void after_dom_children (basic_block); private: auto_vec<gimple *, 3> m_conditions, m_cases; - sese m_region; + sese_l m_region; }; } -sese_dom_walker::sese_dom_walker (cdi_direction direction, sese region) +sese_dom_walker::sese_dom_walker (cdi_direction direction, sese_l region) : dom_walker (direction), m_region (region) { } @@ -1936,7 +1896,7 @@ build_scops (vec<scop_p> *scops) build_sese_loop_nests (scop->region); /* Record all conditions in REGION. */ - sese_dom_walker (CDI_DOMINATORS, scop->region).walk + sese_dom_walker (CDI_DOMINATORS, scop->region->region).walk (cfun->cfg->x_entry_block_ptr); find_scop_parameters (scop); |