re PR tree-optimization/90328 (Wrong loop distribution with aliasing)
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. * gcc.dg/torture/pr90328.c: New testcase. From-SVN: r270906
This commit is contained in:
parent
b744fc85f5
commit
1d0b81c64c
|
@ -1,3 +1,13 @@
|
|||
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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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 *);
|
||||
|
||||
|
|
Loading…
Reference in New Issue