/* Data dependence analysis for Graphite.
- Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010, 2013 Free Software Foundation, Inc.
Contributed by Sebastian Pop <sebastian.pop@amd.com> and
Konrad Trifunovic <konrad.trifunovic@inria.fr>.
{
const struct poly_ddr *p = (const struct poly_ddr *) pddr;
- return (hashval_t) ((long) PDDR_SOURCE (p) + (long) PDDR_SINK (p));
+ return (hashval_t) ((intptr_t) PDDR_SOURCE (p) + (intptr_t) PDDR_SINK (p));
}
/* Returns true when PDDR has no dependence. */
{
ppl_dimension_type *ds;
ppl_dimension_type access_dim;
- unsigned i, pos = 0;
+ unsigned i, pos;
ppl_Pointset_Powerset_C_Polyhedron_space_dimension (alias_powerset,
&access_dim);
- ds = XNEWVEC (ppl_dimension_type, access_dim-1);
- for (i = 0; i < access_dim; i++)
- {
- if (i == alias_dim)
- continue;
+ ds = XNEWVEC (ppl_dimension_type, access_dim - 1);
+ gcc_assert (alias_dim < access_dim);
- ds[pos] = i;
- pos++;
- }
+ for (pos = 0, i = 0; i < access_dim; i++)
+ if (i != alias_dim)
+ ds[pos++] = i;
ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions (alias_powerset,
ds,
the BAG polyhedron: T1|I1|T2|I2|S1|S2|G. When DIRECTION is set to
1, compute the direct dependence from PDR1 to PDR2, and when
DIRECTION is -1, compute the reversed dependence relation, from
- PDR2 to PDR1. GDIM is the number of parameters in the scop. */
+ PDR2 to PDR1. */
static ppl_Pointset_Powerset_C_Polyhedron_t
build_lexicographical_constraint (ppl_Pointset_Powerset_C_Polyhedron_t bag,
graphite_dim_t dim,
graphite_dim_t tdim,
graphite_dim_t offset,
- graphite_dim_t gdim,
int direction)
{
graphite_dim_t i;
lex = build_pairwise_scheduling (dim, 0, offset, direction);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (lex, bag);
- if (!ppl_powerset_is_empty (lex, gdim))
+ if (!ppl_powerset_is_empty (lex))
ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (res, lex);
ppl_delete_Pointset_Powerset_C_Polyhedron (lex);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (bag, sceq);
ppl_delete_Pointset_Powerset_C_Polyhedron (sceq);
- if (ppl_powerset_is_empty (bag, gdim))
+ if (ppl_powerset_is_empty (bag))
break;
lex = build_pairwise_scheduling (dim, i + 1, offset, direction);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (lex, bag);
- if (!ppl_powerset_is_empty (lex, gdim))
+ if (!ppl_powerset_is_empty (lex))
ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign (res, lex);
ppl_delete_Pointset_Powerset_C_Polyhedron (lex);
ppl_delete_Pointset_Powerset_C_Polyhedron (idr2);
ppl_delete_Pointset_Powerset_C_Polyhedron (dreq);
- if (ppl_powerset_is_empty (res, gdim))
+ if (ppl_powerset_is_empty (res))
return NULL;
lex = build_lexicographical_constraint (res, dim, MIN (tdim1, tdim2),
- tdim1 + ddim1, gdim, direction);
+ tdim1 + ddim1, direction);
ppl_delete_Pointset_Powerset_C_Polyhedron (res);
return lex;
PDDR_KIND (res) = unknown_dependence;
else if (!(pdr_read_p (pdr1) && pdr_read_p (pdr2))
- && PDR_BASE_OBJECT_SET (pdr1) == PDR_BASE_OBJECT_SET (pdr2)
- && PDR_NB_SUBSCRIPTS (pdr1) == PDR_NB_SUBSCRIPTS (pdr2)
+ && same_pdr_p (pdr1, pdr2)
&& may_alias)
{
PDDR_DDP (res) = dependence_polyhedron (pdr1, pdr2, direction,
poly_dr_p pdr;
FOR_EACH_VEC_ELT (poly_dr_p, PBB_DRS (pbb1), i, pdr)
- if (PDR_TYPE (pdr) == PDR_WRITE)
- break;
+ if (PDR_TYPE (pdr) == PDR_WRITE
+ && same_pdr_p (pdr, pdr1) && same_pdr_p (pdr, pdr2))
+ return true;
- return same_pdr_p (pdr, pdr1) && same_pdr_p (pdr, pdr2);
+ return false;
}
/* Return true when the data dependence relation between the data
ppl_insert_dimensions_pointset (pt, otdim1 + ttdim1 + ddim1, otdim2);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (po_temp, pt);
- is_empty_p = ppl_powerset_is_empty (po_temp,
- scop_nb_params (PBB_SCOP (pbb1)));
+ is_empty_p = ppl_powerset_is_empty (po_temp);
ppl_delete_Pointset_Powerset_C_Polyhedron (po_temp);
free_poly_ddr (tpddr);
{
ppl_Pointset_Powerset_C_Polyhedron_t po;
ppl_Pointset_Powerset_C_Polyhedron_t eqpp;
- graphite_dim_t tdim1 = pbb_nb_scattering_transform (PDR_PBB (pdr1));
- graphite_dim_t ddim1 = pbb_dim_iter_domain (PDR_PBB (pdr1));
+ poly_bb_p pbb = PDR_PBB (pdr1);
+ graphite_dim_t tdim1 = pbb_nb_scattering_transform (pbb);
+ graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb);
ppl_dimension_type dim;
bool empty_p;
poly_ddr_p pddr = new_poly_ddr (pdr1, pdr2, 1, false);
+ graphite_dim_t pos;
if (PDDR_KIND (pddr) == unknown_dependence)
{
po = PDDR_DDP (pddr);
ppl_Pointset_Powerset_C_Polyhedron_space_dimension (po, &dim);
- eqpp = build_pairwise_scheduling (dim, level, tdim1 + ddim1, 1);
+ pos = psct_dynamic_dim (pbb, level);
+ eqpp = build_pairwise_scheduling (dim, pos, tdim1 + ddim1, 1);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (eqpp, po);
- empty_p = ppl_powerset_is_empty
- (eqpp, scop_nb_params (PBB_SCOP (PDR_PBB (pdr1))));
+ empty_p = ppl_powerset_is_empty (eqpp);
ppl_delete_Pointset_Powerset_C_Polyhedron (eqpp);
free_poly_ddr (pddr);