mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-27 13:54:19 +08:00
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
This commit is contained in:
parent
cab5fe166d
commit
61e189a874
@ -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
|
||||
|
@ -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.
|
||||
|
24
gcc/testsuite/gcc.dg/torture/restrict-6.c
Normal file
24
gcc/testsuite/gcc.dg/torture/restrict-6.c
Normal file
@ -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;
|
||||
}
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user