diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-11 15:07:40 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-11 15:07:40 +0000 |
commit | b6f3c6f1b86fd50a17464a642d557b8dac852eab (patch) | |
tree | 51f6d16e5f451e7162e917a8e60c40e7bd15004f /gcc/tree-cfgcleanup.c | |
parent | 4d73937862a9c0ec5ae01927f946f0ccadc4b961 (diff) | |
download | gcc-b6f3c6f1b86fd50a17464a642d557b8dac852eab.tar.gz |
2013-02-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/56264
* cfgloop.h (fix_loop_structure): Adjust prototype.
* loop-init.c (fix_loop_structure): Return the number of
newly discovered loops.
* tree-cfgcleanup.c (repair_loop_structures): When new loops
are discovered, do a full loop-closed SSA rewrite.
* gcc.dg/torture/pr56264.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195941 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-cfgcleanup.c')
-rw-r--r-- | gcc/tree-cfgcleanup.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index b26281d48f9..94e616b7cf6 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -707,18 +707,22 @@ static void repair_loop_structures (void) { bitmap changed_bbs; + unsigned n_new_loops; calculate_dominance_info (CDI_DOMINATORS); timevar_push (TV_REPAIR_LOOPS); changed_bbs = BITMAP_ALLOC (NULL); - fix_loop_structure (changed_bbs); + n_new_loops = fix_loop_structure (changed_bbs); /* This usually does nothing. But sometimes parts of cfg that originally were inside a loop get out of it due to edge removal (since they - become unreachable by back edges from latch). */ + become unreachable by back edges from latch). Also a former + irreducible loop can become reducible - in this case force a full + rewrite into loop-closed SSA form. */ if (loops_state_satisfies_p (LOOP_CLOSED_SSA)) - rewrite_into_loop_closed_ssa (changed_bbs, TODO_update_ssa); + rewrite_into_loop_closed_ssa (n_new_loops ? NULL : changed_bbs, + TODO_update_ssa); BITMAP_FREE (changed_bbs); |