aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-data-ref.c
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@linux.alibaba.com>2020-05-13 11:37:47 +0800
committerBin Cheng <bin.cheng@linux.alibaba.com>2020-05-13 11:37:47 +0800
commitf6e1a4cd83190746b6544917f7526fa480ca5f18 (patch)
treef7cd60b573c8a867fbab2c5d81da5b095dce13fd /gcc/tree-data-ref.c
parent0fec3f62b9bfc03e5088a09036791c2ac84fe0c8 (diff)
downloadgcc-f6e1a4cd83190746b6544917f7526fa480ca5f18.zip
gcc-f6e1a4cd83190746b6544917f7526fa480ca5f18.tar.gz
gcc-f6e1a4cd83190746b6544917f7526fa480ca5f18.tar.bz2
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. 2020-05-13 Bin Cheng <bin.cheng@linux.alibaba.com> PR tree-optimization/94969 gcc/ * tree-data-dependence.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/ * gcc.dg/tree-ssa/pr94969.c: New test.
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r--gcc/tree-data-ref.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 851225e..5505ba4 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -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)