From 1167ebe707eae615a2d16fe06edf5e1904a71c33 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Fri, 6 Nov 2015 20:43:40 +0000 Subject: [PATCH] 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 * 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 From-SVN: r229888 --- gcc/ChangeLog | 10 ++++++++++ gcc/graphite-scop-detection.c | 11 +++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fe6742545b..906dc9449f4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2015-11-06 Aditya Kumar + Sebastian Pop + + * 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 * config/aarch64/aarch64-simd-builtins.def: Update builtins diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index ae8497db79d..b1f2ebc20a2 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; }