summaryrefslogtreecommitdiff
path: root/gcc/graphite-scop-detection.c
diff options
context:
space:
mode:
authorAditya Kumar <aditya.k7@samsung.com>2015-10-07 15:40:17 +0000
committerSebastian Pop <spop@gcc.gnu.org>2015-10-07 15:40:17 +0000
commitbafcb15301475db9d9e73a73c41bda4082c276e9 (patch)
tree52d9f99e1a45ff8db4eea5f4b72274f513275471 /gcc/graphite-scop-detection.c
parentb850dd2f0b0c10067114eb0320b167be2ac87d6c (diff)
downloadgcc-bafcb15301475db9d9e73a73c41bda4082c276e9.tar.gz
move graphite bookkeeping from sese to sese_info
2015-10-06 Aditya Kumar <aditya.k7@samsung.com> Sebastian Pop <s.pop@samsung.com> * graphite-isl-ast-to-gimple.c (translate_isl_ast_to_gimple): Use an sese_info_p. (copy_def): Same. (copy_internal_parameters): Same. (translate_isl_ast_to_gimple): Use an sese_l. (build_iv_mapping): Same. * graphite-poly.c (new_sese): Rename new_sese_info. (free_sese): Rename free_sese_info. * graphite-poly.h (struct scop): Use an sese_info_p. (scop_set_region): Same. * graphite-scop-detection.c (struct sese_l): Moved... (get_entry_bb): Moved... (get_exit_bb): Moved... (parameter_index_in_region_1): Use an sese_info_p. (parameter_index_in_region): Same. (scan_tree_for_params): Same. (find_params_in_bb): Same. (sese_dom_walker): Use an sese_l. * graphite-sese-to-poly.c (remove_invariant_phi): Same. (reduction_phi_p): Same. (parameter_index_in_region_1): Use an sese_info_p. (propagate_expr_outside_region): Use an sese_l. * graphite.c: Replace uses of SCOP_REGION. * sese.c (sese_record_loop): Use an sese_info_p. (build_sese_loop_nests): Same. (sese_build_liveouts_use): Same. (sese_build_liveouts_bb): Same. (sese_build_liveouts_bb): Same. (sese_bad_liveouts_use): Same. (sese_reset_debug_liveouts_bb): Same. (sese_build_liveouts): Same. (new_sese): Renamed new_sese_info. (free_sese): Renamed free_sese_info. (set_rename): Use an sese_info_p. (graphite_copy_stmts_from_block): Same. (copy_bb_and_scalar_dependences): Same. (outermost_loop_in_sese_1): Use an sese_l. (outermost_loop_in_sese): Same. (if_region_set_false_region): Use an sese_info_p. (move_sese_in_condition): Same. (scalar_evolution_in_region): Use an sese_l. * sese.h (struct sese_l): ... here. (SESE_ENTRY): Remove. (SESE_ENTRY_BB): Remove. (SESE_EXIT): Remove. (SESE_EXIT_BB): Remove. (sese_contains_loop): Use an sese_info_p. (sese_nb_params): Same. (bb_in_sese_p): Use an sese_l. (stmt_in_sese_p): Same. (defined_in_sese_p): Same. (loop_in_sese_p): Same. (sese_loop_depth): Same. (struct ifsese_s): Use an sese_info_p. (gbb_loop_at_index): Use an sese_l. (nb_common_loops): Same. (scev_analyzable_p): Same. Co-Authored-By: Sebastian Pop <s.pop@samsung.com> From-SVN: r228572
Diffstat (limited to 'gcc/graphite-scop-detection.c')
-rw-r--r--gcc/graphite-scop-detection.c134
1 files changed, 47 insertions, 87 deletions
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index 4b04315e8a0..7e5039cb3a6 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);