[Bug rtl-optimization/87468] [9 Regression] ice "wrong amount of branch edges after conditional jump in bb"
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Nov 14 18:41:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87468
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Slightly cleaned up testcase:
int a;
int bar (void);
void baz (void);
void
foo (void)
{
for (int c = 1; c <= 3;)
{
int d = bar () && !0;
switch (c)
case 1:
if (d)
case 2:
case 3:
baz ();
if (a)
c++;
}
}
The problem is that EDGE_IGNORE is not being cleared when it should anymore.
It is set during vr_values::simplify_switch_using_ranges, then checked in
inside of thread_outgoing_edges, but later on thread_through_all_blocks
eventually calls create_block_for_threading -> duplicate_block and that creates
new edges using the flags of the old succs edges. While the original edges
that had EDGE_IGNORE set are in to_remove_edges vector and thus don't leak into
the IL afterwards, the copies of them created by duplicate_block are not and
leak into the IL, violating
/* An edge we should ignore. It should be entirely local to
passes. ie, it is never set on any edge upon the completion
of any pass. */
DEF_EDGE_FLAG(IGNORE, 17)
requirement. So, either we need some vr-values.c method that will clear
EDGE_IGNORE flags on to_remove_edge edges and call it before we start
duplicating any blocks, or something else went wrong (maybe we shouldn't
duplicate_blocks that have such edges?).
More information about the Gcc-bugs
mailing list