diff options
author | Richard Biener <rguenther@suse.de> | 2017-07-25 13:24:51 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-07-25 13:24:51 +0000 |
commit | 1aa54f90e68dc927e80e14c7e4bf9b42525e3c76 (patch) | |
tree | 2b8bb2985d182e0067a33a9d5b70c12080b8464d /gcc/tree-ssa-loop-unswitch.c | |
parent | e294f495894cd2d9e217565e340284b2edda4671 (diff) | |
download | gcc-1aa54f90e68dc927e80e14c7e4bf9b42525e3c76.zip gcc-1aa54f90e68dc927e80e14c7e4bf9b42525e3c76.tar.gz gcc-1aa54f90e68dc927e80e14c7e4bf9b42525e3c76.tar.bz2 |
re PR tree-optimization/81455 (Compile-time hog w/ -O1 -funswitch-loops)
2017-07-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/81455
* tree-ssa-loop-unswitch.c (find_loop_guard): Make sure to
not walk in cycles when looking for guards.
* gcc.dg/pr81455.c: New testcase.
From-SVN: r250518
Diffstat (limited to 'gcc/tree-ssa-loop-unswitch.c')
-rw-r--r-- | gcc/tree-ssa-loop-unswitch.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c index 204cd0d..57aba4f 100644 --- a/gcc/tree-ssa-loop-unswitch.c +++ b/gcc/tree-ssa-loop-unswitch.c @@ -582,8 +582,9 @@ find_loop_guard (struct loop *loop) gcond *cond; do { + basic_block next = NULL; if (single_succ_p (header)) - header = single_succ (header); + next = single_succ (header); else { cond = dyn_cast <gcond *> (last_stmt (header)); @@ -593,12 +594,16 @@ find_loop_guard (struct loop *loop) /* Make sure to skip earlier hoisted guards that are left in place as if (true). */ if (gimple_cond_true_p (cond)) - header = te->dest; + next = te->dest; else if (gimple_cond_false_p (cond)) - header = fe->dest; + next = fe->dest; else break; } + /* Never traverse a backedge. */ + if (header->loop_father->header == next) + return NULL; + header = next; } while (1); if (!flow_bb_inside_loop_p (loop, te->dest) |