mirror of git://gcc.gnu.org/git/gcc.git
graphite-interchange.c (build_partial_difference): New.
2009-11-04 Konrad Trifunovic <konrad.trifunovic@inria.fr>
* graphite-interchange.c (build_partial_difference): New.
(memory_stride_in_loop): Refactored the computation of
equality constraints into build_partial_difference function.
Added support for debugging stride computations.
From-SVN: r154634
This commit is contained in:
parent
8c54631db7
commit
2bc529bf7d
|
|
@ -1,3 +1,10 @@
|
||||||
|
2009-11-04 Konrad Trifunovic <konrad.trifunovic@inria.fr>
|
||||||
|
|
||||||
|
* graphite-interchange.c (build_partial_difference): New.
|
||||||
|
(memory_stride_in_loop): Refactored the computation of
|
||||||
|
equality constraints into build_partial_difference function.
|
||||||
|
Added support for debugging stride computations.
|
||||||
|
|
||||||
2009-11-03 Sebastian Pop <sebastian.pop@amd.com>
|
2009-11-03 Sebastian Pop <sebastian.pop@amd.com>
|
||||||
|
|
||||||
* graphite-clast-to-gimple.c (gloog): Free if_region,
|
* graphite-clast-to-gimple.c (gloog): Free if_region,
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,94 @@ build_linearized_memory_access (ppl_dimension_type offset, poly_dr_p pdr)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Builds a partial difference equations and inserts them
|
||||||
|
into pointset powerset polyhedron P. Polyhedron is assumed
|
||||||
|
to have the format: T|I|T'|I'|G|S|S'|l1|l2.
|
||||||
|
|
||||||
|
TIME_DEPTH is the time dimension w.r.t. which we are
|
||||||
|
differentiating.
|
||||||
|
OFFSET represents the number of dimensions between
|
||||||
|
columns t_{time_depth} and t'_{time_depth}.
|
||||||
|
DIM_SCTR is the number of scattering dimensions. It is
|
||||||
|
essentially the dimensionality of the T vector.
|
||||||
|
|
||||||
|
The following equations are inserted into the polyhedron P:
|
||||||
|
| t_1 = t_1'
|
||||||
|
| ...
|
||||||
|
| t_{time_depth-1} = t'_{time_depth-1}
|
||||||
|
| t_{time_depth} = t'_{time_depth} + 1
|
||||||
|
| t_{time_depth+1} = t'_{time_depth + 1}
|
||||||
|
| ...
|
||||||
|
| t_{dim_sctr} = t'_{dim_sctr}. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
build_partial_difference (ppl_Pointset_Powerset_C_Polyhedron_t *p,
|
||||||
|
ppl_dimension_type time_depth,
|
||||||
|
ppl_dimension_type offset,
|
||||||
|
ppl_dimension_type dim_sctr)
|
||||||
|
{
|
||||||
|
ppl_Constraint_t new_cstr;
|
||||||
|
ppl_Linear_Expression_t le;
|
||||||
|
ppl_dimension_type i;
|
||||||
|
ppl_dimension_type dim;
|
||||||
|
ppl_Pointset_Powerset_C_Polyhedron_t temp;
|
||||||
|
|
||||||
|
/* Add the equality: t_{time_depth} = t'_{time_depth} + 1.
|
||||||
|
This is the core part of this alogrithm, since this
|
||||||
|
constraint asks for the memory access stride (difference)
|
||||||
|
between two consecutive points in time dimensions. */
|
||||||
|
|
||||||
|
ppl_Pointset_Powerset_C_Polyhedron_space_dimension (*p, &dim);
|
||||||
|
ppl_new_Linear_Expression_with_dimension (&le, dim);
|
||||||
|
ppl_set_coef (le, time_depth, 1);
|
||||||
|
ppl_set_coef (le, time_depth + offset, -1);
|
||||||
|
ppl_set_inhomogeneous (le, 1);
|
||||||
|
ppl_new_Constraint (&new_cstr, le, PPL_CONSTRAINT_TYPE_EQUAL);
|
||||||
|
ppl_Pointset_Powerset_C_Polyhedron_add_constraint (*p, new_cstr);
|
||||||
|
ppl_delete_Linear_Expression (le);
|
||||||
|
ppl_delete_Constraint (new_cstr);
|
||||||
|
|
||||||
|
/* Add equalities:
|
||||||
|
| t1 = t1'
|
||||||
|
| ...
|
||||||
|
| t_{time_depth-1} = t'_{time_depth-1}
|
||||||
|
| t_{time_depth+1} = t'_{time_depth+1}
|
||||||
|
| ...
|
||||||
|
| t_{dim_sctr} = t'_{dim_sctr}
|
||||||
|
|
||||||
|
This means that all the time dimensions are equal except for
|
||||||
|
time_depth, where the constraint is t_{depth} = t'_{depth} + 1
|
||||||
|
step. More to this: we should be carefull not to add equalities
|
||||||
|
to the 'coupled' dimensions, which happens when the one dimension
|
||||||
|
is stripmined dimension, and the other dimension corresponds
|
||||||
|
to the point loop inside stripmined dimension. */
|
||||||
|
|
||||||
|
ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron (&temp, *p);
|
||||||
|
|
||||||
|
for (i = 0; i < dim_sctr; i++)
|
||||||
|
if (i != time_depth)
|
||||||
|
{
|
||||||
|
ppl_new_Linear_Expression_with_dimension (&le, dim);
|
||||||
|
ppl_set_coef (le, i, 1);
|
||||||
|
ppl_set_coef (le, i + offset, -1);
|
||||||
|
ppl_new_Constraint (&new_cstr, le, PPL_CONSTRAINT_TYPE_EQUAL);
|
||||||
|
ppl_Pointset_Powerset_C_Polyhedron_add_constraint (temp, new_cstr);
|
||||||
|
|
||||||
|
if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (temp))
|
||||||
|
{
|
||||||
|
ppl_delete_Pointset_Powerset_C_Polyhedron (temp);
|
||||||
|
ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron (&temp, *p);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ppl_Pointset_Powerset_C_Polyhedron_add_constraint (*p, new_cstr);
|
||||||
|
ppl_delete_Linear_Expression (le);
|
||||||
|
ppl_delete_Constraint (new_cstr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ppl_delete_Pointset_Powerset_C_Polyhedron (temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Set STRIDE to the stride of PDR in memory by advancing by one in
|
/* Set STRIDE to the stride of PDR in memory by advancing by one in
|
||||||
time dimension DEPTH. */
|
time dimension DEPTH. */
|
||||||
|
|
||||||
|
|
@ -215,48 +303,11 @@ memory_stride_in_loop (Value stride, graphite_dim_t depth, poly_dr_p pdr)
|
||||||
free (map);
|
free (map);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add equalities:
|
|
||||||
| t1 = t1'
|
|
||||||
| ...
|
|
||||||
| t_{depth-1} = t'_{depth-1}
|
|
||||||
| t_{depth+1} = t'_{depth+1}
|
|
||||||
| ...
|
|
||||||
| t_{dim_sctr} = t'_{dim_sctr}
|
|
||||||
|
|
||||||
This means that all the time dimensions are equal except for
|
|
||||||
depth, where we will add t_{depth} = t'_{depth} + 1 in the next
|
|
||||||
step. */
|
|
||||||
|
|
||||||
time_depth = psct_dynamic_dim (pbb, depth);
|
time_depth = psct_dynamic_dim (pbb, depth);
|
||||||
for (i = 0; i < dim_sctr; i++)
|
|
||||||
if (i != time_depth)
|
|
||||||
{
|
|
||||||
ppl_new_Linear_Expression_with_dimension (&le, new_dim);
|
|
||||||
ppl_set_coef (le, i, 1);
|
|
||||||
ppl_set_coef (le, i + offset, -1);
|
|
||||||
ppl_new_Constraint (&new_cstr, le, PPL_CONSTRAINT_TYPE_EQUAL);
|
|
||||||
ppl_Pointset_Powerset_C_Polyhedron_add_constraint (p2, new_cstr);
|
|
||||||
ppl_delete_Linear_Expression (le);
|
|
||||||
ppl_delete_Constraint (new_cstr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add equality : t_{depth} = t'_{depth} + 1.
|
|
||||||
This is the core part of this alogrithm, since this
|
|
||||||
constraint asks for the memory access stride (difference)
|
|
||||||
between two consecutive points in time dimensions. */
|
|
||||||
{
|
|
||||||
ppl_new_Linear_Expression_with_dimension (&le, new_dim);
|
|
||||||
ppl_set_coef (le, time_depth, 1);
|
|
||||||
ppl_set_coef (le, time_depth + offset, -1);
|
|
||||||
ppl_set_inhomogeneous (le, 1);
|
|
||||||
ppl_new_Constraint (&new_cstr, le, PPL_CONSTRAINT_TYPE_EQUAL);
|
|
||||||
ppl_Pointset_Powerset_C_Polyhedron_add_constraint (p2, new_cstr);
|
|
||||||
ppl_delete_Linear_Expression (le);
|
|
||||||
ppl_delete_Constraint (new_cstr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* P1 = P1 inter P2. */
|
/* P1 = P1 inter P2. */
|
||||||
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (p1, p2);
|
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (p1, p2);
|
||||||
|
build_partial_difference (&p1, time_depth, offset, dim_sctr);
|
||||||
|
|
||||||
/* Maximise the expression L2 - L1. */
|
/* Maximise the expression L2 - L1. */
|
||||||
{
|
{
|
||||||
|
|
@ -266,6 +317,13 @@ memory_stride_in_loop (Value stride, graphite_dim_t depth, poly_dr_p pdr)
|
||||||
ppl_max_for_le_pointset (p1, le, stride);
|
ppl_max_for_le_pointset (p1, le, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||||
|
{
|
||||||
|
fprintf (dump_file, "\nStride in BB_%d, DR_%d, depth %d:",
|
||||||
|
pbb_index (pbb), PDR_ID (pdr), (int) depth);
|
||||||
|
value_print (dump_file, " %s ", stride);
|
||||||
|
}
|
||||||
|
|
||||||
ppl_delete_Pointset_Powerset_C_Polyhedron (p1);
|
ppl_delete_Pointset_Powerset_C_Polyhedron (p1);
|
||||||
ppl_delete_Pointset_Powerset_C_Polyhedron (p2);
|
ppl_delete_Pointset_Powerset_C_Polyhedron (p2);
|
||||||
ppl_delete_Linear_Expression (le);
|
ppl_delete_Linear_Expression (le);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue