This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PR rtl-optimization/51069 (verify_loop_info failed)
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 28 Dec 2011 19:31:57 +0100
- Subject: PR rtl-optimization/51069 (verify_loop_info failed)
Hi,
in this testcase peeling of loop contaiing irreducible region leads to
increasing size of the region (by removing the conditional path into it).
remove_path is not quite ready for this scenario. Still it would be nice to
avoid us creating irreducible region in cases where they are not.
Bootstrapped/regtested x86_64-linux, OK?
int a, b, c, d, e, f, bar (void);
void
foo (int x)
{
for (;;)
{
if (!x)
{
for (d = 6; d >= 0; d--)
{
while (!b)
;
if (e)
return foo (x);
if (f)
{
a = 0;
continue;
}
for (; c; c--)
;
}
}
if (bar ())
break;
e = 0;
if (x)
for (;;)
;
}
}
PR rtl-optimization/51069
* cfgloopmanip.c (remove_path): Removing path making irreducible
region unconditional makes BB part of the region.
Index: cfgloopmanip.c
===================================================================
*** cfgloopmanip.c (revision 182708)
--- cfgloopmanip.c (working copy)
*************** remove_path (edge e)
*** 290,295 ****
--- 290,296 ----
int i, nrem, n_bord_bbs;
sbitmap seen;
bool irred_invalidated = false;
+ edge_iterator ei;
if (!can_remove_branch_p (e))
return false;
*************** remove_path (edge e)
*** 329,337 ****
/* Find "border" hexes -- i.e. those with predecessor in removed path. */
for (i = 0; i < nrem; i++)
SET_BIT (seen, rem_bbs[i]->index);
for (i = 0; i < nrem; i++)
{
- edge_iterator ei;
bb = rem_bbs[i];
FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))
--- 330,341 ----
/* Find "border" hexes -- i.e. those with predecessor in removed path. */
for (i = 0; i < nrem; i++)
SET_BIT (seen, rem_bbs[i]->index);
+ FOR_EACH_EDGE (ae, ei, e->src->succs)
+ if (ae != e && ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index)
+ && ae->flags & EDGE_IRREDUCIBLE_LOOP)
+ irred_invalidated = true;
for (i = 0; i < nrem; i++)
{
bb = rem_bbs[i];
FOR_EACH_EDGE (ae, ei, rem_bbs[i]->succs)
if (ae->dest != EXIT_BLOCK_PTR && !TEST_BIT (seen, ae->dest->index))