diff options
author | Bin Cheng <bin.cheng@arm.com> | 2017-07-17 11:40:54 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2017-07-17 11:40:54 +0000 |
commit | 6ff37519800c8826818929eccef30412bc530483 (patch) | |
tree | 731570b0db7b2f7dd2ccd7d32befa62a3e732a96 /gcc/tree-loop-distribution.c | |
parent | aa1528b5c91bd9fee1a7de9c6ebc28eff5040afd (diff) | |
download | gcc-6ff37519800c8826818929eccef30412bc530483.zip gcc-6ff37519800c8826818929eccef30412bc530483.tar.gz gcc-6ff37519800c8826818929eccef30412bc530483.tar.bz2 |
re PR tree-optimization/81369 (ICE in generate_code_for_partition)
PR target/81369
* tree-loop-distribution.c (classify_partition): Only assert on
numer of iterations.
(merge_dep_scc_partitions): Delete prameter. Update function call.
(distribute_loop): Remove code handling loop with unknown niters.
(pass_loop_distribution::execute): Skip loop with unknown niters.
From-SVN: r250270
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 9363c1d..8d80ccc 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -1412,8 +1412,7 @@ classify_partition (loop_p loop, struct graph *rdg, partition *partition, return; nb_iter = number_of_latch_executions (loop); - if (!nb_iter || nb_iter == chrec_dont_know) - return; + gcc_assert (nb_iter && nb_iter != chrec_dont_know); if (dominated_by_p (CDI_DOMINATORS, single_exit (loop)->src, gimple_bb (DR_STMT (single_store)))) plus_one = true; @@ -1962,18 +1961,16 @@ sort_partitions_by_post_order (struct graph *pg, } /* Given reduced dependence graph RDG merge strong connected components - of PARTITIONS. If IGNORE_ALIAS_P is true, data dependence caused by - possible alias between references is ignored, as if it doesn't exist - at all; otherwise all depdendences are considered. */ + of PARTITIONS. In this function, data dependence caused by possible + alias between references is ignored, as if it doesn't exist at all. */ static void merge_dep_scc_partitions (struct graph *rdg, - vec<struct partition *> *partitions, - bool ignore_alias_p) + vec<struct partition *> *partitions) { struct partition *partition1, *partition2; struct pg_vdata *data; - graph *pg = build_partition_graph (rdg, partitions, ignore_alias_p); + graph *pg = build_partition_graph (rdg, partitions, true); int i, j, num_sccs = graphds_scc (pg, NULL); /* Strong connected compoenent means dependence cycle, we cannot distribute @@ -2420,9 +2417,6 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, auto_vec<struct partition *, 3> partitions; rdg_build_partitions (rdg, stmts, &partitions); - /* Can't do runtime alias check if loop niter is unknown. */ - tree niters = number_of_latch_executions (loop); - bool rt_alias_check_p = (niters != NULL_TREE && niters != chrec_dont_know); auto_vec<ddr_p> alias_ddrs; auto_bitmap stmt_in_all_partitions; @@ -2511,9 +2505,9 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, /* Build the partition dependency graph. */ if (partitions.length () > 1) { - merge_dep_scc_partitions (rdg, &partitions, rt_alias_check_p); + merge_dep_scc_partitions (rdg, &partitions); alias_ddrs.truncate (0); - if (rt_alias_check_p && partitions.length () > 1) + if (partitions.length () > 1) break_alias_scc_partitions (rdg, &partitions, &alias_ddrs); } @@ -2654,6 +2648,11 @@ pass_loop_distribution::execute (function *fun) if (!optimize_loop_for_speed_p (loop)) continue; + /* Don't distribute loop if niters is unknown. */ + tree niters = number_of_latch_executions (loop); + if (niters == NULL_TREE || niters == chrec_dont_know) + continue; + /* Initialize the worklist with stmts we seed the partitions with. */ bbs = get_loop_body_in_dom_order (loop); for (i = 0; i < loop->num_nodes; ++i) |