diff options
author | Richard Biener <rguenther@suse.de> | 2016-11-04 08:54:42 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-11-04 08:54:42 +0000 |
commit | 964ef24cd591632a38c3e48154de389470df13df (patch) | |
tree | 1b2211b7c396c888eb15aa2da13e53fad2848ab5 /gcc/loop-invariant.c | |
parent | b07aafb1ace3bf542acf3884bddf014d0d466ef3 (diff) | |
download | gcc-964ef24cd591632a38c3e48154de389470df13df.zip gcc-964ef24cd591632a38c3e48154de389470df13df.tar.gz gcc-964ef24cd591632a38c3e48154de389470df13df.tar.bz2 |
re PR tree-optimization/78185 (Wrong branch optimization with -O1 on x86/x86_64)
2016-11-04 Richard Biener <rguenther@suse.de>
PR middle-end/78185
* loop-invariant.c (find_exits): Record entering inner
loops as possibly exiting to handle infinite sub-loops.
* tree-ssa-loop-im.c: Include tree-ssa-loop-niter.h.
(fill_always_executed_in_1): Honor infinite child loops.
* gcc.dg/pr78185.c: New testcase.
From-SVN: r241841
Diffstat (limited to 'gcc/loop-invariant.c')
-rw-r--r-- | gcc/loop-invariant.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index 551103f..f617241 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -598,13 +598,17 @@ find_exits (struct loop *loop, basic_block *body, FOR_EACH_EDGE (e, ei, body[i]->succs) { - if (flow_bb_inside_loop_p (loop, e->dest)) - continue; - - bitmap_set_bit (may_exit, i); - bitmap_set_bit (has_exit, i); - outermost_exit = find_common_loop (outermost_exit, - e->dest->loop_father); + if (! flow_bb_inside_loop_p (loop, e->dest)) + { + bitmap_set_bit (may_exit, i); + bitmap_set_bit (has_exit, i); + outermost_exit = find_common_loop (outermost_exit, + e->dest->loop_father); + } + /* If we enter a subloop that might never terminate treat + it like a possible exit. */ + if (flow_loop_nested_p (loop, e->dest->loop_father)) + bitmap_set_bit (may_exit, i); } continue; } |