aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-invariant.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-04 08:54:42 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-11-04 08:54:42 +0000
commit964ef24cd591632a38c3e48154de389470df13df (patch)
tree1b2211b7c396c888eb15aa2da13e53fad2848ab5 /gcc/loop-invariant.c
parentb07aafb1ace3bf542acf3884bddf014d0d466ef3 (diff)
downloadgcc-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.c18
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;
}