From dd21b03900085c4d60bf03207ad28bcbfbc86a4b Mon Sep 17 00:00:00 2001 From: Bin Cheng Date: Thu, 9 Jul 2020 18:10:03 +0800 Subject: [PATCH] Schedule reduction partition in the last. If reduction partition's SCC is broken by runtime alias checks, force a negative post order to it so that it will be scheduled in the last. 2020-07-09 Bin Cheng gcc/ PR tree-optimization/95804 * tree-loop-distribution.c (break_alias_scc_partitions): Force negative post order to reduction partition. gcc/testsuite/ PR tree-optimization/95804 * gcc.dg/tree-ssa/pr95804.c: New test. --- gcc/testsuite/gcc.dg/tree-ssa/pr95804.c | 18 ++++++++++++++++++ gcc/tree-loop-distribution.c | 21 ++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr95804.c 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 00000000000..83c0ab45cf5 --- /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 9bc94e56a95..888af48946f 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); -- 2.30.2