jump.c (squeeze_notes): Take parms by reference.

* jump.c (squeeze_notes): Take parms by reference.  Handle END being
        a squeezable note.
        * rtl.h: Adjust.
        * ifcvt.c (dead_or_predicable): Adjust.
        * loop.c (find_and_verify_loops): Adjust.
        * stmt.c (expand_end_case): Adjust.
        * flow.c (merge_blocks_move_successor_nojumps): Adjust.  Modify the
        head and end insn pointers in the basic block, not just local copies.
        (merge_blocks_move_predecessor_nojumps): Likewise.

From-SVN: r45107
This commit is contained in:
Jason Merrill 2001-08-22 10:51:32 -04:00 committed by Jason Merrill
parent fd10dd09c8
commit 2270623af3
7 changed files with 55 additions and 44 deletions

View File

@ -1,3 +1,15 @@
2001-08-22 Jason Merrill <jason_merrill@redhat.com>
* jump.c (squeeze_notes): Take parms by reference. Handle END being
a squeezable note.
* rtl.h: Adjust.
* ifcvt.c (dead_or_predicable): Adjust.
* loop.c (find_and_verify_loops): Adjust.
* stmt.c (expand_end_case): Adjust.
* flow.c (merge_blocks_move_successor_nojumps): Adjust. Modify the
head and end insn pointers in the basic block, not just local copies.
(merge_blocks_move_predecessor_nojumps): Likewise.
2001-08-22 Lars Brinkhoff <lars@nocrew.org>
* Makefile.in, alias.c, basic-block.h, bb-reorder.c, bitmap.c,

View File

@ -3074,13 +3074,10 @@ static int
merge_blocks_move_predecessor_nojumps (a, b)
basic_block a, b;
{
rtx start, end, barrier;
rtx barrier;
int index;
start = a->head;
end = a->end;
barrier = next_nonnote_insn (end);
barrier = next_nonnote_insn (a->end);
if (GET_CODE (barrier) != BARRIER)
abort ();
flow_delete_insn (barrier);
@ -3092,11 +3089,11 @@ merge_blocks_move_predecessor_nojumps (a, b)
and adjust the block trees appropriately. Even better would be to have
a tighter connection between block trees and rtl so that this is not
necessary. */
start = squeeze_notes (start, end);
squeeze_notes (&a->head, &a->end);
/* Scramble the insn chain. */
if (end != PREV_INSN (b->head))
reorder_insns (start, end, PREV_INSN (b->head));
if (a->end != PREV_INSN (b->head))
reorder_insns (a->head, a->end, PREV_INSN (b->head));
if (rtl_dump_file)
{
@ -3127,11 +3124,9 @@ static int
merge_blocks_move_successor_nojumps (a, b)
basic_block a, b;
{
rtx start, end, barrier;
rtx barrier;
start = b->head;
end = b->end;
barrier = NEXT_INSN (end);
barrier = NEXT_INSN (b->end);
/* Recognize a jump table following block B. */
if (barrier
@ -3141,8 +3136,8 @@ merge_blocks_move_successor_nojumps (a, b)
&& (GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_VEC
|| GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_DIFF_VEC))
{
end = NEXT_INSN (barrier);
barrier = NEXT_INSN (end);
b->end = NEXT_INSN (barrier);
barrier = NEXT_INSN (b->end);
}
/* There had better have been a barrier there. Delete it. */
@ -3156,10 +3151,10 @@ merge_blocks_move_successor_nojumps (a, b)
and adjust the block trees appropriately. Even better would be to have
a tighter connection between block trees and rtl so that this is not
necessary. */
start = squeeze_notes (start, end);
squeeze_notes (&b->head, &b->end);
/* Scramble the insn chain. */
reorder_insns (start, end, a->end);
reorder_insns (b->head, b->end, a->end);
/* Now blocks A and B are contiguous. Merge them. */
merge_blocks_nomove (a, b);

View File

@ -2667,19 +2667,7 @@ dead_or_predicable (test_bb, merge_bb, other_bb, new_dest, reversep)
if (end == merge_bb->end)
merge_bb->end = PREV_INSN (head);
head = squeeze_notes (head, end);
if (GET_CODE (end) == NOTE
&& (NOTE_LINE_NUMBER (end) == NOTE_INSN_BLOCK_END
|| NOTE_LINE_NUMBER (end) == NOTE_INSN_BLOCK_BEG
|| NOTE_LINE_NUMBER (end) == NOTE_INSN_LOOP_BEG
|| NOTE_LINE_NUMBER (end) == NOTE_INSN_LOOP_END
|| NOTE_LINE_NUMBER (end) == NOTE_INSN_LOOP_CONT
|| NOTE_LINE_NUMBER (end) == NOTE_INSN_LOOP_VTOP))
{
if (head == end)
return TRUE;
end = PREV_INSN (end);
}
squeeze_notes (&head, &end);
reorder_insns (head, end, PREV_INSN (earliest));
}

View File

@ -539,19 +539,24 @@ duplicate_loop_exit_test (loop_start)
}
/* Move all block-beg, block-end, loop-beg, loop-cont, loop-vtop, loop-end,
notes between START and END out before START. Assume that END is not
such a note. START may be such a note. Returns the value of the new
starting insn, which may be different if the original start was such a
note. */
notes between START and END out before START. START and END may be such
notes. Returns the values of the new starting and ending insns, which
may be different if the original ones were such notes. */
rtx
squeeze_notes (start, end)
rtx start, end;
void
squeeze_notes (startp, endp)
rtx* startp;
rtx* endp;
{
rtx start = *startp;
rtx end = *endp;
rtx insn;
rtx next;
rtx last = NULL;
rtx past_end = NEXT_INSN (end);
for (insn = start; insn != end; insn = next)
for (insn = start; insn != past_end; insn = next)
{
next = NEXT_INSN (insn);
if (GET_CODE (insn) == NOTE
@ -575,9 +580,19 @@ squeeze_notes (start, end)
PREV_INSN (next) = prev;
}
}
else
last = insn;
}
return start;
/* There were no real instructions, and we can't represent an empty
range. Die. */
if (start == past_end)
abort ();
end = last;
*startp = start;
*endp = end;
}
/* Return the label before INSN, or put a new label there. */

View File

@ -2749,8 +2749,7 @@ find_and_verify_loops (f, loops)
/* Include the BARRIER after INSN and copy the
block after LOC. */
new_label = squeeze_notes (new_label,
last_insn_to_move);
squeeze_notes (&new_label, &last_insn_to_move);
reorder_insns (new_label, last_insn_to_move, loc);
/* All those insns are now in TARGET_LOOP. */

View File

@ -1284,7 +1284,7 @@ extern void mark_jump_label PARAMS ((rtx, rtx, int));
extern void cleanup_barriers PARAMS ((void));
/* In jump.c */
extern rtx squeeze_notes PARAMS ((rtx, rtx));
extern void squeeze_notes PARAMS ((rtx *, rtx *));
extern rtx delete_insn PARAMS ((rtx));
extern void delete_jump PARAMS ((rtx));
extern void delete_barrier PARAMS ((rtx));

View File

@ -5152,7 +5152,7 @@ expand_end_case (orig_index)
int ncases;
rtx *labelvec;
register int i;
rtx before_case;
rtx before_case, end;
register struct nesting *thiscase = case_stack;
tree index_expr, index_type;
int unsignedp;
@ -5414,8 +5414,10 @@ expand_end_case (orig_index)
#endif
}
before_case = squeeze_notes (NEXT_INSN (before_case), get_last_insn ());
reorder_insns (before_case, get_last_insn (),
before_case = NEXT_INSN (before_case);
end = get_last_insn ();
squeeze_notes (&before_case, &end);
reorder_insns (before_case, end,
thiscase->data.case_stmt.start);
}
else