Commit 30c4440c by Richard Biener Committed by Richard Biener

2017-10-18 Richard Biener <rguenther@suse.de>

	* graphite-isl-ast-to-gimple.c
	(translate_isl_ast_to_gimple::set_rename): Simplify.
	(translate_isl_ast_to_gimple::set_rename_for_each_def): Inline...
	(graphite_copy_stmts_from_block): ... here.
	(copy_bb_and_scalar_dependences): Simplify.
	(add_parameters_to_ivs_params): Canonicalize.
	(generate_entry_out_of_ssa_copies): Simplify.
	* graphite-sese-to-poly.c (extract_affine_name): Simplify
	by passing in ISL dimension.
	(parameter_index_in_region_1): Rename to ...
	(parameter_index_in_region): ... this.
	(extract_affine): Adjust assert, pass down parameter index.
	(add_param_constraints): Use range-info when available.
	(build_scop_context): Adjust.
	* sese.c (new_sese_info): Adjust.
	(free_sese_info): Likewise.
	* sese.h (bb_map_t, rename_map_t, phi_rename, init_back_edge_pair_t):
	Remove unused typedefs.
	(struct sese_info_t): Simplify rename_map, remove incomplete_phis.

From-SVN: r253855
parent 28e2e236
2017-10-18 Richard Biener <rguenther@suse.de>
* graphite-isl-ast-to-gimple.c
(translate_isl_ast_to_gimple::set_rename): Simplify.
(translate_isl_ast_to_gimple::set_rename_for_each_def): Inline...
(graphite_copy_stmts_from_block): ... here.
(copy_bb_and_scalar_dependences): Simplify.
(add_parameters_to_ivs_params): Canonicalize.
(generate_entry_out_of_ssa_copies): Simplify.
* graphite-sese-to-poly.c (extract_affine_name): Simplify
by passing in ISL dimension.
(parameter_index_in_region_1): Rename to ...
(parameter_index_in_region): ... this.
(extract_affine): Adjust assert, pass down parameter index.
(add_param_constraints): Use range-info when available.
(build_scop_context): Adjust.
* sese.c (new_sese_info): Adjust.
(free_sese_info): Likewise.
* sese.h (bb_map_t, rename_map_t, phi_rename, init_back_edge_pair_t):
Remove unused typedefs.
(struct sese_info_t): Simplify rename_map, remove incomplete_phis.
2017-10-18 Martin Liska <mliska@suse.cz> 2017-10-18 Martin Liska <mliska@suse.cz>
* combine.c (simplify_compare_const): Add gcc_fallthrough. * combine.c (simplify_compare_const): Add gcc_fallthrough.
...@@ -195,7 +195,6 @@ class translate_isl_ast_to_gimple ...@@ -195,7 +195,6 @@ class translate_isl_ast_to_gimple
edge copy_bb_and_scalar_dependences (basic_block bb, edge next_e, edge copy_bb_and_scalar_dependences (basic_block bb, edge next_e,
vec<tree> iv_map); vec<tree> iv_map);
void set_rename (tree old_name, tree expr); void set_rename (tree old_name, tree expr);
void set_rename_for_each_def (gimple *stmt);
void gsi_insert_earliest (gimple_seq seq); void gsi_insert_earliest (gimple_seq seq);
bool codegen_error_p () const { return codegen_error; } bool codegen_error_p () const { return codegen_error; }
...@@ -932,25 +931,12 @@ set_rename (tree old_name, tree expr) ...@@ -932,25 +931,12 @@ set_rename (tree old_name, tree expr)
{ {
fprintf (dump_file, "[codegen] setting rename: old_name = "); fprintf (dump_file, "[codegen] setting rename: old_name = ");
print_generic_expr (dump_file, old_name); print_generic_expr (dump_file, old_name);
fprintf (dump_file, ", new_name = "); fprintf (dump_file, ", new decl = ");
print_generic_expr (dump_file, expr); print_generic_expr (dump_file, expr);
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
bool res = region->rename_map->put (old_name, expr);
if (old_name == expr) gcc_assert (! res);
return;
vec <tree> *renames = region->rename_map->get (old_name);
if (renames)
renames->safe_push (expr);
else
{
vec<tree> r;
r.create (2);
r.safe_push (expr);
region->rename_map->put (old_name, r);
}
} }
/* Return an iterator to the instructions comes last in the execution order. /* Return an iterator to the instructions comes last in the execution order.
...@@ -1132,21 +1118,6 @@ should_copy_to_new_region (gimple *stmt, sese_info_p region) ...@@ -1132,21 +1118,6 @@ should_copy_to_new_region (gimple *stmt, sese_info_p region)
return true; return true;
} }
/* Create new names for all the definitions created by COPY and add replacement
mappings for each new name. */
void translate_isl_ast_to_gimple::
set_rename_for_each_def (gimple *stmt)
{
def_operand_p def_p;
ssa_op_iter op_iter;
FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, op_iter, SSA_OP_ALL_DEFS)
{
tree old_name = DEF_FROM_PTR (def_p);
create_new_def_for (old_name, stmt, def_p);
}
}
/* Duplicates the statements of basic block BB into basic block NEW_BB /* Duplicates the statements of basic block BB into basic block NEW_BB
and compute the new induction variables according to the IV_MAP. */ and compute the new induction variables according to the IV_MAP. */
...@@ -1192,7 +1163,13 @@ graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, ...@@ -1192,7 +1163,13 @@ graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb,
gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt); gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
/* Crete new names for each def in the copied stmt. */ /* Crete new names for each def in the copied stmt. */
set_rename_for_each_def (copy); def_operand_p def_p;
ssa_op_iter op_iter;
FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
{
tree old_name = DEF_FROM_PTR (def_p);
create_new_def_for (old_name, copy, def_p);
}
if (codegen_error_p ()) if (codegen_error_p ())
return false; return false;
...@@ -1244,17 +1221,14 @@ copy_bb_and_scalar_dependences (basic_block bb, edge next_e, vec<tree> iv_map) ...@@ -1244,17 +1221,14 @@ copy_bb_and_scalar_dependences (basic_block bb, edge next_e, vec<tree> iv_map)
continue; continue;
tree new_phi_def; tree new_phi_def;
vec <tree> *renames = region->rename_map->get (res); tree *rename = region->rename_map->get (res);
if (! renames || renames->is_empty ()) if (! rename)
{ {
new_phi_def = create_tmp_reg (TREE_TYPE (res)); new_phi_def = create_tmp_reg (TREE_TYPE (res));
set_rename (res, new_phi_def); set_rename (res, new_phi_def);
} }
else else
{ new_phi_def = *rename;
gcc_assert (renames->length () == 1);
new_phi_def = (*renames)[0];
}
gassign *ass = gimple_build_assign (NULL_TREE, new_phi_def); gassign *ass = gimple_build_assign (NULL_TREE, new_phi_def);
create_new_def_for (res, ass, NULL); create_new_def_for (res, ass, NULL);
...@@ -1291,17 +1265,14 @@ copy_bb_and_scalar_dependences (basic_block bb, edge next_e, vec<tree> iv_map) ...@@ -1291,17 +1265,14 @@ copy_bb_and_scalar_dependences (basic_block bb, edge next_e, vec<tree> iv_map)
continue; continue;
tree new_phi_def; tree new_phi_def;
vec <tree> *renames = region->rename_map->get (res); tree *rename = region->rename_map->get (res);
if (! renames || renames->is_empty ()) if (! rename)
{ {
new_phi_def = create_tmp_reg (TREE_TYPE (res)); new_phi_def = create_tmp_reg (TREE_TYPE (res));
set_rename (res, new_phi_def); set_rename (res, new_phi_def);
} }
else else
{ new_phi_def = *rename;
gcc_assert (renames->length () == 1);
new_phi_def = (*renames)[0];
}
tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e); tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
if (TREE_CODE (arg) == SSA_NAME if (TREE_CODE (arg) == SSA_NAME
...@@ -1336,13 +1307,14 @@ add_parameters_to_ivs_params (scop_p scop, ivs_params &ip) ...@@ -1336,13 +1307,14 @@ add_parameters_to_ivs_params (scop_p scop, ivs_params &ip)
{ {
sese_info_p region = scop->scop_info; sese_info_p region = scop->scop_info;
unsigned nb_parameters = isl_set_dim (scop->param_context, isl_dim_param); unsigned nb_parameters = isl_set_dim (scop->param_context, isl_dim_param);
gcc_assert (nb_parameters == region->params.length ()); gcc_assert (nb_parameters == sese_nb_params (region));
unsigned i; unsigned i;
for (i = 0; i < nb_parameters; i++) tree param;
FOR_EACH_VEC_ELT (region->params, i, param)
{ {
isl_id *tmp_id = isl_set_get_dim_id (scop->param_context, isl_id *tmp_id = isl_set_get_dim_id (scop->param_context,
isl_dim_param, i); isl_dim_param, i);
ip[tmp_id] = region->params[i]; ip[tmp_id] = param;
} }
} }
...@@ -1417,10 +1389,10 @@ generate_entry_out_of_ssa_copies (edge false_entry, ...@@ -1417,10 +1389,10 @@ generate_entry_out_of_ssa_copies (edge false_entry,
continue; continue;
/* When there's no out-of-SSA var registered do not bother /* When there's no out-of-SSA var registered do not bother
to create one. */ to create one. */
vec <tree> *renames = region->rename_map->get (res); tree *rename = region->rename_map->get (res);
if (! renames || renames->is_empty ()) if (! rename)
continue; continue;
tree new_phi_def = (*renames)[0]; tree new_phi_def = *rename;
gassign *ass = gimple_build_assign (new_phi_def, gassign *ass = gimple_build_assign (new_phi_def,
PHI_ARG_DEF_FROM_EDGE (phi, PHI_ARG_DEF_FROM_EDGE (phi,
false_entry)); false_entry));
......
...@@ -142,11 +142,8 @@ isl_id_for_dr (scop_p s) ...@@ -142,11 +142,8 @@ isl_id_for_dr (scop_p s)
/* Extract an affine expression from the ssa_name E. */ /* Extract an affine expression from the ssa_name E. */
static isl_pw_aff * static isl_pw_aff *
extract_affine_name (scop_p s, tree e, __isl_take isl_space *space) extract_affine_name (int dimension, __isl_take isl_space *space)
{ {
isl_id *id = isl_id_for_ssa_name (s, e);
int dimension = isl_space_find_dim_by_id (space, isl_dim_param, id);
isl_id_free (id);
isl_set *dom = isl_set_universe (isl_space_copy (space)); isl_set *dom = isl_set_universe (isl_space_copy (space));
isl_aff *aff = isl_aff_zero_on_domain (isl_local_space_from_space (space)); isl_aff *aff = isl_aff_zero_on_domain (isl_local_space_from_space (space));
aff = isl_aff_add_coefficient_si (aff, isl_dim_param, dimension, 1); aff = isl_aff_add_coefficient_si (aff, isl_dim_param, dimension, 1);
...@@ -211,17 +208,13 @@ wrap (isl_pw_aff *pwaff, unsigned width) ...@@ -211,17 +208,13 @@ wrap (isl_pw_aff *pwaff, unsigned width)
Otherwise returns -1. */ Otherwise returns -1. */
static inline int static inline int
parameter_index_in_region_1 (tree name, sese_info_p region) parameter_index_in_region (tree name, sese_info_p region)
{ {
int i; int i;
tree p; tree p;
gcc_assert (TREE_CODE (name) == SSA_NAME);
FOR_EACH_VEC_ELT (region->params, i, p) FOR_EACH_VEC_ELT (region->params, i, p)
if (p == name) if (p == name)
return i; return i;
return -1; return -1;
} }
...@@ -288,10 +281,13 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) ...@@ -288,10 +281,13 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space)
break; break;
case SSA_NAME: case SSA_NAME:
gcc_assert (-1 != parameter_index_in_region_1 (e, s->scop_info) {
|| defined_in_sese_p (e, s->scop_info->region)); gcc_assert (! defined_in_sese_p (e, s->scop_info->region));
res = extract_affine_name (s, e, space); int dim = parameter_index_in_region (e, s->scop_info);
break; gcc_assert (dim != -1);
res = extract_affine_name (dim, space);
break;
}
case INTEGER_CST: case INTEGER_CST:
res = extract_affine_int (e, space); res = extract_affine_int (e, space);
...@@ -431,54 +427,40 @@ add_conditions_to_domain (poly_bb_p pbb) ...@@ -431,54 +427,40 @@ add_conditions_to_domain (poly_bb_p pbb)
of P. */ of P. */
static void static void
add_param_constraints (scop_p scop, graphite_dim_t p) add_param_constraints (scop_p scop, graphite_dim_t p, tree parameter)
{ {
tree parameter = scop->scop_info->params[p];
tree type = TREE_TYPE (parameter); tree type = TREE_TYPE (parameter);
tree lb = NULL_TREE; wide_int min, max;
tree ub = NULL_TREE;
if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type)) gcc_assert (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type));
lb = lower_bound_in_type (type, type);
else
lb = TYPE_MIN_VALUE (type);
if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type)) if (INTEGRAL_TYPE_P (type)
ub = upper_bound_in_type (type, type); && get_range_info (parameter, &min, &max) == VR_RANGE)
;
else else
ub = TYPE_MAX_VALUE (type);
if (lb)
{ {
isl_space *space = isl_set_get_space (scop->param_context); min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
isl_constraint *c; max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
isl_val *v;
c = isl_inequality_alloc (isl_local_space_from_space (space));
v = isl_val_int_from_wi (scop->isl_context, wi::to_widest (lb));
v = isl_val_neg (v);
c = isl_constraint_set_constant_val (c, v);
c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, 1);
scop->param_context = isl_set_coalesce
(isl_set_add_constraint (scop->param_context, c));
} }
if (ub) isl_space *space = isl_set_get_space (scop->param_context);
{ isl_constraint *c = isl_inequality_alloc (isl_local_space_from_space (space));
isl_space *space = isl_set_get_space (scop->param_context); isl_val *v = isl_val_int_from_wi (scop->isl_context,
isl_constraint *c; widest_int::from (min, TYPE_SIGN (type)));
isl_val *v; v = isl_val_neg (v);
c = isl_constraint_set_constant_val (c, v);
c = isl_inequality_alloc (isl_local_space_from_space (space)); c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, 1);
scop->param_context = isl_set_coalesce
v = isl_val_int_from_wi (scop->isl_context, wi::to_widest (ub)); (isl_set_add_constraint (scop->param_context, c));
c = isl_constraint_set_constant_val (c, v);
c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, -1); space = isl_set_get_space (scop->param_context);
c = isl_inequality_alloc (isl_local_space_from_space (space));
scop->param_context = isl_set_coalesce v = isl_val_int_from_wi (scop->isl_context,
(isl_set_add_constraint (scop->param_context, c)); widest_int::from (max, TYPE_SIGN (type)));
} c = isl_constraint_set_constant_val (c, v);
c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, -1);
scop->param_context = isl_set_coalesce
(isl_set_add_constraint (scop->param_context, c));
} }
/* Add a constrain to the ACCESSES polyhedron for the alias set of /* Add a constrain to the ACCESSES polyhedron for the alias set of
...@@ -930,9 +912,8 @@ build_scop_context (scop_p scop) ...@@ -930,9 +912,8 @@ build_scop_context (scop_p scop)
scop->param_context = isl_set_universe (space); scop->param_context = isl_set_universe (space);
graphite_dim_t p; FOR_EACH_VEC_ELT (region->params, i, e)
for (p = 0; p < nbp; p++) add_param_constraints (scop, i, e);
add_param_constraints (scop, p);
} }
/* Return true when loop A is nested in loop B. */ /* Return true when loop A is nested in loop B. */
......
...@@ -156,10 +156,8 @@ new_sese_info (edge entry, edge exit) ...@@ -156,10 +156,8 @@ new_sese_info (edge entry, edge exit)
region->liveout = NULL; region->liveout = NULL;
region->debug_liveout = NULL; region->debug_liveout = NULL;
region->params.create (3); region->params.create (3);
region->rename_map = new rename_map_t; region->rename_map = new hash_map <tree, tree>;
region->bbs.create (3); region->bbs.create (3);
region->incomplete_phis.create (3);
return region; return region;
} }
...@@ -173,14 +171,9 @@ free_sese_info (sese_info_p region) ...@@ -173,14 +171,9 @@ free_sese_info (sese_info_p region)
BITMAP_FREE (region->liveout); BITMAP_FREE (region->liveout);
BITMAP_FREE (region->debug_liveout); BITMAP_FREE (region->debug_liveout);
for (rename_map_t::iterator it = region->rename_map->begin ();
it != region->rename_map->end (); ++it)
(*it).second.release ();
delete region->rename_map; delete region->rename_map;
region->rename_map = NULL; region->rename_map = NULL;
region->bbs.release (); region->bbs.release ();
region->incomplete_phis.release ();
XDELETE (region); XDELETE (region);
} }
......
...@@ -22,13 +22,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -22,13 +22,7 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_SESE_H #ifndef GCC_SESE_H
#define GCC_SESE_H #define GCC_SESE_H
typedef hash_map<basic_block, vec<basic_block> > bb_map_t;
typedef hash_map<tree, vec<tree> > rename_map_t;
typedef struct ifsese_s *ifsese; typedef struct ifsese_s *ifsese;
/* First phi is the new codegenerated phi second one is original phi. */
typedef std::pair <gphi *, gphi *> phi_rename;
/* First edge is the init edge and second is the back edge w.r.t. a loop. */
typedef std::pair<edge, edge> init_back_edge_pair_t;
/* A Single Entry, Single Exit region is a part of the CFG delimited /* A Single Entry, Single Exit region is a part of the CFG delimited
by two edges. */ by two edges. */
...@@ -91,18 +85,12 @@ typedef struct sese_info_t ...@@ -91,18 +85,12 @@ typedef struct sese_info_t
/* Parameters used within the SCOP. */ /* Parameters used within the SCOP. */
vec<tree> params; vec<tree> params;
/* Maps an old name to one or more new names. When there are several new /* Maps an old name to a new decl. */
names, one has to select the definition corresponding to the immediate hash_map<tree, tree> *rename_map;
dominator. */
rename_map_t *rename_map;
/* Basic blocks contained in this SESE. */ /* Basic blocks contained in this SESE. */
vec<basic_block> bbs; vec<basic_block> bbs;
/* A vector of phi nodes to be updated when all arguments are available. The
pair contains first the old_phi and second the new_phi. */
vec<phi_rename> incomplete_phis;
/* The condition region generated for this sese. */ /* The condition region generated for this sese. */
ifsese if_region; ifsese if_region;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment