Commit 8e89b5b5 by Richard Biener Committed by Richard Biener

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
parent b4a4b56d
2013-02-11 Richard Biener <rguenther@suse.de> 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 PR tree-optimization/56273
* tree-vrp.c (simplify_cond_using_ranges): Disable for the * tree-vrp.c (simplify_cond_using_ranges): Disable for the
first VRP run. first VRP run.
......
...@@ -216,7 +216,7 @@ extern void flow_loop_dump (const struct loop *, FILE *, ...@@ -216,7 +216,7 @@ extern void flow_loop_dump (const struct loop *, FILE *,
struct loop *alloc_loop (void); struct loop *alloc_loop (void);
extern void flow_loop_free (struct loop *); extern void flow_loop_free (struct loop *);
int flow_loop_nodes_find (basic_block, 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); bool mark_irreducible_loops (void);
void release_recorded_exits (void); void release_recorded_exits (void);
void record_loop_exits (void); void record_loop_exits (void);
......
...@@ -171,16 +171,19 @@ loop_fini_done: ...@@ -171,16 +171,19 @@ loop_fini_done:
the latch, and loops did not get new subloops (new loops might possibly 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. 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 If CHANGED_BBS is not NULL, basic blocks whose loop depth has changed are
marked in it. */ marked in it.
void Returns the number of new discovered loops. */
unsigned
fix_loop_structure (bitmap changed_bbs) fix_loop_structure (bitmap changed_bbs)
{ {
basic_block bb; basic_block bb;
int record_exits = 0; int record_exits = 0;
loop_iterator li; loop_iterator li;
struct loop *loop; struct loop *loop;
unsigned old_nloops;
timevar_push (TV_LOOP_INIT); timevar_push (TV_LOOP_INIT);
...@@ -228,6 +231,10 @@ fix_loop_structure (bitmap changed_bbs) ...@@ -228,6 +231,10 @@ fix_loop_structure (bitmap changed_bbs)
delete_loop (loop); 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. */ /* Re-compute loop structure in-place. */
flow_loops_find (current_loops); flow_loops_find (current_loops);
...@@ -253,6 +260,8 @@ fix_loop_structure (bitmap changed_bbs) ...@@ -253,6 +260,8 @@ fix_loop_structure (bitmap changed_bbs)
#endif #endif
timevar_pop (TV_LOOP_INIT); timevar_pop (TV_LOOP_INIT);
return number_of_loops () - old_nloops;
} }
/* Gate for the RTL loop superpass. The actual passes are subpasses. /* Gate for the RTL loop superpass. The actual passes are subpasses.
......
2013-02-11 Richard Biener <rguenther@suse.de> 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 PR tree-optimization/56273
* g++.dg/warn/Warray-bounds-6.C: New testcase. * g++.dg/warn/Warray-bounds-6.C: New testcase.
* gcc.dg/tree-ssa/pr21559.c: Adjust. * gcc.dg/tree-ssa/pr21559.c: Adjust.
......
/* { 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 ...@@ -707,18 +707,22 @@ static void
repair_loop_structures (void) repair_loop_structures (void)
{ {
bitmap changed_bbs; bitmap changed_bbs;
unsigned n_new_loops;
calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
timevar_push (TV_REPAIR_LOOPS); timevar_push (TV_REPAIR_LOOPS);
changed_bbs = BITMAP_ALLOC (NULL); 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 /* 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 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)) 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); BITMAP_FREE (changed_bbs);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment