aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@linux.alibaba.com>2020-05-13 11:37:47 +0800
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 13:03:11 -0300
commit3232fe2b92ca302ce776c07aaf3e8ab0945d080a (patch)
tree1921be7c091c056962be8d4d91e81adac522a22c
parent268ae29df560cd9b6c16d02164c8aa33628395e3 (diff)
downloadgcc-3232fe2b92ca302ce776c07aaf3e8ab0945d080a.zip
gcc-3232fe2b92ca302ce776c07aaf3e8ab0945d080a.tar.gz
gcc-3232fe2b92ca302ce776c07aaf3e8ab0945d080a.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.
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr94969.c28
-rw-r--r--gcc/tree-data-ref.c12
-rw-r--r--gcc/tree-loop-distribution.c3
5 files changed, 51 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a7c8ade..4234a72 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2020-05-13 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/94969
+ * 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.
+
2020-05-13 Hongtao Liu <hongtao.liu@intel.com>
PR target/94118
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9ad48ba..5a4215b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-13 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/94969
+ * gcc.dg/tree-ssa/pr94969.c: New test.
+
2020-05-12 Craig Blackmore <craig.blackmore@embecosm.com>
* gcc.target/riscv/shorten-memrefs-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c
new file mode 100644
index 0000000..056b015
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c
@@ -0,0 +1,28 @@
+/* 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 "ldist" "Loop 1 distributed: split to 3 loops"} } */
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)
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index 4442321..b122c39 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -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. */