diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr94969.c | 28 | ||||
-rw-r--r-- | gcc/tree-data-ref.c | 12 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 3 |
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. */ |