re PR rtl-optimization/10056 ([HP-PA] ICE at -O2 when building c++ code from doxygen)

PR opt/10056
	* cfglayout.c (fixup_reorder_chain):  Fix dealing with the conditional
	jump jumping to the next instruction.
	* cfgrtl.c (force_nonfallthru_and_redirect):  Likewise.

From-SVN: r64854
This commit is contained in:
Jan Hubicka 2003-03-25 20:20:34 +01:00 committed by Jan Hubicka
parent dcb0eee2a2
commit cb9a1d9bb6
3 changed files with 70 additions and 3 deletions

View File

@ -1,3 +1,10 @@
Mon Mar 24 20:03:03 CET 2003 Jan Hubicka <jh@suse.cz>
PR opt/10056
* cfglayout.c (fixup_reorder_chain): Fix dealing with the conditional
jump jumping to the next instruction.
* cfgrtl.c (force_nonfallthru_and_redirect): Likewise.
2003-03-25 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
* doc/passes.texi (Passes): Properly document that we do not

View File

@ -465,11 +465,43 @@ fixup_reorder_chain ()
&& e_fall->dest == EXIT_BLOCK_PTR))
continue;
/* The degenerated case of conditional jump jumping to the next
instruction can happen on target having jumps with side
effects.
Create temporarily the duplicated edge representing branch.
It will get unidentified by force_nonfallthru_and_redirect
that would otherwise get confused by fallthru edge not pointing
to the next basic block. */
if (!e_taken)
{
rtx note;
edge e_fake;
e_fake = unchecked_make_edge (bb, e_fall->dest, 0);
if (!redirect_jump (bb->end, block_label (bb), 0))
abort ();
note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX);
if (note)
{
int prob = INTVAL (XEXP (note, 0));
e_fake->probability = prob;
e_fake->count = e_fall->count * prob / REG_BR_PROB_BASE;
e_fall->probability -= e_fall->probability;
e_fall->count -= e_fake->count;
if (e_fall->probability < 0)
e_fall->probability = 0;
if (e_fall->count < 0)
e_fall->count = 0;
}
}
/* There is one special case: if *neither* block is next,
such as happens at the very end of a function, then we'll
need to add a new unconditional jump. Choose the taken
edge based on known or assumed probability. */
if (RBI (bb)->next != e_taken->dest)
else if (RBI (bb)->next != e_taken->dest)
{
rtx note = find_reg_note (bb_end_insn, REG_BR_PROB, 0);

View File

@ -78,7 +78,7 @@ static void commit_one_edge_insertion PARAMS ((edge, int));
static bool try_redirect_by_replacing_jump PARAMS ((edge, basic_block));
static rtx last_loop_beg_note PARAMS ((rtx));
static bool back_edge_of_syntactic_loop_p PARAMS ((basic_block, basic_block));
static basic_block force_nonfallthru_and_redirect PARAMS ((edge, basic_block));
basic_block force_nonfallthru_and_redirect PARAMS ((edge, basic_block));
/* Return true if NOTE is not one of the ones that must be kept paired,
so that we may simply delete it. */
@ -930,7 +930,7 @@ redirect_edge_and_branch (e, target)
/* Like force_nonfallthru below, but additionally performs redirection
Used by redirect_edge_and_branch_force. */
static basic_block
basic_block
force_nonfallthru_and_redirect (e, target)
edge e;
basic_block target;
@ -940,6 +940,34 @@ force_nonfallthru_and_redirect (e, target)
edge new_edge;
int abnormal_edge_flags = 0;
/* In the case the last instruction is conditional jump to the next
instruction, first redirect the jump itself and then continue
by creating an basic block afterwards to redirect fallthru edge. */
if (e->src != ENTRY_BLOCK_PTR && e->dest != EXIT_BLOCK_PTR
&& any_condjump_p (e->src->end)
&& JUMP_LABEL (e->src->end) == e->dest->head)
{
rtx note;
edge b = make_edge (e->src, target, 0);
if (!redirect_jump (e->src->end, block_label (target), 0))
abort ();
note = find_reg_note (e->src->end, REG_BR_PROB, NULL_RTX);
if (note)
{
int prob = INTVAL (XEXP (note, 0));
b->probability = prob;
b->count = e->count * prob / REG_BR_PROB_BASE;
e->probability -= e->probability;
e->count -= b->count;
if (e->probability < 0)
e->probability = 0;
if (e->count < 0)
e->count = 0;
}
}
if (e->flags & EDGE_ABNORMAL)
{
/* Irritating special case - fallthru edge to the same block as abnormal