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: 22 Nov 2007 00:30:12 -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 #16 from spark at gcc dot gnu dot org 2007-11-22 00:30 -------
I'm bootstrapping the following patch. This includes some slight refactoring of
set_block_for_insn/df_insn_change_bb loops within cfgrtl.c.
It's mostly cosmetic change on top of the patch on comment #15.
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 23:48:55 2007 +0000
@@ -465,23 +465,48 @@ emit_insn_at_entry (rtx insn)
commit_edge_insertions ();
}
-/* Update insns block within BB. */
+/* Update BLOCK_FOR_INSN of insns between BEGIN and END
+ including BEGIN but not END, and notify df of the change.
+ Note that NEXT_INSN (END) has to have a valid value
+ (either NULL or a pointer to a valid insn). */
+
+static void
+update_bb_for_insns (rtx begin, rtx end, basic_block bb)
+{
+ rtx insn;
+
+ for (insn = begin; insn != end; insn = NEXT_INSN (insn))
+ {
+ if (!BARRIER_P (insn))
+ {
+ set_block_for_insn (insn, bb);
+ df_insn_change_bb (insn);
+ }
+ }
+}
+
+/* Call df_insn_change_bb for insns between BEGIN and END
+ including BEGIN but not END.
+ Note that NEXT_INSN (END) has to have a valid value
+ (either NULL or a pointer to a valid insn). */
+
+static void
+notify_bb_change_for_insns (rtx begin, rtx end)
+{
+ rtx insn;
+
+ for (insn = begin; insn != end; insn = NEXT_INSN (insn))
+ if (!BARRIER_P (insn))
+ df_insn_change_bb (insn);
+}
+
+/* Update BLOCK_FOR_INSN of insns in BB to BB,
+ and notify df of the change. */
void
update_bb_for_insn (basic_block bb)
{
- rtx insn;
-
- for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
- {
- if (!BARRIER_P (insn))
- {
- set_block_for_insn (insn, bb);
- df_insn_change_bb (insn);
- }
- if (insn == BB_END (bb))
- break;
- }
+ update_bb_for_insns (BB_HEAD (bb), NEXT_INSN (BB_END (bb)), bb);
}
/* Return the INSN immediately following the NOTE_INSN_BASIC_BLOCK
@@ -629,16 +654,7 @@ rtl_merge_blocks (basic_block a, basic_b
/* Reassociate the insns of B with A. */
if (!b_empty)
{
- rtx x;
-
- for (x = a_end; x != b_end; x = NEXT_INSN (x))
- {
- set_block_for_insn (x, a);
- df_insn_change_bb (x);
- }
-
- set_block_for_insn (b_end, a);
- df_insn_change_bb (b_end);
+ update_bb_for_insns (a_end, NEXT_INSN (b_end), a);
a_end = b_end;
}
@@ -843,14 +859,9 @@ try_redirect_by_replacing_jump (edge e,
which originally were or were created before jump table are
inside the basic block. */
rtx new_insn = BB_END (src);
- rtx tmp;
-
- for (tmp = NEXT_INSN (BB_END (src)); tmp != barrier;
- tmp = NEXT_INSN (tmp))
- {
- set_block_for_insn (tmp, src);
- df_insn_change_bb (tmp);
- }
+
+ update_bb_for_insns (NEXT_INSN (BB_END (src)),
+ barrier, src);
NEXT_INSN (PREV_INSN (new_insn)) = NEXT_INSN (new_insn);
PREV_INSN (NEXT_INSN (new_insn)) = PREV_INSN (new_insn);
@@ -2637,6 +2648,12 @@ cfg_layout_merge_blocks (basic_block a,
first = NEXT_INSN (first);
gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
BB_HEAD (b) = NULL;
+
+ /* emit_insn_after_noloc doesn't call df_insn_change_bb.
+ We need to explicitly notify. */
+ notify_bb_change_for_insns (NEXT_INSN (first),
+ NEXT_INSN (BB_END (b)));
+
delete_insn (first);
}
/* Otherwise just re-associate the instructions. */
@@ -2644,13 +2661,8 @@ cfg_layout_merge_blocks (basic_block a,
{
rtx insn;
- for (insn = BB_HEAD (b);
- insn != NEXT_INSN (BB_END (b));
- insn = NEXT_INSN (insn))
- {
- set_block_for_insn (insn, a);
- df_insn_change_bb (insn);
- }
+ update_bb_for_insns (BB_HEAD (b),
+ NEXT_INSN (BB_END (b)), a);
insn = BB_HEAD (b);
/* Skip possible DELETED_LABEL insn. */
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34171