cfgcleanup.c (try_optimize_cfg): Replace call to delete_insn_chain by call to delete_insn.
2012-04-14 Tom de Vries <tom@codesourcery.com> * cfgcleanup.c (try_optimize_cfg): Replace call to delete_insn_chain by call to delete_insn. Remove code to reorder BASIC_BLOCK note and DELETED_LABEL note, and move it to ... * cfgrtl.c (delete_insn): ... here. Change return type to void. (delete_insn_and_edges): Likewise. (delete_insn_chain): Handle new return type of delete_insn. Delete chain backwards rather than forwards. * rtl.h (delete_insn, delete_insn_and_edges): Change return type to void. * cfglayout.c (fixup_reorder_chain): Delete unused label. From-SVN: r186451
This commit is contained in:
parent
960bfb6929
commit
03fbe718cb
|
@ -1,3 +1,16 @@
|
||||||
|
2012-04-14 Tom de Vries <tom@codesourcery.com>
|
||||||
|
|
||||||
|
* cfgcleanup.c (try_optimize_cfg): Replace call to delete_insn_chain by
|
||||||
|
call to delete_insn. Remove code to reorder BASIC_BLOCK note and
|
||||||
|
DELETED_LABEL note, and move it to ...
|
||||||
|
* cfgrtl.c (delete_insn): ... here. Change return type to void.
|
||||||
|
(delete_insn_and_edges): Likewise.
|
||||||
|
(delete_insn_chain): Handle new return type of delete_insn. Delete
|
||||||
|
chain backwards rather than forwards.
|
||||||
|
* rtl.h (delete_insn, delete_insn_and_edges): Change return type to
|
||||||
|
void.
|
||||||
|
* cfglayout.c (fixup_reorder_chain): Delete unused label.
|
||||||
|
|
||||||
2012-04-14 Jan Hubicka <jh@suse.cz>
|
2012-04-14 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
* cgraph.h: Update copyrights;
|
* cgraph.h: Update copyrights;
|
||||||
|
|
|
@ -2637,20 +2637,7 @@ try_optimize_cfg (int mode)
|
||||||
|| ! label_is_jump_target_p (BB_HEAD (b),
|
|| ! label_is_jump_target_p (BB_HEAD (b),
|
||||||
BB_END (single_pred (b)))))
|
BB_END (single_pred (b)))))
|
||||||
{
|
{
|
||||||
rtx label = BB_HEAD (b);
|
delete_insn (BB_HEAD (b));
|
||||||
|
|
||||||
delete_insn_chain (label, label, false);
|
|
||||||
/* If the case label is undeletable, move it after the
|
|
||||||
BASIC_BLOCK note. */
|
|
||||||
if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
|
|
||||||
{
|
|
||||||
rtx bb_note = NEXT_INSN (BB_HEAD (b));
|
|
||||||
|
|
||||||
reorder_insns_nobb (label, label, bb_note);
|
|
||||||
BB_HEAD (b) = bb_note;
|
|
||||||
if (BB_END (b) == bb_note)
|
|
||||||
BB_END (b) = label;
|
|
||||||
}
|
|
||||||
if (dump_file)
|
if (dump_file)
|
||||||
fprintf (dump_file, "Deleted label in block %i.\n",
|
fprintf (dump_file, "Deleted label in block %i.\n",
|
||||||
b->index);
|
b->index);
|
||||||
|
|
|
@ -857,6 +857,9 @@ fixup_reorder_chain (void)
|
||||||
(e_taken->src, e_taken->dest));
|
(e_taken->src, e_taken->dest));
|
||||||
e_taken->flags |= EDGE_FALLTHRU;
|
e_taken->flags |= EDGE_FALLTHRU;
|
||||||
update_br_prob_note (bb);
|
update_br_prob_note (bb);
|
||||||
|
if (LABEL_NUSES (ret_label) == 0
|
||||||
|
&& single_pred_p (e_taken->dest))
|
||||||
|
delete_insn (ret_label);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
41
gcc/cfgrtl.c
41
gcc/cfgrtl.c
|
@ -111,12 +111,11 @@ can_delete_label_p (const_rtx label)
|
||||||
&& !in_expr_list_p (forced_labels, label));
|
&& !in_expr_list_p (forced_labels, label));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Delete INSN by patching it out. Return the next insn. */
|
/* Delete INSN by patching it out. */
|
||||||
|
|
||||||
rtx
|
void
|
||||||
delete_insn (rtx insn)
|
delete_insn (rtx insn)
|
||||||
{
|
{
|
||||||
rtx next = NEXT_INSN (insn);
|
|
||||||
rtx note;
|
rtx note;
|
||||||
bool really_delete = true;
|
bool really_delete = true;
|
||||||
|
|
||||||
|
@ -128,11 +127,22 @@ delete_insn (rtx insn)
|
||||||
if (! can_delete_label_p (insn))
|
if (! can_delete_label_p (insn))
|
||||||
{
|
{
|
||||||
const char *name = LABEL_NAME (insn);
|
const char *name = LABEL_NAME (insn);
|
||||||
|
basic_block bb = BLOCK_FOR_INSN (insn);
|
||||||
|
rtx bb_note = NEXT_INSN (insn);
|
||||||
|
|
||||||
really_delete = false;
|
really_delete = false;
|
||||||
PUT_CODE (insn, NOTE);
|
PUT_CODE (insn, NOTE);
|
||||||
NOTE_KIND (insn) = NOTE_INSN_DELETED_LABEL;
|
NOTE_KIND (insn) = NOTE_INSN_DELETED_LABEL;
|
||||||
NOTE_DELETED_LABEL_NAME (insn) = name;
|
NOTE_DELETED_LABEL_NAME (insn) = name;
|
||||||
|
|
||||||
|
if (bb_note != NULL_RTX && NOTE_INSN_BASIC_BLOCK_P (bb_note)
|
||||||
|
&& BLOCK_FOR_INSN (bb_note) == bb)
|
||||||
|
{
|
||||||
|
reorder_insns_nobb (insn, insn, bb_note);
|
||||||
|
BB_HEAD (bb) = bb_note;
|
||||||
|
if (BB_END (bb) == bb_note)
|
||||||
|
BB_END (bb) = insn;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
|
remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
|
||||||
|
@ -190,26 +200,22 @@ delete_insn (rtx insn)
|
||||||
LABEL_NUSES (label)--;
|
LABEL_NUSES (label)--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like delete_insn but also purge dead edges from BB. */
|
/* Like delete_insn but also purge dead edges from BB. */
|
||||||
|
|
||||||
rtx
|
void
|
||||||
delete_insn_and_edges (rtx insn)
|
delete_insn_and_edges (rtx insn)
|
||||||
{
|
{
|
||||||
rtx x;
|
|
||||||
bool purge = false;
|
bool purge = false;
|
||||||
|
|
||||||
if (INSN_P (insn)
|
if (INSN_P (insn)
|
||||||
&& BLOCK_FOR_INSN (insn)
|
&& BLOCK_FOR_INSN (insn)
|
||||||
&& BB_END (BLOCK_FOR_INSN (insn)) == insn)
|
&& BB_END (BLOCK_FOR_INSN (insn)) == insn)
|
||||||
purge = true;
|
purge = true;
|
||||||
x = delete_insn (insn);
|
delete_insn (insn);
|
||||||
if (purge)
|
if (purge)
|
||||||
purge_dead_edges (BLOCK_FOR_INSN (insn));
|
purge_dead_edges (BLOCK_FOR_INSN (insn));
|
||||||
return x;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unlink a chain of insns between START and FINISH, leaving notes
|
/* Unlink a chain of insns between START and FINISH, leaving notes
|
||||||
|
@ -219,25 +225,26 @@ delete_insn_and_edges (rtx insn)
|
||||||
void
|
void
|
||||||
delete_insn_chain (rtx start, rtx finish, bool clear_bb)
|
delete_insn_chain (rtx start, rtx finish, bool clear_bb)
|
||||||
{
|
{
|
||||||
rtx next;
|
rtx prev, current;
|
||||||
|
|
||||||
/* Unchain the insns one by one. It would be quicker to delete all of these
|
/* Unchain the insns one by one. It would be quicker to delete all of these
|
||||||
with a single unchaining, rather than one at a time, but we need to keep
|
with a single unchaining, rather than one at a time, but we need to keep
|
||||||
the NOTE's. */
|
the NOTE's. */
|
||||||
|
current = finish;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
next = NEXT_INSN (start);
|
prev = PREV_INSN (current);
|
||||||
if (NOTE_P (start) && !can_delete_note_p (start))
|
if (NOTE_P (current) && !can_delete_note_p (current))
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
next = delete_insn (start);
|
delete_insn (current);
|
||||||
|
|
||||||
if (clear_bb && !INSN_DELETED_P (start))
|
if (clear_bb && !INSN_DELETED_P (current))
|
||||||
set_block_for_insn (start, NULL);
|
set_block_for_insn (current, NULL);
|
||||||
|
|
||||||
if (start == finish)
|
if (current == start)
|
||||||
break;
|
break;
|
||||||
start = next;
|
current = prev;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2443,12 +2443,12 @@ extern void add_insn_before (rtx, rtx, struct basic_block_def *);
|
||||||
extern void add_insn_after (rtx, rtx, struct basic_block_def *);
|
extern void add_insn_after (rtx, rtx, struct basic_block_def *);
|
||||||
extern void remove_insn (rtx);
|
extern void remove_insn (rtx);
|
||||||
extern rtx emit (rtx);
|
extern rtx emit (rtx);
|
||||||
extern rtx delete_insn (rtx);
|
extern void delete_insn (rtx);
|
||||||
extern rtx entry_of_function (void);
|
extern rtx entry_of_function (void);
|
||||||
extern void emit_insn_at_entry (rtx);
|
extern void emit_insn_at_entry (rtx);
|
||||||
extern void delete_insn_chain (rtx, rtx, bool);
|
extern void delete_insn_chain (rtx, rtx, bool);
|
||||||
extern rtx unlink_insn_chain (rtx, rtx);
|
extern rtx unlink_insn_chain (rtx, rtx);
|
||||||
extern rtx delete_insn_and_edges (rtx);
|
extern void delete_insn_and_edges (rtx);
|
||||||
extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx);
|
extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx);
|
||||||
extern rtx gen_const_mem (enum machine_mode, rtx);
|
extern rtx gen_const_mem (enum machine_mode, rtx);
|
||||||
extern rtx gen_frame_mem (enum machine_mode, rtx);
|
extern rtx gen_frame_mem (enum machine_mode, rtx);
|
||||||
|
|
Loading…
Reference in New Issue