This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Do not allow irreducible loops/regions in a scop
- From: Sebastian Pop <sebpop at gmail dot com>
- To: Aditya Kumar <aditya dot k7 at samsung dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>, Tobias Grosser <tobias at grosser dot es>
- Cc: Sebastian Paul Pop <s dot pop at samsung dot com>
- Date: Fri, 6 Nov 2015 05:49:53 -0800
- Subject: Re: [PATCH] Do not allow irreducible loops/regions in a scop
- Authentication-results: sourceware.org; auth=none
- References: <1446790341-12347-1-git-send-email-aditya dot k7 at samsung dot com>
On Thu, Nov 5, 2015 at 10:12 PM, Aditya Kumar <aditya.k7@samsung.com> wrote:
> Irreducible regions are not going to be optimized by ISL
> so discard them early.
>
> gcc/ChangeLog:
>
> 2015-11-06 Aditya Kumar <aditya.k7@samsung.com>
>
> * graphite-scop-detection.c (scop_detection::merge_sese):
> (scop_detection::can_represent_loop_1):
> (scop_detection::harmful_stmt_in_region):
Ok.
I will add "Check flag *_IRREDUCIBLE_LOOP." to the changelog before committing.
Thanks for taking care of this.
Sebastian
>
>
> ---
> gcc/graphite-scop-detection.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
> index 8d67883..4e19b63 100644
> --- a/gcc/graphite-scop-detection.c
> +++ b/gcc/graphite-scop-detection.c
> @@ -605,7 +605,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,
> @@ -614,7 +615,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);
> @@ -734,6 +736,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))
> @@ -864,6 +867,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;
> }
> --
> 2.1.0.243.g30d45f7
>