diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2004-04-23 22:01:35 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2004-04-23 22:01:35 +0000 |
commit | 1548580c20926cec85916f89a029d6c3946c9961 (patch) | |
tree | 23910f8a83c06830e31193db62701766afc5624d /gcc/cfgloopmanip.c | |
parent | 5a944040b849f4834d7b07f9025e8aee5c6ff7c4 (diff) | |
download | gcc-1548580c20926cec85916f89a029d6c3946c9961.tar.gz |
re PR rtl-optimization/13985 (ICE in gcc.c-torture/compile/930621-1.c)
PR optimization/13985
* cfgloopmanip.c (fix_loop_placements): New prototype.
Call fix_bb_placements on the preheader of loops that have
been reparented.
(remove_path): Adjust call to fix_loop_placements.
From-SVN: r81112
Diffstat (limited to 'gcc/cfgloopmanip.c')
-rw-r--r-- | gcc/cfgloopmanip.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 59ae4a1ed7a..e3807801d23 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -41,7 +41,7 @@ static bool rpe_enum_p (basic_block, void *); static int find_path (edge, basic_block **); static bool alp_enum_p (basic_block, void *); static void add_loop (struct loops *, struct loop *); -static void fix_loop_placements (struct loop *); +static void fix_loop_placements (struct loops *, struct loop *); static bool fix_bb_placement (struct loops *, basic_block); static void fix_bb_placements (struct loops *, basic_block); static void place_new_loop (struct loops *, struct loop *); @@ -413,7 +413,7 @@ remove_path (struct loops *loops, edge e) /* Fix placements of basic blocks inside loops and the placement of loops in the loop tree. */ fix_bb_placements (loops, from); - fix_loop_placements (from->loop_father); + fix_loop_placements (loops, from->loop_father); return true; } @@ -668,7 +668,7 @@ fix_loop_placement (struct loop *loop) It is used in case when we removed some edges coming out of LOOP, which may cause the right placement of LOOP inside loop tree to change. */ static void -fix_loop_placements (struct loop *loop) +fix_loop_placements (struct loops *loops, struct loop *loop) { struct loop *outer; @@ -677,6 +677,13 @@ fix_loop_placements (struct loop *loop) outer = loop->outer; if (!fix_loop_placement (loop)) break; + + /* Changing the placement of a loop in the loop tree may alter the + validity of condition 2) of the description of fix_bb_placement + for its preheader, because the successor is the header and belongs + to the loop. So call fix_bb_placements to fix up the placement + of the preheader and (possibly) of its predecessors. */ + fix_bb_placements (loops, loop_preheader_edge (loop)->src); loop = outer; } } |