diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr95804.c | 18 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 21 |
2 files changed, 36 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr95804.c b/gcc/testsuite/gcc.dg/tree-ssa/pr95804.c new file mode 100644 index 0000000..83c0ab4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr95804.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/95804 */ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +int a, b, c, d, e, f; +void g() { + short *h = (short*)&d; + char *i = (char*)&b; + for (; e; e++) { + for (; f; f++) { + b = 3; + if ((c = 8) >= *i) + a = 5 ? *h : 0; + h = (short*)g; + } + i = (char*)&c; + } +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 9bc94e5..888af48 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -2509,10 +2509,25 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg, } } /* Restore the postorder information if it's corrupted in finding SCC - with alias dependence edges skipped. */ + with alias dependence edges skipped. If reduction partition's SCC is + broken by runtime alias checks, we force a negative post order to it + making sure it will be scheduled in the last. */ if (num_sccs_no_alias > 0) - for (i = 0; i < pg->n_vertices; ++i) - pg->vertices[i].post = cbdata.vertices_post[i]; + { + j = -1; + for (i = 0; i < pg->n_vertices; ++i) + { + pg->vertices[i].post = cbdata.vertices_post[i]; + struct pg_vdata *data = (struct pg_vdata *)pg->vertices[i].data; + if (data->partition && partition_reduction_p (data->partition)) + { + gcc_assert (j == -1); + j = i; + } + } + if (j >= 0) + pg->vertices[j].post = -1; + } free (cbdata.vertices_component); free (cbdata.vertices_post); |