re PR rtl-optimization/34171 (Segfault in df_chain_remove_problem with -O3 on alpha)

gcc/testsuite/ChangeLog:

2007-11-30  Martin Michlmayr <tbm@cyrius.com>

	PR rtl-optimization/34171
	* gcc.dg/pr34171.c: New testcase.

gcc/ChangeLog:

2007-11-30  Seongbae Park <seongbae.park@gmail.com>

	PR rtl-optimization/34171
	* cfgrtl.c (update_bb_for_insn_chain): New function,
	refactored from update_bb_for_insn.
	(update_bb_for_insn): Call update_bb_for_insn.
	(rtl_merge_blocks, try_redirect_by_replacing_jump):
	Replace a loop with update_bb_for_insn_chain call.
	(cfg_layout_merge_blocks): Add a call to
	update_bb_for_insn_chain. Replace the for loop
	with a call to update_bb_for_insn_chain.

From-SVN: r130539
This commit is contained in:
Seongbae Park 2007-11-30 17:02:43 +00:00
parent b88782e14d
commit 6c3d0e311a
4 changed files with 73 additions and 30 deletions

View File

@ -1,3 +1,15 @@
2007-11-30 Seongbae Park <seongbae.park@gmail.com>
PR rtl-optimization/34171
* cfgrtl.c (update_bb_for_insn_chain): New function,
refactored from update_bb_for_insn.
(update_bb_for_insn): Call update_bb_for_insn.
(rtl_merge_blocks, try_redirect_by_replacing_jump):
Replace a loop with update_bb_for_insn_chain call.
(cfg_layout_merge_blocks): Add a call to
update_bb_for_insn_chain. Replace the for loop
with a call to update_bb_for_insn_chain.
2007-11-30 Ben Elliston <bje@au.ibm.com>
* config/vax/vax.h (ASM_FORMAT_PRIVATE_NAME): Remove. Use default.

View File

@ -465,24 +465,36 @@ emit_insn_at_entry (rtx insn)
commit_edge_insertions ();
}
/* Update insns block within BB. */
/* Update BLOCK_FOR_INSN of insns between BEGIN and END
(or BARRIER if found) and notify df of the bb change.
The insn chain range is inclusive
(i.e. both BEGIN and END will be updated. */
void
update_bb_for_insn (basic_block bb)
static void
update_bb_for_insn_chain (rtx begin, rtx end, basic_block bb)
{
rtx insn;
for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
end = NEXT_INSN (end);
for (insn = begin; insn != end; 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 BLOCK_FOR_INSN of insns in BB to BB,
and notify df of the change. */
void
update_bb_for_insn (basic_block bb)
{
update_bb_for_insn_chain (BB_HEAD (bb), BB_END (bb), bb);
}
/* Return the INSN immediately following the NOTE_INSN_BASIC_BLOCK
note associated with the BLOCK. */
@ -629,16 +641,7 @@ rtl_merge_blocks (basic_block a, basic_block 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_insn_chain (a_end, b_end, a);
a_end = b_end;
}
@ -843,14 +846,9 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
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_insn_chain (NEXT_INSN (BB_END (src)),
PREV_INSN (barrier), src);
NEXT_INSN (PREV_INSN (new_insn)) = NEXT_INSN (new_insn);
PREV_INSN (NEXT_INSN (new_insn)) = PREV_INSN (new_insn);
@ -2637,6 +2635,13 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
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 call. */
update_bb_for_insn_chain (NEXT_INSN (first),
BB_END (b),
a);
delete_insn (first);
}
/* Otherwise just re-associate the instructions. */
@ -2644,13 +2649,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
{
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_insn_chain (BB_HEAD (b), BB_END (b), a);
insn = BB_HEAD (b);
/* Skip possible DELETED_LABEL insn. */

View File

@ -1,3 +1,8 @@
2007-11-30 Martin Michlmayr <tbm@cyrius.com>
PR rtl-optimization/34171
* gcc.dg/pr34171.c: New testcase.
2007-11-30 Zdenek Dvorak <ook@ucw.cz>
* gcc.dg/tree-ssa/pr34244.c: Fixed.

View File

@ -0,0 +1,27 @@
/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
/* { dg-do compile } */
/* { dg-options "-O3" } */
extern char coredump;
extern void sigemptyset (char *);
struct sigaction
{
char sa_mask;
};
void doSignalsSetup (void)
{
static const int signals[] = {
1, 2, 3, 4, 6, 8, 11, 13, 14, 15, 30 , 31
};
unsigned int i, sig;
struct sigaction sa;
for (i = 0; i < sizeof (signals) / sizeof (int); i++)
{
sig = signals[i];
if (coredump &&
(sig == 4 || sig == 8 || sig == 11 || sig == 10))
continue;
sigemptyset (&sa.sa_mask);
}
}