aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-10-15 10:58:28 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-10-15 10:58:28 +0000
commit61e189a874392a296e46609502228019cae42e19 (patch)
treef91ed7a7e771b1acd18d1a2a61eeb542c46a20d5 /gcc
parentcab5fe166dd13e1668801f00189459d3139a9342 (diff)
downloadgcc-61e189a874392a296e46609502228019cae42e19.zip
gcc-61e189a874392a296e46609502228019cae42e19.tar.gz
gcc-61e189a874392a296e46609502228019cae42e19.tar.bz2
re PR middle-end/87610 (wrong-code with restrict)
2018-10-15 Richard Biener <rguenther@suse.de> PR middle-end/87610 * tree-ssa-structalias.c (struct vls_data): Add escaped_p member. (visit_loadstore): When a used restrict tag escaped verify that the points-to solution of "other" pointers do not include escaped. (compute_dependence_clique): If a used restrict tag escaped communicated that down to visit_loadstore. * gcc.dg/torture/restrict-6.c: New testcase. From-SVN: r265160
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/restrict-6.c24
-rw-r--r--gcc/tree-ssa-structalias.c15
4 files changed, 51 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4f33576..742f5cf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2018-10-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/87610
+ * tree-ssa-structalias.c (struct vls_data): Add escaped_p member.
+ (visit_loadstore): When a used restrict tag escaped verify that
+ the points-to solution of "other" pointers do not include
+ escaped.
+ (compute_dependence_clique): If a used restrict tag escaped
+ communicated that down to visit_loadstore.
+
2018-10-15 Andreas Krebbel <krebbel@linux.ibm.com>
* config/s390/s390.c (s390_expand_vec_init): Force vector element
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f12a743..e189162 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/87610
+ * gcc.dg/torture/restrict-6.c: New testcase.
+
2018-10-15 Andreas Krebbel <krebbel@linux.ibm.com>
* g++.dg/vec-init-1.C: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/restrict-6.c b/gcc/testsuite/gcc.dg/torture/restrict-6.c
new file mode 100644
index 0000000..9fe12a6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/restrict-6.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+void __attribute__((noinline)) g(int **a, int *b)
+{
+ *a = b;
+}
+
+int foo(int * restrict p, int *q)
+{
+ g(&q, p);
+ *p = 1;
+ *q = 2;
+ return *p + *q;
+}
+
+int main()
+{
+ int x, y;
+ if (foo(&x, &y) != 4)
+ abort ();
+ return 0;
+}
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 06ac001..7751803 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -7397,6 +7397,7 @@ delete_points_to_sets (void)
struct vls_data
{
unsigned short clique;
+ bool escaped_p;
bitmap rvars;
};
@@ -7408,6 +7409,7 @@ visit_loadstore (gimple *, tree base, tree ref, void *data)
{
unsigned short clique = ((vls_data *) data)->clique;
bitmap rvars = ((vls_data *) data)->rvars;
+ bool escaped_p = ((vls_data *) data)->escaped_p;
if (TREE_CODE (base) == MEM_REF
|| TREE_CODE (base) == TARGET_MEM_REF)
{
@@ -7428,7 +7430,8 @@ visit_loadstore (gimple *, tree base, tree ref, void *data)
return false;
vi = get_varinfo (find (vi->id));
- if (bitmap_intersect_p (rvars, vi->solution))
+ if (bitmap_intersect_p (rvars, vi->solution)
+ || (escaped_p && bitmap_bit_p (vi->solution, escaped_id)))
return false;
}
@@ -7505,6 +7508,7 @@ compute_dependence_clique (void)
unsigned short clique = 0;
unsigned short last_ruid = 0;
bitmap rvars = BITMAP_ALLOC (NULL);
+ bool escaped_p = false;
for (unsigned i = 0; i < num_ssa_names; ++i)
{
tree ptr = ssa_name (i);
@@ -7574,7 +7578,12 @@ compute_dependence_clique (void)
last_ruid);
}
if (used)
- bitmap_set_bit (rvars, restrict_var->id);
+ {
+ bitmap_set_bit (rvars, restrict_var->id);
+ varinfo_t escaped = get_varinfo (find (escaped_id));
+ if (bitmap_bit_p (escaped->solution, restrict_var->id))
+ escaped_p = true;
+ }
}
}
@@ -7587,7 +7596,7 @@ compute_dependence_clique (void)
parameters) we can't restrict scoping properly thus the following
is too aggressive there. For now we have excluded those globals from
getting into the MR_DEPENDENCE machinery. */
- vls_data data = { clique, rvars };
+ vls_data data = { clique, escaped_p, rvars };
basic_block bb;
FOR_EACH_BB_FN (bb, cfun)
for (gimple_stmt_iterator gsi = gsi_start_bb (bb);