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>
* combine.c (simplify_compare_const): Add gcc_fallthrough.
......@@ -195,7 +195,6 @@ class translate_isl_ast_to_gimple
edge copy_bb_and_scalar_dependences (basic_block bb, edge next_e,
vec<tree> iv_map);
void set_rename (tree old_name, tree expr);
void set_rename_for_each_def (gimple *stmt);
void gsi_insert_earliest (gimple_seq seq);
bool codegen_error_p () const { return codegen_error; }
......@@ -932,25 +931,12 @@ set_rename (tree old_name, tree expr)
{
fprintf (dump_file, "[codegen] setting rename: 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);
fprintf (dump_file, "\n");
}
if (old_name == expr)
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);
}
bool res = region->rename_map->put (old_name, expr);
gcc_assert (! res);
}
/* 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)
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
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,
gimple_duplicate_stmt_histograms (cfun, copy, cfun, 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 ())
return false;
......@@ -1244,17 +1221,14 @@ copy_bb_and_scalar_dependences (basic_block bb, edge next_e, vec<tree> iv_map)
continue;
tree new_phi_def;
vec <tree> *renames = region->rename_map->get (res);
if (! renames || renames->is_empty ())
tree *rename = region->rename_map->get (res);
if (! rename)
{
new_phi_def = create_tmp_reg (TREE_TYPE (res));
set_rename (res, new_phi_def);
}
else
{
gcc_assert (renames->length () == 1);
new_phi_def = (*renames)[0];
}
new_phi_def = *rename;
gassign *ass = gimple_build_assign (NULL_TREE, new_phi_def);
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)
continue;
tree new_phi_def;
vec <tree> *renames = region->rename_map->get (res);
if (! renames || renames->is_empty ())
tree *rename = region->rename_map->get (res);
if (! rename)
{
new_phi_def = create_tmp_reg (TREE_TYPE (res));
set_rename (res, new_phi_def);
}
else
{
gcc_assert (renames->length () == 1);
new_phi_def = (*renames)[0];
}
new_phi_def = *rename;
tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
if (TREE_CODE (arg) == SSA_NAME
......@@ -1336,13 +1307,14 @@ add_parameters_to_ivs_params (scop_p scop, ivs_params &ip)
{
sese_info_p region = scop->scop_info;
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;
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_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,
continue;
/* When there's no out-of-SSA var registered do not bother
to create one. */
vec <tree> *renames = region->rename_map->get (res);
if (! renames || renames->is_empty ())
tree *rename = region->rename_map->get (res);
if (! rename)
continue;
tree new_phi_def = (*renames)[0];
tree new_phi_def = *rename;
gassign *ass = gimple_build_assign (new_phi_def,
PHI_ARG_DEF_FROM_EDGE (phi,
false_entry));
......
......@@ -142,11 +142,8 @@ isl_id_for_dr (scop_p s)
/* Extract an affine expression from the ssa_name E. */
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_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);
......@@ -211,17 +208,13 @@ wrap (isl_pw_aff *pwaff, unsigned width)
Otherwise returns -1. */
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;
tree p;
gcc_assert (TREE_CODE (name) == SSA_NAME);
FOR_EACH_VEC_ELT (region->params, i, p)
if (p == name)
return i;
return -1;
}
......@@ -288,10 +281,13 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space)
break;
case SSA_NAME:
gcc_assert (-1 != parameter_index_in_region_1 (e, s->scop_info)
|| defined_in_sese_p (e, s->scop_info->region));
res = extract_affine_name (s, e, space);
break;
{
gcc_assert (! defined_in_sese_p (e, s->scop_info->region));
int dim = parameter_index_in_region (e, s->scop_info);
gcc_assert (dim != -1);
res = extract_affine_name (dim, space);
break;
}
case INTEGER_CST:
res = extract_affine_int (e, space);
......@@ -431,54 +427,40 @@ add_conditions_to_domain (poly_bb_p pbb)
of P. */
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 lb = NULL_TREE;
tree ub = NULL_TREE;
wide_int min, max;
if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
lb = lower_bound_in_type (type, type);
else
lb = TYPE_MIN_VALUE (type);
gcc_assert (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type));
if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
ub = upper_bound_in_type (type, type);
if (INTEGRAL_TYPE_P (type)
&& get_range_info (parameter, &min, &max) == VR_RANGE)
;
else
ub = TYPE_MAX_VALUE (type);
if (lb)
{
isl_space *space = isl_set_get_space (scop->param_context);
isl_constraint *c;
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));
min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
}
if (ub)
{
isl_space *space = isl_set_get_space (scop->param_context);
isl_constraint *c;
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 (ub));
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));
}
isl_space *space = isl_set_get_space (scop->param_context);
isl_constraint *c = isl_inequality_alloc (isl_local_space_from_space (space));
isl_val *v = isl_val_int_from_wi (scop->isl_context,
widest_int::from (min, TYPE_SIGN (type)));
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));
space = isl_set_get_space (scop->param_context);
c = isl_inequality_alloc (isl_local_space_from_space (space));
v = isl_val_int_from_wi (scop->isl_context,
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
......@@ -930,9 +912,8 @@ build_scop_context (scop_p scop)
scop->param_context = isl_set_universe (space);
graphite_dim_t p;
for (p = 0; p < nbp; p++)
add_param_constraints (scop, p);
FOR_EACH_VEC_ELT (region->params, i, e)
add_param_constraints (scop, i, e);
}
/* Return true when loop A is nested in loop B. */
......
......@@ -156,10 +156,8 @@ new_sese_info (edge entry, edge exit)
region->liveout = NULL;
region->debug_liveout = NULL;
region->params.create (3);
region->rename_map = new rename_map_t;
region->rename_map = new hash_map <tree, tree>;
region->bbs.create (3);
region->incomplete_phis.create (3);
return region;
}
......@@ -173,14 +171,9 @@ free_sese_info (sese_info_p region)
BITMAP_FREE (region->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;
region->rename_map = NULL;
region->bbs.release ();
region->incomplete_phis.release ();
XDELETE (region);
}
......
......@@ -22,13 +22,7 @@ along with GCC; see the file COPYING3. If not see
#ifndef 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;
/* 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
by two edges. */
......@@ -91,18 +85,12 @@ typedef struct sese_info_t
/* Parameters used within the SCOP. */
vec<tree> params;
/* Maps an old name to one or more new names. When there are several new
names, one has to select the definition corresponding to the immediate
dominator. */
rename_map_t *rename_map;
/* Maps an old name to a new decl. */
hash_map<tree, tree> *rename_map;
/* Basic blocks contained in this SESE. */
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. */
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