aboutsummaryrefslogtreecommitdiff
path: root/gcc/graphite-scop-detection.c
diff options
context:
space:
mode:
authorAditya Kumar <aditya.k7@samsung.com>2015-11-06 20:43:40 +0000
committerSebastian Pop <spop@gcc.gnu.org>2015-11-06 20:43:40 +0000
commit1167ebe707eae615a2d16fe06edf5e1904a71c33 (patch)
tree6cb38401e77fb6ba8686e86148a6707ec4590709 /gcc/graphite-scop-detection.c
parent246cc0600251b3c8e2e237a55270816cdd5a8ad2 (diff)
downloadgcc-1167ebe707eae615a2d16fe06edf5e1904a71c33.zip
gcc-1167ebe707eae615a2d16fe06edf5e1904a71c33.tar.gz
gcc-1167ebe707eae615a2d16fe06edf5e1904a71c33.tar.bz2
Do not allow irreducible loops/regions in a scop
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
Diffstat (limited to 'gcc/graphite-scop-detection.c')
-rw-r--r--gcc/graphite-scop-detection.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index ae8497d..b1f2ebc 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -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;
}