From 1d0b81c64c05f40b94bd221558d0339c732d8cc4 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 6 May 2019 12:38:35 +0000 Subject: [PATCH] re PR tree-optimization/90328 (Wrong loop distribution with aliasing) 2019-05-06 Richard Biener PR tree-optimization/90328 * tree-data-ref.h (dr_may_alias_p): Pass in the actual loop nest. * tree-data-ref.c (dr_may_alias_p): Check whether the clique is valid in the loop nest before using it. (initialize_data_dependence_relation): Adjust. * graphite-scop-detection.c (build_alias_set): Pass the SCOP enclosing loop as loop-nest to dr_may_alias_p. * gcc.dg/torture/pr90328.c: New testcase. From-SVN: r270906 --- gcc/ChangeLog | 10 ++++++++++ gcc/graphite-scop-detection.c | 6 +++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr90328.c | 24 ++++++++++++++++++++++++ gcc/tree-data-ref.c | 9 +++++++-- gcc/tree-data-ref.h | 2 +- 6 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr90328.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3dae0db7f59..b4424ddd40e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2019-05-06 Richard Biener + + PR tree-optimization/90328 + * tree-data-ref.h (dr_may_alias_p): Pass in the actual loop nest. + * tree-data-ref.c (dr_may_alias_p): Check whether the clique + is valid in the loop nest before using it. + (initialize_data_dependence_relation): Adjust. + * graphite-scop-detection.c (build_alias_set): Pass the SCOP enclosing + loop as loop-nest to dr_may_alias_p. + 2019-05-06 Richard Biener * dwarf2out.c (mem_loc_descriptor): Initialize int_mode. diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 45f459a3b78..4534d43721f 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -1417,9 +1417,13 @@ build_alias_set (scop_p scop) int i, j; int *all_vertices; + struct loop *nest + = find_common_loop (scop->scop_info->region.entry->dest->loop_father, + scop->scop_info->region.exit->src->loop_father); + FOR_EACH_VEC_ELT (scop->drs, i, dr1) for (j = i+1; scop->drs.iterate (j, &dr2); j++) - if (dr_may_alias_p (dr1->dr, dr2->dr, true)) + if (dr_may_alias_p (dr1->dr, dr2->dr, nest)) { /* Dependences in the same alias set need to be handled by just looking at DR_ACCESS_FNs. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1dec62f5d97..2ad2c4ac4ce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-05-06 Richard Biener + + PR tree-optimization/90328 + * gcc.dg/torture/pr90328.c: New testcase. + 2019-05-06 Richard Biener PR testsuite/90331 diff --git a/gcc/testsuite/gcc.dg/torture/pr90328.c b/gcc/testsuite/gcc.dg/torture/pr90328.c new file mode 100644 index 00000000000..a70f3dd425e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr90328.c @@ -0,0 +1,24 @@ +/* { dg-do run } */ + +void g(int*__restrict x, int*y) +{ + *x = *y; +} + +void __attribute__((noipa)) f(int* a,int* b) +{ + for(int i=0;i<1024;++i) + g(a+i,b+i); +} + +int main() +{ + int x[1025]; + for (int i = 0; i < 1025; ++i) + x[i] = i+1; + f(x+1, x); + for (int i = 0; i < 1025; ++i) + if (x[i] != 1) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 6c69f77e653..67b960d5c6d 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -2231,7 +2231,7 @@ object_address_invariant_in_loop_p (const struct loop *loop, const_tree obj) bool dr_may_alias_p (const struct data_reference *a, const struct data_reference *b, - bool loop_nest) + struct loop *loop_nest) { tree addr_a = DR_BASE_OBJECT (a); tree addr_b = DR_BASE_OBJECT (b); @@ -2255,6 +2255,11 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b, if ((TREE_CODE (addr_a) == MEM_REF || TREE_CODE (addr_a) == TARGET_MEM_REF) && (TREE_CODE (addr_b) == MEM_REF || TREE_CODE (addr_b) == TARGET_MEM_REF) + /* For cross-iteration dependences the cliques must be valid for the + whole loop, not just individual iterations. */ + && (!loop_nest + || MR_DEPENDENCE_CLIQUE (addr_a) == 1 + || MR_DEPENDENCE_CLIQUE (addr_a) == loop_nest->owned_clique) && MR_DEPENDENCE_CLIQUE (addr_a) == MR_DEPENDENCE_CLIQUE (addr_b) && MR_DEPENDENCE_BASE (addr_a) != MR_DEPENDENCE_BASE (addr_b)) return false; @@ -2366,7 +2371,7 @@ initialize_data_dependence_relation (struct data_reference *a, } /* If the data references do not alias, then they are independent. */ - if (!dr_may_alias_p (a, b, loop_nest.exists ())) + if (!dr_may_alias_p (a, b, loop_nest.exists () ? loop_nest[0] : NULL)) { DDR_ARE_DEPENDENT (res) = chrec_known; return res; diff --git a/gcc/tree-data-ref.h b/gcc/tree-data-ref.h index ab44d072731..69d5a82c564 100644 --- a/gcc/tree-data-ref.h +++ b/gcc/tree-data-ref.h @@ -473,7 +473,7 @@ dr_alignment (data_reference *dr) } extern bool dr_may_alias_p (const struct data_reference *, - const struct data_reference *, bool); + const struct data_reference *, struct loop *); extern bool dr_equal_offsets_p (struct data_reference *, struct data_reference *); -- 2.30.2