This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Improve handling of threads which cross over the current loops header
- From: Jeff Law <law at redhat dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 25 Nov 2013 11:25:04 -0700
- Subject: Re: [PATCH] Improve handling of threads which cross over the current loops header
- Authentication-results: sourceware.org; auth=none
- References: <528F0C4E dot 5050902 at redhat dot com> <CAFiYyc0FnL0nosr=5ZJKqt4pTVn+B=bC8hw-Q=f+R+1KS5RXiQ at mail dot gmail dot com> <528F7CBF dot 5010109 at redhat dot com> <627de6aa-c058-4443-8399-d1f1cc3c3cbb at email dot android dot com>
On 11/22/13 08:56, Richard Biener wrote:
So the issue here is we can create irreducible regions & new nested
loops. Does just setting the header,latch fields for the current loop
handle those cases?
Yes.
Fixed via the attached patch.
Bootstrapped and regression tested on x86_64-unknown-linux-gnu. Also
tested by removing the requirement that the loop header contain a
multi-way branch, bootstrapping and testing that compiler as well.
Installed on the trunk.
Jeff
* tree-ssa-threadupdate.c (thread_through_all_blocks): Selectively
invalidate loop information.
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index ee0c838..1a52e47 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -1579,7 +1579,6 @@ thread_through_all_blocks (bool may_peel_loop_headers)
bitmap_iterator bi;
bitmap threaded_blocks;
struct loop *loop;
- bool totally_clobbered_loops = false;
/* We must know about loops in order to preserve them. */
gcc_assert (current_loops != NULL);
@@ -1675,9 +1674,15 @@ thread_through_all_blocks (bool may_peel_loop_headers)
/* Our path is still valid, thread it. */
if (e->aux)
{
- totally_clobbered_loops
- |= thread_block ((*path)[0]->e->dest, false);
+ struct loop *loop = (*path)[0]->e->dest->loop_father;
+
+ retval |= thread_block ((*path)[0]->e->dest, false);
e->aux = NULL;
+
+ /* This jump thread likely totally scrambled this loop.
+ So arrange for it to be fixed up. */
+ loop->header = NULL;
+ loop->latch = NULL;
}
}
else
@@ -1700,32 +1705,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
threaded_blocks = NULL;
paths.release ();
- /* If we made changes to the CFG that might have totally messed
- up the loop structure, then drop the old loop structure and
- rebuild. */
- if (totally_clobbered_loops)
- {
- /* Release the current loop structures, they are totally
- clobbered at this point. */
- loop_optimizer_finalize ();
- current_loops = NULL;
-
- /* Similarly for dominance information. */
- free_dominance_info (CDI_DOMINATORS);
- free_dominance_info (CDI_POST_DOMINATORS);
-
- /* Before we can rebuild the loop structures, we need dominators,
- which requires no unreachable code. So remove unreachable code. */
- delete_unreachable_blocks ();
-
- /* Now rebuild the loop structures. */
- cfun->curr_properties &= ~PROP_loops;
- loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
- cfun->curr_properties |= PROP_loops;
- retval = 1;
- }
-
- if (retval && current_loops)
+ if (retval)
loops_state_set (LOOPS_NEED_FIXUP);
return retval;