Hello,
During my work on the selective scheduler I have triggered an assert in
our code saying that a fall-through edge should have e->src->next_bb ==
e->dest. This was for a bb with EXIT_BLOCK as its fall-through
successor, but its next_bb pointing to another block.
I was wondering why verify_flow_info didn't catch this issue. The code
starting at cfgrtl.c:1973 (in the January 03 trunk) does check this, but
only when e->src != ENTRY_BLOCK_PTR && e->dest != EXIT_BLOCK_PTR.
I have tried to reorganize the check so that the "e->src->next_bb ==
e->dest" condition is checked for all edges (see the patch below). Of
course, GCC does not bootstrap with this patch, triggering an assert of
incorrect fallthru block in cfg_layout_finalize, after RTL loop
optimizations. In my case, combine has broken that condition.
Does this ring any bells to anybody? Is this a bug, or should this
condition not be checked for edges pointing to the exit block at all?
Thanks, Andrey
--- cfgrtl.c (revision 24203)
+++ cfgrtl.c (local)
@@ -1969,8 +1969,7 @@ rtl_verify_flow_info (void)
break;
}
}
- else if (e->src != ENTRY_BLOCK_PTR
- && e->dest != EXIT_BLOCK_PTR)
+ else
{
rtx insn;
@@ -1981,7 +1980,9 @@ rtl_verify_flow_info (void)
e->src->index, e->dest->index);
err = 1;
}
- else
+
+ if (e->src != ENTRY_BLOCK_PTR
+ && e->dest != EXIT_BLOCK_PTR)
for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD
(e->dest);
insn = NEXT_INSN (insn))
if (BARRIER_P (insn) || INSN_P (insn))