This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
RE: ICE in gcc.dg/pr77834.c test for MIPS
Hi Segher,
Thank you for replying.
> From: Segher Boessenkool
>
> This happens when you have inserted code ending in a jump on an edge.
> This then will need updating of the CFG, and this code does not know
> how to do that.
>
Would the following be an appropriate solution ?
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index cafa38d..898d909 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -2047,6 +2047,16 @@ commit_one_edge_insertion (edge e)
after = BB_END (bb);
}
+ /* If the edge contains control flow instructions, remember to update the
+ CFG after the insertion. */
+ bool update_cfg = false;
+ for (tmp = insns; tmp && update_cfg == false; tmp = NEXT_INSN (tmp))
+ if (control_flow_insn_p (tmp))
+ {
+ update_cfg = true;
+ break;
+ }
+
/* Now that we've found the spot, do the insertion. */
if (before)
{
@@ -2056,6 +2066,15 @@ commit_one_edge_insertion (edge e)
else
last = emit_insn_after_noloc (insns, after, bb);
+ if (update_cfg)
+ {
+ auto_sbitmap blocks (last_basic_block_for_fn (cfun));
+ bitmap_ones (blocks);
+ find_many_sub_basic_blocks (blocks);
+
+ last = BB_END (bb);
+ }
+
if (returnjump_p (last))
{
/* ??? Remove all outgoing edges from BB and add one for EXIT.
In short, I'm updating the CFG by calling find_many_sub_basic_blocks with an
all-one block bitmap (this also happens in cfgexpand.c, after the edge
insertions) whenever an edge contains an insn which satisfies control_flow_insn_p.
Regards,
Toma