lambda-code.c (lambda_vector_lexico_pos): Moved...

* lambda-code.c (lambda_vector_lexico_pos): Moved...
	* lambda.h (lambda_vector_lexico_pos): ... here.
	* tree-data-ref.c (build_classic_dist_vector): Return false when
	the distance vector is lexicographically negative.

From-SVN: r103392
This commit is contained in:
Sebastian Pop 2005-08-23 10:24:20 +02:00 committed by Sebastian Pop
parent ce8f9416be
commit 37b8a73b50
4 changed files with 47 additions and 23 deletions

View File

@ -1,3 +1,10 @@
2005-08-23 Sebastian Pop <pop@cri.ensmp.fr>
* lambda-code.c (lambda_vector_lexico_pos): Moved...
* lambda.h (lambda_vector_lexico_pos): ... here.
* tree-data-ref.c (build_classic_dist_vector): Return false when
the distance vector is lexicographically negative.
2005-08-23 Sebastian Pop <pop@cri.ensmp.fr>
PR tree-optimization/23511

View File

@ -2010,27 +2010,6 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
VEC_free (tree, heap, new_ivs);
}
/* Returns true when the vector V is lexicographically positive, in
other words, when the first nonzero element is positive. */
static bool
lambda_vector_lexico_pos (lambda_vector v,
unsigned n)
{
unsigned i;
for (i = 0; i < n; i++)
{
if (v[i] == 0)
continue;
if (v[i] < 0)
return false;
if (v[i] > 0)
return true;
}
return true;
}
/* Return TRUE if this is not interesting statement from the perspective of
determining if we have a perfect loop nest. */

View File

@ -376,5 +376,26 @@ print_lambda_vector (FILE * outfile, lambda_vector vector, int n)
fprintf (outfile, "%3d ", vector[i]);
fprintf (outfile, "\n");
}
/* Returns true when the vector V is lexicographically positive, in
other words, when the first nonzero element is positive. */
static inline bool
lambda_vector_lexico_pos (lambda_vector v,
unsigned n)
{
unsigned i;
for (i = 0; i < n; i++)
{
if (v[i] == 0)
continue;
if (v[i] < 0)
return false;
if (v[i] > 0)
return true;
}
return true;
}
#endif /* LAMBDA_H */

View File

@ -3030,8 +3030,8 @@ subscript_dependence_tester (struct data_dependence_relation *ddr)
NB_LOOPS is the total number of loops we are considering.
FIRST_LOOP_DEPTH is the loop->depth of the first loop in the analyzed
loop nest.
Return FALSE if the dependence relation is outside of the loop nest
starting at FIRST_LOOP_DEPTH.
Return FALSE when fail to represent the data dependence as a distance
vector.
Return TRUE otherwise. */
static bool
@ -3196,6 +3196,23 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
DDR_DIST_VECT (ddr) = dist_v;
DDR_SIZE_VECT (ddr) = nb_loops;
/* Verify a basic constraint: classic distance vectors should always
be lexicographically positive. */
if (!lambda_vector_lexico_pos (DDR_DIST_VECT (ddr),
DDR_SIZE_VECT (ddr)))
{
if (DDR_SIZE_VECT (ddr) == 1)
/* This one is simple to fix, and can be fixed.
Multidimensional arrays cannot be fixed that simply. */
lambda_vector_negate (DDR_DIST_VECT (ddr), DDR_DIST_VECT (ddr),
DDR_SIZE_VECT (ddr));
else
/* This is not valid: we need the delta test for properly
fixing all this. */
return false;
}
return true;
}