RFC: kill od flow_delete_insns
Jan Hubicka
jh@suse.cz
Wed Sep 12 08:41:00 GMT 2001
Hi,
I am just quickly sending the attached patch. I didn't finished bootstrap yet,
but I would like to know your opinion and I must leave for today. The patch
attempts to avoid confusion in ways we delete instruction (we have delete_insn,
remove_insn, flow_delete_insn and half a dozen other ways to delete insns).
I am attempting to amn flow_delete_insn and use delete_insn everywhere.
To do it, I need to kill the aggresive code removal it have (and keep it
for the cfg_cleanup, that IMO makes more sense too).
What I am affraid of is reorg pass and machine depdendent reorg. Will
they stay happy with this change?
If you think it makes sense, I will futher update delete_insn to update CFG
as insn emitting code does and cleanup the various places we do update boundaries.
Sorry, no changelog, I am in a hurry.
Honza
Index: cfg.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cfg.c,v
retrieving revision 1.3
diff -c -3 -p -r1.3 cfg.c
*** cfg.c 2001/09/11 16:58:57 1.3
--- cfg.c 2001/09/12 15:37:18
*************** Software Foundation, 59 Temple Place - S
*** 27,33 ****
- Initialization/deallocation
init_flow, clear_edges
- CFG aware instruction chain manipulation
! flow_delete_insn, flow_delete_insn_chain
- Basic block manipulation
create_basic_block, flow_delete_block, split_block, merge_blocks_nomove
- Infrastructure to determine quickly basic block for instruction.
--- 27,33 ----
- Initialization/deallocation
init_flow, clear_edges
- CFG aware instruction chain manipulation
! delete_insn, flow_delete_insn_chain
- Basic block manipulation
create_basic_block, flow_delete_block, split_block, merge_blocks_nomove
- Infrastructure to determine quickly basic block for instruction.
*************** can_delete_label_p (label)
*** 233,290 ****
return 1;
}
- /* Delete INSN by patching it out. Return the next insn. */
-
- rtx
- flow_delete_insn (insn)
- rtx insn;
- {
- rtx prev = PREV_INSN (insn);
- rtx next = NEXT_INSN (insn);
- rtx note;
-
- PREV_INSN (insn) = NULL_RTX;
- NEXT_INSN (insn) = NULL_RTX;
- INSN_DELETED_P (insn) = 1;
-
- if (prev)
- NEXT_INSN (prev) = next;
- if (next)
- PREV_INSN (next) = prev;
- else
- set_last_insn (prev);
-
- if (GET_CODE (insn) == CODE_LABEL)
- remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
-
- /* If deleting a jump, decrement the use count of the label. Deleting
- the label itself should happen in the normal course of block merging. */
- if (GET_CODE (insn) == JUMP_INSN
- && JUMP_LABEL (insn)
- && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
- LABEL_NUSES (JUMP_LABEL (insn))--;
-
- /* Also if deleting an insn that references a label. */
- else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
- && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
- LABEL_NUSES (XEXP (note, 0))--;
-
- if (GET_CODE (insn) == JUMP_INSN
- && (GET_CODE (PATTERN (insn)) == ADDR_VEC
- || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
- {
- rtx pat = PATTERN (insn);
- int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
- int len = XVECLEN (pat, diff_vec_p);
- int i;
-
- for (i = 0; i < len; i++)
- LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
- }
-
- return next;
- }
-
/* Unlink a chain of insns between START and FINISH, leaving notes
that must be paired. */
--- 233,238 ----
*************** flow_delete_insn_chain (start, finish)
*** 312,318 ****
NOTE_SOURCE_FILE (start) = name;
}
else
! next = flow_delete_insn (start);
if (start == finish)
break;
--- 260,266 ----
NOTE_SOURCE_FILE (start) = name;
}
else
! next = delete_insn (start);
if (start == finish)
break;
*************** try_redirect_by_replacing_jump (e, targe
*** 1092,1098 ****
&& NOTE_LINE_NUMBER (e->src->end) >= 0)
{
rtx prev = PREV_INSN (e->src->end);
! flow_delete_insn (e->src->end);
e->src->end = prev;
}
--- 1040,1046 ----
&& NOTE_LINE_NUMBER (e->src->end) >= 0)
{
rtx prev = PREV_INSN (e->src->end);
! delete_insn (e->src->end);
e->src->end = prev;
}
*************** commit_one_edge_insertion (e)
*** 1683,1689 ****
bb->end = last;
if (before)
! flow_delete_insn (before);
}
else if (GET_CODE (last) == JUMP_INSN)
abort ();
--- 1631,1637 ----
bb->end = last;
if (before)
! delete_insn (before);
}
else if (GET_CODE (last) == JUMP_INSN)
abort ();
Index: cfgbuild.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cfgbuild.c,v
retrieving revision 1.3
diff -c -3 -p -r1.3 cfgbuild.c
*** cfgbuild.c 2001/09/11 16:58:57 1.3
--- cfgbuild.c 2001/09/12 15:37:18
*************** find_basic_blocks_1 (f)
*** 442,448 ****
if (bb_note == NULL_RTX)
bb_note = insn;
else
! next = flow_delete_insn (insn);
}
break;
}
--- 442,448 ----
if (bb_note == NULL_RTX)
bb_note = insn;
else
! next = delete_insn (insn);
}
break;
}
*************** find_basic_blocks_1 (f)
*** 581,587 ****
if (head != NULL_RTX)
create_basic_block_structure (i++, head, end, bb_note);
else if (bb_note)
! flow_delete_insn (bb_note);
if (i != n_basic_blocks)
abort ();
--- 581,587 ----
if (head != NULL_RTX)
create_basic_block_structure (i++, head, end, bb_note);
else if (bb_note)
! delete_insn (bb_note);
if (i != n_basic_blocks)
abort ();
Index: cfgcleanup.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cfgcleanup.c,v
retrieving revision 1.3
diff -c -3 -p -r1.3 cfgcleanup.c
*** cfgcleanup.c 2001/09/11 16:58:57 1.3
--- cfgcleanup.c 2001/09/12 15:37:18
*************** merge_blocks_move_predecessor_nojumps (a
*** 277,283 ****
barrier = next_nonnote_insn (a->end);
if (GET_CODE (barrier) != BARRIER)
abort ();
! flow_delete_insn (barrier);
/* Move block and loop notes out of the chain so that we do not
disturb their order.
--- 277,283 ----
barrier = next_nonnote_insn (a->end);
if (GET_CODE (barrier) != BARRIER)
abort ();
! delete_insn (barrier);
/* Move block and loop notes out of the chain so that we do not
disturb their order.
*************** merge_blocks_move_successor_nojumps (a,
*** 337,343 ****
/* There had better have been a barrier there. Delete it. */
if (barrier && GET_CODE (barrier) == BARRIER)
! flow_delete_insn (barrier);
/* Move block and loop notes out of the chain so that we do not
disturb their order.
--- 337,343 ----
/* There had better have been a barrier there. Delete it. */
if (barrier && GET_CODE (barrier) == BARRIER)
! delete_insn (barrier);
/* Move block and loop notes out of the chain so that we do not
disturb their order.
Index: cse.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cse.c,v
retrieving revision 1.203
diff -c -3 -p -r1.203 cse.c
*** cse.c 2001/08/28 01:29:48 1.203
--- cse.c 2001/09/12 15:37:20
*************** delete_trivially_dead_insns (insns, nreg
*** 7689,7695 ****
count_reg_usage (insn, counts, NULL_RTX, -1);
if (insn == bb->end)
bb->end = PREV_INSN (insn);
! flow_delete_insn (insn);
}
if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
--- 7689,7695 ----
count_reg_usage (insn, counts, NULL_RTX, -1);
if (insn == bb->end)
bb->end = PREV_INSN (insn);
! delete_insn (insn);
}
if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
Index: except.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/except.c,v
retrieving revision 1.189
diff -c -3 -p -r1.189 except.c
*** except.c 2001/08/27 17:25:36 1.189
--- except.c 2001/09/12 15:37:20
*************** connect_post_landing_pads ()
*** 1850,1856 ****
seq = get_insns ();
end_sequence ();
emit_insns_before (seq, region->resume);
! flow_delete_insn (region->resume);
}
}
--- 1850,1856 ----
seq = get_insns ();
end_sequence ();
emit_insns_before (seq, region->resume);
! delete_insn (region->resume);
}
}
Index: flow.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/flow.c,v
retrieving revision 1.477
diff -c -3 -p -r1.477 flow.c
*** flow.c 2001/09/10 12:23:07 1.477
--- flow.c 2001/09/12 15:37:21
*************** delete_dead_jumptables ()
*** 810,817 ****
{
if (rtl_dump_file)
fprintf (rtl_dump_file, "Dead jumptable %i removed\n", INSN_UID (insn));
! flow_delete_insn (NEXT_INSN (insn));
! flow_delete_insn (insn);
next = NEXT_INSN (next);
}
}
--- 810,817 ----
{
if (rtl_dump_file)
fprintf (rtl_dump_file, "Dead jumptable %i removed\n", INSN_UID (insn));
! delete_insn (NEXT_INSN (insn));
! delete_insn (insn);
next = NEXT_INSN (next);
}
}
*************** propagate_block_delete_insn (bb, insn)
*** 1368,1374 ****
for (i = 0; i < len; i++)
LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
! flow_delete_insn (next);
}
}
--- 1368,1374 ----
for (i = 0; i < len; i++)
LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
! delete_insn (next);
}
}
*************** propagate_block_delete_insn (bb, insn)
*** 1377,1383 ****
bb->end = PREV_INSN (insn);
purge_dead_edges (bb);
}
! flow_delete_insn (insn);
}
/* Delete dead libcalls for propagate_block. Return the insn
--- 1377,1383 ----
bb->end = PREV_INSN (insn);
purge_dead_edges (bb);
}
! delete_insn (insn);
}
/* Delete dead libcalls for propagate_block. Return the insn
Index: function.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/function.c,v
retrieving revision 1.305
diff -c -3 -p -r1.305 function.c
*** function.c 2001/09/05 17:48:26 1.305
--- function.c 2001/09/12 15:37:23
*************** thread_prologue_and_epilogue_insns (f)
*** 7309,7315 ****
if (simplejump_p (jump))
{
emit_return_into_block (bb, epilogue_line_note);
! flow_delete_insn (jump);
}
/* If we have a conditional jump, we can try to replace
--- 7309,7315 ----
if (simplejump_p (jump))
{
emit_return_into_block (bb, epilogue_line_note);
! delete_insn (jump);
}
/* If we have a conditional jump, we can try to replace
Index: ifcvt.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ifcvt.c,v
retrieving revision 1.66
diff -c -3 -p -r1.66 ifcvt.c
*** ifcvt.c 2001/08/22 14:51:32 1.66
--- ifcvt.c 2001/09/12 15:37:23
*************** noce_process_if_block (test_bb, then_bb,
*** 1767,1773 ****
/* The original sets may now be killed. */
if (insn_a == then_bb->end)
then_bb->end = PREV_INSN (insn_a);
! flow_delete_insn (insn_a);
/* Several special cases here: First, we may have reused insn_b above,
in which case insn_b is now NULL. Second, we want to delete insn_b
--- 1767,1773 ----
/* The original sets may now be killed. */
if (insn_a == then_bb->end)
then_bb->end = PREV_INSN (insn_a);
! delete_insn (insn_a);
/* Several special cases here: First, we may have reused insn_b above,
in which case insn_b is now NULL. Second, we want to delete insn_b
*************** noce_process_if_block (test_bb, then_bb,
*** 1779,1792 ****
{
if (insn_b == else_bb->end)
else_bb->end = PREV_INSN (insn_b);
! flow_delete_insn (insn_b);
}
/* The new insns will have been inserted before cond_earliest. We should
be able to remove the jump with impunity, but the condition itself may
have been modified by gcse to be shared across basic blocks. */
test_bb->end = PREV_INSN (jump);
! flow_delete_insn (jump);
/* If we used a temporary, fix it up now. */
if (orig_x != x)
--- 1779,1792 ----
{
if (insn_b == else_bb->end)
else_bb->end = PREV_INSN (insn_b);
! delete_insn (insn_b);
}
/* The new insns will have been inserted before cond_earliest. We should
be able to remove the jump with impunity, but the condition itself may
have been modified by gcse to be shared across basic blocks. */
test_bb->end = PREV_INSN (jump);
! delete_insn (jump);
/* If we used a temporary, fix it up now. */
if (orig_x != x)
*************** find_cond_trap (test_bb, then_edge, else
*** 2190,2199 ****
emit_insn_before (seq, cond_earliest);
test_bb->end = PREV_INSN (jump);
! flow_delete_insn (jump);
trap_bb->end = PREV_INSN (trap);
! flow_delete_insn (trap);
/* Merge the blocks! */
if (trap_bb != then_bb && ! else_bb)
--- 2190,2199 ----
emit_insn_before (seq, cond_earliest);
test_bb->end = PREV_INSN (jump);
! delete_insn (jump);
trap_bb->end = PREV_INSN (trap);
! delete_insn (trap);
/* Merge the blocks! */
if (trap_bb != then_bb && ! else_bb)
Index: jump.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/jump.c,v
retrieving revision 1.196
diff -c -3 -p -r1.196 jump.c
*** jump.c 2001/08/31 05:55:53 1.196
--- jump.c 2001/09/12 15:37:23
*************** delete_insn (insn)
*** 1757,1771 ****
/* Mark this insn as deleted. */
INSN_DELETED_P (insn) = 1;
- /* If instruction is followed by a barrier,
- delete the barrier too. */
-
- if (next != 0 && GET_CODE (next) == BARRIER)
- {
- INSN_DELETED_P (next) = 1;
- next = NEXT_INSN (next);
- }
-
/* Patch out INSN (and the barrier if any) */
if (! dont_really_delete)
--- 1757,1762 ----
*************** delete_insn (insn)
*** 1793,1828 ****
and delete the label if it is now unused. */
if (GET_CODE (insn) == JUMP_INSN && JUMP_LABEL (insn))
! {
! rtx lab = JUMP_LABEL (insn), lab_next;
!
! if (--LABEL_NUSES (lab) == 0)
! {
! /* This can delete NEXT or PREV,
! either directly if NEXT is JUMP_LABEL (INSN),
! or indirectly through more levels of jumps. */
! delete_insn (lab);
!
! /* I feel a little doubtful about this loop,
! but I see no clean and sure alternative way
! to find the first insn after INSN that is not now deleted.
! I hope this works. */
! while (next && INSN_DELETED_P (next))
! next = NEXT_INSN (next);
! return next;
! }
! else if ((lab_next = next_nonnote_insn (lab)) != NULL
! && GET_CODE (lab_next) == JUMP_INSN
! && (GET_CODE (PATTERN (lab_next)) == ADDR_VEC
! || GET_CODE (PATTERN (lab_next)) == ADDR_DIFF_VEC))
! {
! /* If we're deleting the tablejump, delete the dispatch table.
! We may not be able to kill the label immediately preceeding
! just yet, as it might be referenced in code leading up to
! the tablejump. */
! delete_insn (lab_next);
! }
! }
/* Likewise if we're deleting a dispatch table. */
--- 1784,1790 ----
and delete the label if it is now unused. */
if (GET_CODE (insn) == JUMP_INSN && JUMP_LABEL (insn))
! LABEL_NUSES (JUMP_LABEL (insn))--;
/* Likewise if we're deleting a dispatch table. */
*************** delete_insn (insn)
*** 1835,1844 ****
int len = XVECLEN (pat, diff_vec_p);
for (i = 0; i < len; i++)
! if (--LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0)) == 0)
! delete_insn (XEXP (XVECEXP (pat, diff_vec_p, i), 0));
! while (next && INSN_DELETED_P (next))
! next = NEXT_INSN (next);
return next;
}
--- 1797,1803 ----
int len = XVECLEN (pat, diff_vec_p);
for (i = 0; i < len; i++)
! LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
return next;
}
*************** delete_insn (insn)
*** 1848,1894 ****
if (REG_NOTE_KIND (note) == REG_LABEL
/* This could also be a NOTE_INSN_DELETED_LABEL note. */
&& GET_CODE (XEXP (note, 0)) == CODE_LABEL)
! if (--LABEL_NUSES (XEXP (note, 0)) == 0)
! delete_insn (XEXP (note, 0));
while (prev && (INSN_DELETED_P (prev) || GET_CODE (prev) == NOTE))
prev = PREV_INSN (prev);
-
- /* If INSN was a label and a dispatch table follows it,
- delete the dispatch table. The tablejump must have gone already.
- It isn't useful to fall through into a table. */
-
- if (was_code_label
- && NEXT_INSN (insn) != 0
- && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN
- && (GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_VEC
- || GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_DIFF_VEC))
- next = delete_insn (NEXT_INSN (insn));
-
- /* If INSN was a label, delete insns following it if now unreachable. */
-
- if (was_code_label && prev && GET_CODE (prev) == BARRIER)
- {
- register RTX_CODE code;
- while (next != 0
- && (GET_RTX_CLASS (code = GET_CODE (next)) == 'i'
- || code == NOTE || code == BARRIER
- || (code == CODE_LABEL && INSN_DELETED_P (next))))
- {
- if (code == NOTE
- && NOTE_LINE_NUMBER (next) != NOTE_INSN_FUNCTION_END)
- next = NEXT_INSN (next);
- /* Keep going past other deleted labels to delete what follows. */
- else if (code == CODE_LABEL && INSN_DELETED_P (next))
- next = NEXT_INSN (next);
- else
- /* Note: if this deletes a jump, it can cause more
- deletion of unreachable code, after a different label.
- As long as the value from this recursive call is correct,
- this invocation functions correctly. */
- next = delete_insn (next);
- }
- }
return next;
}
--- 1807,1816 ----
if (REG_NOTE_KIND (note) == REG_LABEL
/* This could also be a NOTE_INSN_DELETED_LABEL note. */
&& GET_CODE (XEXP (note, 0)) == CODE_LABEL)
! LABEL_NUSES (XEXP (note, 0))--;
while (prev && (INSN_DELETED_P (prev) || GET_CODE (prev) == NOTE))
prev = PREV_INSN (prev);
return next;
}
Index: regmove.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/regmove.c,v
retrieving revision 1.113
diff -c -3 -p -r1.113 regmove.c
*** regmove.c 2001/08/22 14:35:33 1.113
--- regmove.c 2001/09/12 15:37:24
*************** combine_stack_adjustments_for_block (bb)
*** 2408,2414 ****
-last_sp_adjust))
{
/* It worked! */
! flow_delete_insn (last_sp_set);
last_sp_set = insn;
last_sp_adjust += this_adjust;
free_csa_memlist (memlist);
--- 2408,2414 ----
-last_sp_adjust))
{
/* It worked! */
! delete_insn (last_sp_set);
last_sp_set = insn;
last_sp_adjust += this_adjust;
free_csa_memlist (memlist);
*************** combine_stack_adjustments_for_block (bb)
*** 2450,2456 ****
{
if (last_sp_set == bb->head)
bb->head = NEXT_INSN (last_sp_set);
! flow_delete_insn (last_sp_set);
free_csa_memlist (memlist);
memlist = NULL;
--- 2450,2456 ----
{
if (last_sp_set == bb->head)
bb->head = NEXT_INSN (last_sp_set);
! delete_insn (last_sp_set);
free_csa_memlist (memlist);
memlist = NULL;
*************** combine_stack_adjustments_for_block (bb)
*** 2487,2498 ****
break;
if (pending_delete)
! flow_delete_insn (pending_delete);
}
if (pending_delete)
{
bb->end = PREV_INSN (pending_delete);
! flow_delete_insn (pending_delete);
}
}
--- 2487,2498 ----
break;
if (pending_delete)
! delete_insn (pending_delete);
}
if (pending_delete)
{
bb->end = PREV_INSN (pending_delete);
! delete_insn (pending_delete);
}
}
Index: reload1.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/reload1.c,v
retrieving revision 1.291
diff -c -3 -p -r1.291 reload1.c
*** reload1.c 2001/09/02 16:38:46 1.291
--- reload1.c 2001/09/12 15:37:26
*************** fixup_abnormal_edges ()
*** 9519,9525 ****
if (INSN_P (insn))
{
insert_insn_on_edge (PATTERN (insn), e);
! flow_delete_insn (insn);
}
insn = next;
}
--- 9519,9525 ----
if (INSN_P (insn))
{
insert_insn_on_edge (PATTERN (insn), e);
! delete_insn (insn);
}
insn = next;
}
Index: ssa-ccp.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ssa-ccp.c,v
retrieving revision 1.9
diff -c -3 -p -r1.9 ssa-ccp.c
*** ssa-ccp.c 2001/08/28 23:38:12 1.9
--- ssa-ccp.c 2001/09/12 15:37:26
*************** ssa_fast_dce (df)
*** 1220,1239 ****
else if (def == BLOCK_FOR_INSN (def)->head)
{
BLOCK_FOR_INSN (def)->head = NEXT_INSN (def);
! flow_delete_insn (def);
}
else if (def == BLOCK_FOR_INSN (def)->end)
{
BLOCK_FOR_INSN (def)->end = PREV_INSN (def);
! flow_delete_insn (def);
}
else
! flow_delete_insn (def);
}
else
! {
! flow_delete_insn (def);
! }
VARRAY_RTX (ssa_definition, reg) = NULL;
}
}
--- 1220,1237 ----
else if (def == BLOCK_FOR_INSN (def)->head)
{
BLOCK_FOR_INSN (def)->head = NEXT_INSN (def);
! delete_insn (def);
}
else if (def == BLOCK_FOR_INSN (def)->end)
{
BLOCK_FOR_INSN (def)->end = PREV_INSN (def);
! delete_insn (def);
}
else
! delete_insn (def);
}
else
! delete_insn (def);
VARRAY_RTX (ssa_definition, reg) = NULL;
}
}
More information about the Gcc-patches
mailing list