mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-27 21:15:20 +08:00
re PR tree-optimization/56264 (ICE in check_loop_closed_ssa_use, at tree-ssa-loop-manip.c:557)
2013-02-11 Richard Biener <rguenther@suse.de> PR tree-optimization/56264 * cfgloop.h (fix_loop_structure): Adjust prototype. * loop-init.c (fix_loop_structure): Return the number of newly discovered loops. * tree-cfgcleanup.c (repair_loop_structures): When new loops are discovered, do a full loop-closed SSA rewrite. * gcc.dg/torture/pr56264.c: New testcase. From-SVN: r195941
This commit is contained in:
parent
b4a4b56dc7
commit
8e89b5b5fb
@ -1,3 +1,12 @@
|
||||
2013-02-11 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/56264
|
||||
* cfgloop.h (fix_loop_structure): Adjust prototype.
|
||||
* loop-init.c (fix_loop_structure): Return the number of
|
||||
newly discovered loops.
|
||||
* tree-cfgcleanup.c (repair_loop_structures): When new loops
|
||||
are discovered, do a full loop-closed SSA rewrite.
|
||||
|
||||
2013-02-11 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/56273
|
||||
|
@ -216,7 +216,7 @@ extern void flow_loop_dump (const struct loop *, FILE *,
|
||||
struct loop *alloc_loop (void);
|
||||
extern void flow_loop_free (struct loop *);
|
||||
int flow_loop_nodes_find (basic_block, struct loop *);
|
||||
void fix_loop_structure (bitmap changed_bbs);
|
||||
unsigned fix_loop_structure (bitmap changed_bbs);
|
||||
bool mark_irreducible_loops (void);
|
||||
void release_recorded_exits (void);
|
||||
void record_loop_exits (void);
|
||||
|
@ -171,16 +171,19 @@ loop_fini_done:
|
||||
the latch, and loops did not get new subloops (new loops might possibly
|
||||
get created, but we are not interested in them). Fix up the mess.
|
||||
|
||||
If CHANGED_BBS is not NULL, basic blocks whose loop has changed are
|
||||
marked in it. */
|
||||
If CHANGED_BBS is not NULL, basic blocks whose loop depth has changed are
|
||||
marked in it.
|
||||
|
||||
void
|
||||
Returns the number of new discovered loops. */
|
||||
|
||||
unsigned
|
||||
fix_loop_structure (bitmap changed_bbs)
|
||||
{
|
||||
basic_block bb;
|
||||
int record_exits = 0;
|
||||
loop_iterator li;
|
||||
struct loop *loop;
|
||||
unsigned old_nloops;
|
||||
|
||||
timevar_push (TV_LOOP_INIT);
|
||||
|
||||
@ -228,6 +231,10 @@ fix_loop_structure (bitmap changed_bbs)
|
||||
delete_loop (loop);
|
||||
}
|
||||
|
||||
/* Remember the number of loops so we can return how many new loops
|
||||
flow_loops_find discovered. */
|
||||
old_nloops = number_of_loops ();
|
||||
|
||||
/* Re-compute loop structure in-place. */
|
||||
flow_loops_find (current_loops);
|
||||
|
||||
@ -253,6 +260,8 @@ fix_loop_structure (bitmap changed_bbs)
|
||||
#endif
|
||||
|
||||
timevar_pop (TV_LOOP_INIT);
|
||||
|
||||
return number_of_loops () - old_nloops;
|
||||
}
|
||||
|
||||
/* Gate for the RTL loop superpass. The actual passes are subpasses.
|
||||
|
@ -1,3 +1,8 @@
|
||||
2013-02-11 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/56264
|
||||
* gcc.dg/torture/pr56264.c: New testcase.
|
||||
|
||||
2013-02-11 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/56273
|
||||
|
20
gcc/testsuite/gcc.dg/torture/pr56264.c
Normal file
20
gcc/testsuite/gcc.dg/torture/pr56264.c
Normal file
@ -0,0 +1,20 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-funswitch-loops" } */
|
||||
|
||||
int a, b, c;
|
||||
|
||||
void f(void)
|
||||
{
|
||||
if(b)
|
||||
{
|
||||
for(a = 0; a < 1; a++)
|
||||
lbl:
|
||||
c = c && b ? : 0;
|
||||
|
||||
c = 0;
|
||||
goto lbl;
|
||||
}
|
||||
|
||||
if(a)
|
||||
goto lbl;
|
||||
}
|
@ -707,18 +707,22 @@ static void
|
||||
repair_loop_structures (void)
|
||||
{
|
||||
bitmap changed_bbs;
|
||||
unsigned n_new_loops;
|
||||
|
||||
calculate_dominance_info (CDI_DOMINATORS);
|
||||
|
||||
timevar_push (TV_REPAIR_LOOPS);
|
||||
changed_bbs = BITMAP_ALLOC (NULL);
|
||||
fix_loop_structure (changed_bbs);
|
||||
n_new_loops = fix_loop_structure (changed_bbs);
|
||||
|
||||
/* This usually does nothing. But sometimes parts of cfg that originally
|
||||
were inside a loop get out of it due to edge removal (since they
|
||||
become unreachable by back edges from latch). */
|
||||
become unreachable by back edges from latch). Also a former
|
||||
irreducible loop can become reducible - in this case force a full
|
||||
rewrite into loop-closed SSA form. */
|
||||
if (loops_state_satisfies_p (LOOP_CLOSED_SSA))
|
||||
rewrite_into_loop_closed_ssa (changed_bbs, TODO_update_ssa);
|
||||
rewrite_into_loop_closed_ssa (n_new_loops ? NULL : changed_bbs,
|
||||
TODO_update_ssa);
|
||||
|
||||
BITMAP_FREE (changed_bbs);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user