re PR tree-optimization/81369 (ICE in generate_code_for_partition)
authorBin Cheng <bin.cheng@arm.com>
Mon, 17 Jul 2017 11:40:54 +0000 (11:40 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Mon, 17 Jul 2017 11:40:54 +0000 (11:40 +0000)
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

gcc/ChangeLog
gcc/tree-loop-distribution.c

index 1b82678..ce0b6cc 100644 (file)
@@ -1,6 +1,15 @@
 2017-07-17  Bin Cheng  <bin.cheng@arm.com>
 
        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.
+
+2017-07-17  Bin Cheng  <bin.cheng@arm.com>
+
+       PR target/81369
        * tree-loop-distribution.c (merge_dep_scc_partitions): Sink call to
        function sort_partitions_by_post_order.
 
index 9363c1d..8d80ccc 100644 (file)
@@ -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)