diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-02-26 18:17:02 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-02-26 18:17:02 +0000 |
commit | 565f533b99aaf023c3a185fee92273fc0835912b (patch) | |
tree | 31ef9d5cee18591d47b3be8f38ab372849e71b59 /gcc/cfghooks.c | |
parent | ff67cbeae73817e2e6a98aab939de3207c47b33f (diff) | |
download | gcc-565f533b99aaf023c3a185fee92273fc0835912b.tar.gz |
PR tree-optimization/69740
* cfghooks.c (remove_edge): Request loop fixups if we delete
an edge that might turn an irreducible loop into a natural
loop.
PR tree-optimization/69740
* gcc.c-torture/compile/pr69740-1.c: New test.
* gcc.c-torture/compile/pr69740-2.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233754 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfghooks.c')
-rw-r--r-- | gcc/cfghooks.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index bbb1017fd1f..06c05d1fb39 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -408,7 +408,20 @@ void remove_edge (edge e) { if (current_loops != NULL) - rescan_loop_exit (e, false, true); + { + rescan_loop_exit (e, false, true); + + /* Removal of an edge inside an irreducible region or which leads + to an irreducible region can turn the region into a natural loop. + In that case, ask for the loop structure fixups. + + FIXME: Note that LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS is not always + set, so always ask for fixups when removing an edge in that case. */ + if (!loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS) + || (e->flags & EDGE_IRREDUCIBLE_LOOP) + || (e->dest->flags & BB_IRREDUCIBLE_LOOP)) + loops_state_set (LOOPS_NEED_FIXUP); + } /* This is probably not needed, but it doesn't hurt. */ /* FIXME: This should be called via a remove_edge hook. */ |