Commit 63c00a0c by Bin Cheng

Add missing unit dependence vector in data dependence analysis

Current data dependence analysis misses unit distant vector if DRs in
DDR have the same invariant access functions.  This adds the vector as
the constant access function case.

Also fix typo in testcase.

Backport from master.

2020-06-20  Bin Cheng  <bin.cheng@linux.alibaba.com>

gcc/
	PR tree-optimization/94969
	* tree-data-ref.c (constant_access_functions): Rename to...
	(invariant_access_functions): ...this.  Add parameter.  Check for
	invariant access function, rather than constant.
	(build_classic_dist_vector): Call above function.
	* tree-loop-distribution.c (pg_add_dependence_edges): Add comment.

gcc/testsuite/
	PR tree-optimization/94969
	* gcc.dg/tree-ssa/pr94969.c: New test.

2020-06-20  Jakub Jelinek  <jakub@redhat.com>

gcc/testsuite/
	PR tree-optimization/95110
	* gcc.dg/tree-ssa/pr94969.c: Swap scan-tree-dump-not arguments.
parent f8602c3c
/* PR tree-optimization/52267 */
/* { dg-do run } */
/* { dg-options "-O3 -fdump-tree-ldist-details" } */
int a = 0, b = 0, c = 0;
struct S {
signed m : 7;
signed e : 2;
};
struct S f[2] = {{0, 0}, {0, 0}};
struct S g = {0, 0};
void __attribute__((noinline))
k()
{
for (; c <= 1; c++) {
f[b] = g;
f[b].e ^= 1;
}
}
int main()
{
k();
if (f[b].e != 1)
__builtin_abort ();
}
/* { dg-final { scan-tree-dump-not "Loop 1 distributed: split to 3 loops" "ldist" } } */
......@@ -4821,17 +4821,19 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
return true;
}
/* Return true when the DDR contains only constant access functions. */
/* Return true when the DDR contains only invariant access functions wrto. loop
number LNUM. */
static bool
constant_access_functions (const struct data_dependence_relation *ddr)
invariant_access_functions (const struct data_dependence_relation *ddr,
int lnum)
{
unsigned i;
subscript *sub;
FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
if (!evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 0))
|| !evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 1)))
if (!evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 0), lnum)
|| !evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 1), lnum))
return false;
return true;
......@@ -5030,7 +5032,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
save_dist_v (ddr, dist_v);
if (constant_access_functions (ddr))
if (invariant_access_functions (ddr, loop_nest->num))
add_distance_for_zero_overlaps (ddr);
if (DDR_NB_LOOPS (ddr) > 1)
......
......@@ -2080,7 +2080,8 @@ loop_distribution::pg_add_dependence_edges (struct graph *rdg, int dir,
this_dir = -this_dir;
/* Known dependences can still be unordered througout the
iteration space, see gcc.dg/tree-ssa/ldist-16.c. */
iteration space, see gcc.dg/tree-ssa/ldist-16.c and
gcc.dg/tree-ssa/pr94969.c. */
if (DDR_NUM_DIST_VECTS (ddr) != 1)
this_dir = 2;
/* If the overlap is exact preserve stmt order. */
......
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