diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr58223.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ldist-16.c | 6 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 21 |
5 files changed, 45 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c46e54..7a8782b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2013-08-30 Richard Biener <rguenther@suse.de> + PR tree-optimization/58223 + * tree-loop-distribution.c (has_anti_dependence): Rename to ... + (has_anti_or_output_dependence): ... this and adjust to also + look for output dependences. + (mark_nodes_having_upstream_mem_writes): Adjust. + (rdg_flag_uses): Likewise. + +2013-08-30 Richard Biener <rguenther@suse.de> + PR tree-optimization/58010 * tree-vect-loop.c (vect_create_epilog_for_reduction): Remove assert that we have a loop-closed PHI. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8d93f2e..e6fa611 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2013-08-30 Richard Biener <rguenther@suse.de> + PR tree-optimization/58223 + * gcc.dg/torture/pr58223.c: New testcase. + * gcc.dg/tree-ssa/ldist-16.c: Flip expected behavior. + +2013-08-30 Richard Biener <rguenther@suse.de> + PR tree-optimization/58010 * gcc.dg/pr58010.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr58223.c b/gcc/testsuite/gcc.dg/torture/pr58223.c new file mode 100644 index 0000000..978084a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58223.c @@ -0,0 +1,16 @@ +/* { dg-do run } */ + +extern void abort (void); +int a[2], b; + +int main () +{ + for (b = 0; b < 2; b++) + { + a[0] = 1; + a[b] = 0; + } + if (a[0] != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-16.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-16.c index a26999e..53a9fa4 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-16.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-16.c @@ -14,8 +14,8 @@ void foo (int n) } } -/* We should apply loop distribution and generate a memset (0). */ +/* We should not apply loop distribution and not generate a memset (0). */ -/* { dg-final { scan-tree-dump "distributed: split to 2" "ldist" } } */ -/* { dg-final { scan-tree-dump-times "generated memset zero" 1 "ldist" } } */ +/* { dg-final { scan-tree-dump "Loop 1 is the same" "ldist" } } */ +/* { dg-final { scan-tree-dump-times "generated memset zero" 0 "ldist" } } */ /* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 2317edc..95c4d5f 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -542,17 +542,19 @@ already_processed_vertex_p (bitmap processed, int v) || !bitmap_bit_p (remaining_stmts, v)); } -/* Returns NULL when there is no anti-dependence among the successors - of vertex V, otherwise returns the edge with the anti-dep. */ +/* Returns NULL when there is no anti-dependence or output-dependence + among the successors of vertex V, otherwise returns the edge with the + dependency. */ static struct graph_edge * -has_anti_dependence (struct vertex *v) +has_anti_or_output_dependence (struct vertex *v) { struct graph_edge *e; if (v->succ) for (e = v->succ; e; e = e->succ_next) - if (RDGE_TYPE (e) == anti_dd) + if (RDGE_TYPE (e) == anti_dd + || RDGE_TYPE (e) == output_dd) return e; return NULL; @@ -604,11 +606,10 @@ mark_nodes_having_upstream_mem_writes (struct graph *rdg) || predecessor_has_mem_write (rdg, &(rdg->vertices[x])) /* In anti dependences the read should occur before the write, this is why both the read and the write - should be placed in the same partition. */ - || has_anti_dependence (&(rdg->vertices[x]))) - { - bitmap_set_bit (upstream_mem_writes, x); - } + should be placed in the same partition. In output + dependences the writes order need to be preserved. */ + || has_anti_or_output_dependence (&(rdg->vertices[x]))) + bitmap_set_bit (upstream_mem_writes, x); } nodes.release (); @@ -637,7 +638,7 @@ rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops, use_operand_p use_p; struct vertex *x = &(rdg->vertices[u]); gimple stmt = RDGV_STMT (x); - struct graph_edge *anti_dep = has_anti_dependence (x); + struct graph_edge *anti_dep = has_anti_or_output_dependence (x); /* Keep in the same partition the destination of an antidependence, because this is a store to the exact same location. Putting this |