aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/graphite-scop-detection.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr90328.c24
-rw-r--r--gcc/tree-data-ref.c9
-rw-r--r--gcc/tree-data-ref.h2
6 files changed, 52 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3dae0db..b4424dd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
2019-05-06 Richard Biener <rguenther@suse.de>
+ 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 <rguenther@suse.de>
+
* dwarf2out.c (mem_loc_descriptor): Initialize int_mode.
2019-05-06 Richard Biener <rguenther@suse.de>
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index 45f459a..4534d43 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 1dec62f..2ad2c4a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-05-06 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/90328
+ * gcc.dg/torture/pr90328.c: New testcase.
+
+2019-05-06 Richard Biener <rguenther@suse.de>
+
PR testsuite/90331
* gcc.dg/pr87314-1.c: Align the substring to open up
string merging for targets aligning strings to 8 bytes.
diff --git a/gcc/testsuite/gcc.dg/torture/pr90328.c b/gcc/testsuite/gcc.dg/torture/pr90328.c
new file mode 100644
index 0000000..a70f3dd
--- /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 6c69f77..67b960d 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 ab44d07..69d5a82 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 *);