Commit 062ef2c8 by Richard Biener Committed by Richard Biener

re PR tree-optimization/58223 (wrong code at -O3 on x86_64-linux-gnu)

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.

	* gcc.dg/torture/pr58223.c: New testcase.
	* gcc.dg/tree-ssa/ldist-16.c: Flip expected behavior.

From-SVN: r202096
parent 7a764c60
2013-08-30 Richard Biener <rguenther@suse.de> 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 PR tree-optimization/58010
* tree-vect-loop.c (vect_create_epilog_for_reduction): Remove * tree-vect-loop.c (vect_create_epilog_for_reduction): Remove
assert that we have a loop-closed PHI. assert that we have a loop-closed PHI.
......
2013-08-30 Richard Biener <rguenther@suse.de> 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 PR tree-optimization/58010
* gcc.dg/pr58010.c: New testcase. * gcc.dg/pr58010.c: New testcase.
......
/* { 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;
}
...@@ -14,8 +14,8 @@ void foo (int n) ...@@ -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 "Loop 1 is the same" "ldist" } } */
/* { dg-final { scan-tree-dump-times "generated memset zero" 1 "ldist" } } */ /* { dg-final { scan-tree-dump-times "generated memset zero" 0 "ldist" } } */
/* { dg-final { cleanup-tree-dump "ldist" } } */ /* { dg-final { cleanup-tree-dump "ldist" } } */
...@@ -542,17 +542,19 @@ already_processed_vertex_p (bitmap processed, int v) ...@@ -542,17 +542,19 @@ already_processed_vertex_p (bitmap processed, int v)
|| !bitmap_bit_p (remaining_stmts, v)); || !bitmap_bit_p (remaining_stmts, v));
} }
/* Returns NULL when there is no anti-dependence among the successors /* Returns NULL when there is no anti-dependence or output-dependence
of vertex V, otherwise returns the edge with the anti-dep. */ among the successors of vertex V, otherwise returns the edge with the
dependency. */
static struct graph_edge * static struct graph_edge *
has_anti_dependence (struct vertex *v) has_anti_or_output_dependence (struct vertex *v)
{ {
struct graph_edge *e; struct graph_edge *e;
if (v->succ) if (v->succ)
for (e = v->succ; e; e = e->succ_next) 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 e;
return NULL; return NULL;
...@@ -604,11 +606,10 @@ mark_nodes_having_upstream_mem_writes (struct graph *rdg) ...@@ -604,11 +606,10 @@ mark_nodes_having_upstream_mem_writes (struct graph *rdg)
|| predecessor_has_mem_write (rdg, &(rdg->vertices[x])) || predecessor_has_mem_write (rdg, &(rdg->vertices[x]))
/* In anti dependences the read should occur before /* In anti dependences the read should occur before
the write, this is why both the read and the write the write, this is why both the read and the write
should be placed in the same partition. */ should be placed in the same partition. In output
|| has_anti_dependence (&(rdg->vertices[x]))) dependences the writes order need to be preserved. */
{ || has_anti_or_output_dependence (&(rdg->vertices[x])))
bitmap_set_bit (upstream_mem_writes, x); bitmap_set_bit (upstream_mem_writes, x);
}
} }
nodes.release (); nodes.release ();
...@@ -637,7 +638,7 @@ rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops, ...@@ -637,7 +638,7 @@ rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops,
use_operand_p use_p; use_operand_p use_p;
struct vertex *x = &(rdg->vertices[u]); struct vertex *x = &(rdg->vertices[u]);
gimple stmt = RDGV_STMT (x); 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, /* Keep in the same partition the destination of an antidependence,
because this is a store to the exact same location. Putting this because this is a store to the exact same location. Putting this
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment