diff mbox

[PR81369/02] Conservatively not distribute loop with unknown niters

Message ID VI1PR0802MB2176C351CC0D2669CE612E10E7AD0@VI1PR0802MB2176.eurprd08.prod.outlook.com
State New
Headers show

Commit Message

Bin Cheng July 14, 2017, 2:32 p.m. UTC
Hi,
This is a followup patch for previous fix to PR81369.  In that test case, GCC
tries to distribute infinite loop, which doesn't make much sense.  This patch
works conservatively by skipping loops with unknown niters.  It also simplifies
code a bit.
Bootstrap and test on x86_64 and AArch64, is it OK?

Thanks,
bin
2017-07-12  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.

Comments

Richard Biener July 17, 2017, 10:12 a.m. UTC | #1
On Fri, Jul 14, 2017 at 4:32 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
> Hi,
> This is a followup patch for previous fix to PR81369.  In that test case, GCC
> tries to distribute infinite loop, which doesn't make much sense.  This patch
> works conservatively by skipping loops with unknown niters.  It also simplifies
> code a bit.
> Bootstrap and test on x86_64 and AArch64, is it OK?

Ok.

Thanks,
Richard.

> Thanks,
> bin
> 2017-07-12  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.
diff mbox

Patch

From b96c0053b79fd457df1fdb91c4401a1a7ccace7d Mon Sep 17 00:00:00 2001
From: Bin Cheng <binche01@e108451-lin.cambridge.arm.com>
Date: Wed, 12 Jul 2017 12:30:12 +0100
Subject: [PATCH 2/2] skip-loop-with-unknown-niters.txt

---
 gcc/tree-loop-distribution.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index fe678a5..497e6a9 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);
     }
 
@@ -2653,6 +2647,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)
-- 
1.9.1