Do not allow irreducible loops/regions in a scop
authorAditya Kumar <aditya.k7@samsung.com>
Fri, 6 Nov 2015 20:43:40 +0000 (20:43 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Fri, 6 Nov 2015 20:43:40 +0000 (20:43 +0000)
Irreducible regions are not going to be optimized by ISL
so discard them early. Passes bootstrap and regtest.

gcc/ChangeLog:

2015-11-06  Aditya Kumar  <aditya.k7@samsung.com>

        * graphite-scop-detection.c (scop_detection::merge_sese): Entry and exit edges should not be a part of irreducible loop.
        (scop_detection::can_represent_loop_1): Loops should not be irreducible.
        (scop_detection::harmful_stmt_in_region): All the basic block should belong to reducible loops.

Co-Authored-By: Sebastian Pop <s.pop@samsung.com>
From-SVN: r229888

gcc/ChangeLog
gcc/graphite-scop-detection.c

index 3fe6742545bfb844fd151ff74e231e4e5ddb3072..906dc9449f4c7ad738843e827e5533957ef375f5 100644 (file)
@@ -1,3 +1,13 @@
+2015-11-06  Aditya Kumar  <aditya.k7@samsung.com>
+           Sebastian Pop  <s.pop@samsung.com>
+
+        * graphite-scop-detection.c (scop_detection::merge_sese): Entry
+       and exit edges should not be a part of irreducible loop.
+        (scop_detection::can_represent_loop_1): Loops should not be
+       irreducible.
+        (scop_detection::harmful_stmt_in_region): All the basic block
+       should belong to reducible loops.
+
 2015-11-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
        * config/aarch64/aarch64-simd-builtins.def: Update builtins
index ae8497db79da814cd6f07b102071510df44c851b..b1f2ebc20a23dd29accf0c3c83d179ff139ac1c9 100644 (file)
@@ -794,7 +794,8 @@ scop_detection::merge_sese (sese_l first, sese_l second) const
                                              get_entry_bb (second));
 
   edge entry = get_nearest_dom_with_single_entry (dom);
-  if (!entry)
+
+  if (!entry || (entry->flags & EDGE_IRREDUCIBLE_LOOP))
     return invalid_sese;
 
   basic_block pdom = nearest_common_dominator (CDI_POST_DOMINATORS,
@@ -803,7 +804,8 @@ scop_detection::merge_sese (sese_l first, sese_l second) const
   pdom = nearest_common_dominator (CDI_POST_DOMINATORS, dom, pdom);
 
   edge exit = get_nearest_pdom_with_single_exit (pdom);
-  if (!exit)
+
+  if (!exit || (exit->flags & EDGE_IRREDUCIBLE_LOOP))
     return invalid_sese;
 
   sese_l combined (entry, exit);
@@ -923,6 +925,7 @@ scop_detection::can_represent_loop_1 (loop_p loop, sese_l scop)
   struct tree_niter_desc niter_desc;
 
   return single_exit (loop)
+    && !(loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)
     && number_of_iterations_exit (loop, single_exit (loop), &niter_desc, false)
     && niter_desc.control.no_overflow
     && (niter = number_of_latch_executions (loop))
@@ -1053,6 +1056,10 @@ scop_detection::harmful_stmt_in_region (sese_l scop) const
       if (!dominated_by_p (CDI_POST_DOMINATORS, bb, exit_bb))
        continue;
 
+      /* The basic block should not be part of an irreducible loop.  */
+      if (bb->flags & BB_IRREDUCIBLE_LOOP)
+        return true;
+
       if (harmful_stmt_in_bb (scop, bb))
        return true;
     }