summaryrefslogtreecommitdiff
path: root/gcc/tree-loop-distribution.c
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2017-07-17 11:40:54 +0000
committerBin Cheng <amker@gcc.gnu.org>2017-07-17 11:40:54 +0000
commit6ff37519800c8826818929eccef30412bc530483 (patch)
tree731570b0db7b2f7dd2ccd7d32befa62a3e732a96 /gcc/tree-loop-distribution.c
parentaa1528b5c91bd9fee1a7de9c6ebc28eff5040afd (diff)
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.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index 9363c1de683..8d80cccf38f 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)