This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/34171] [4.3 Regression] Segfault in df_chain_remove_problem with -O3 on alpha
- From: "spark at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 21 Nov 2007 22:08:48 -0000
- Subject: [Bug rtl-optimization/34171] [4.3 Regression] Segfault in df_chain_remove_problem with -O3 on alpha
- References: <bug-34171-12387@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #13 from spark at gcc dot gnu dot org 2007-11-21 22:08 -------
The following patch seems to fix the problem:
diff -r fad6feb87420 gcc/cfgrtl.c
--- a/gcc/cfgrtl.c Wed Nov 21 00:17:50 2007 +0000
+++ b/gcc/cfgrtl.c Wed Nov 21 14:07:15 2007 -0800
@@ -2629,6 +2629,7 @@ cfg_layout_merge_blocks (basic_block a,
/* In the case basic blocks are not adjacent, move them around. */
if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
{
+ rtx insn;
rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
emit_insn_after_noloc (first, BB_END (a), a);
@@ -2637,7 +2638,15 @@ cfg_layout_merge_blocks (basic_block a,
first = NEXT_INSN (first);
gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
BB_HEAD (b) = NULL;
+ insn = NEXT_INSN (first);
delete_insn (first);
+
+ for (; insn != NEXT_INSN (BB_END (b));
+ insn = NEXT_INSN (insn))
+ {
+ set_block_for_insn (insn, a);
+ df_insn_change_bb (insn);
+ }
}
/* Otherwise just re-associate the instructions. */
else
I'm going to stare at the surrounding code a bit more
to convince myself, and will do some testing.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34171