From 61e189a874392a296e46609502228019cae42e19 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 15 Oct 2018 10:58:28 +0000 Subject: [PATCH] re PR middle-end/87610 (wrong-code with restrict) 2018-10-15 Richard Biener 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 --- gcc/ChangeLog | 10 ++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/restrict-6.c | 24 +++++++++++++++++++++++ gcc/tree-ssa-structalias.c | 15 +++++++++++--- 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/restrict-6.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f33576c125..742f5cf8370 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2018-10-15 Richard Biener + + 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 * config/s390/s390.c (s390_expand_vec_init): Force vector element diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f12a7437d1d..e189162c654 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-10-15 Richard Biener + + PR middle-end/87610 + * gcc.dg/torture/restrict-6.c: New testcase. + 2018-10-15 Andreas Krebbel * 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 00000000000..9fe12a68850 --- /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 06ac0016e03..77518031a71 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); -- 2.30.2