summaryrefslogtreecommitdiff
path: root/gcc/cfg.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-21 12:55:18 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-21 12:55:18 +0000
commite4bf866d3b6dcde0717eea60e420ff147a7b0304 (patch)
tree270b09662a6e53b3a40319fd6d71ba88ad553f13 /gcc/cfg.c
parent369293ed9c65de0c519c829159ead40bd141af1d (diff)
downloadgcc-e4bf866d3b6dcde0717eea60e420ff147a7b0304.tar.gz
* basic-block.h (flow_delete_insn, flow_delete_insn_chain): Kill.
* cfg.c (delete_insn): Rename from ....; use remove_insn; do not remove some labels. (flow_delete_insn): This one. (delete_insn_chain): Rename from ...; do not care labels. (flow_delete_insn_chain): ... this one. (flow_delete_block): Remove the insns one BB has been expunged. (merge_blocks_nomove): Likewise. (try_redirect_by_replacing_jump): Use delete_insn[_chain]; do not care updating BB boundaries. (tidy_fallthru_edge): Likewise. (commit_one_edge_insertion): Likewise. * cfgbuild.c (find_basic_block): Likewise. (find_basic_blocks_1): Likewise. * cfgcleanup.c (merge_blocks_move_predecessor_nojumps): Likewise. (try_crossjump_to_edge): Likewise. (try_optimize_cfg): Likewise. * cse.c (delete_trivially_dead_insns): Likewise. * df.c (df_insn_delete): Likewise. * doloop.c (doloop_modify): Use delete_related_insns. * emit-rtl.c (try_split): Likewise. (remove_insn): Update BB boundaries. * expect.c (connect_post_landing_pads): Use delete_related_insns. * flow.c (delete_dead_jumptables): Use delete_insn[_chain]; do not care updating BB boundaries. (propagate_block_delete_insn): Likewise. (propagate_block_delete_libcall): Likewise. * function.c (delete_handlers): Use delete_related_insns. (thread_prologue_and_epilogue_insns): Likewise. * gcse.c (delete_null_pointer_checks): Use delete_related_insns. * genpeep.c (gen_peephole): Use delete_related_insns. * ifcvt.c (noce_process_if_block): Use delete_insn; do not care updating BB boundaries. (find_cond_trap): Likewise. * integrate.c (save_for_inline): Use delete_related_insns. (copy_insn_list): Likewise. * jump.c (pruge_linie_number_notes): Likewise. (duplicate_loop_exit_test): Likewise. (delete_computation): Likewise. (delete_related_insn): Rename from ...; use delete_insn (delete_insn): ... this one. (redirect_jump): Use delete_related_insns. * loop.c (scan_loop): Likewise. (move_movables): Likewise. (find_and_verify_loops): Likewise. (check_dbra_loop): Likewise. * recog.c (peephole2_optimize): Likewise. * reg-stack.c (delete_insn_for_stacker): Remove. (move_for_stack_reg): Use delete_insn. * regmove.c (combine_stack_adjustments_for_block): Likewise. * reload1.c (delete_address_reloads): Use delete_related_insns. (fixup_abnormal_edges): Use delete_insn. * recog.c (emit_delay_sequence): Use delete_related_insns. (delete_from-delay_slot): Likewise. (delete_scheduled_jump): likewise. (optimize_skip): Likewise. (try_merge_delay_insns): Likewise. (full_simple_delay_slots): Likewise. (fill_slots_from_thread): Likewise. (relax_delay_slots): Likewise. (make_return_insns): Likewise. (dbr_schedule): Likewise. * rtl.h (delete_insn): Rename to delete_related_insns. (delete_insn, delete_insn_chain): New prototypes. * ssa-ccp (sse_fast_dce): Remove deleting of DEF, as it is done by df_insn_delete already. * ssa-dce.c (delete_insn_bb): Use delete_insn. * ssa.c (convert_from_ssa): Use delete_related_insns. * unroll.c (unroll_loop): Likewise. (calculate_giv_inc): Likewise. (copy_loop_body): Likewise. * i386-protos.h (ix86_libcall_value, ix86_function_value, ix86_function_arg_regno_p, ix86_function_arg_boundary, ix86_return_in_memory, ix86_function_value): Declare. * i386.c (x86_64_int_parameter_registers, x86_64_int_return_registers): new static valurables. (x86_64_reg_class): New enum (x86_64_reg_class_name): New array. (classify_argument, examine_argument, construct_container, merge_classes): New static functions. (optimization_options): Enable flag_omit_frame_pointer and disable flag_pcc_struct_return on 64bit. (ix86_libcall_value, ix86_function_value, ix86_function_arg_regno_p, ix86_function_arg_boundary, ix86_return_in_memory, ix86_function_value): New global functions. (init_cumulative_args): Refuse regparm on x86_64, set maybe_vaarg. (function_arg_advance): Handle x86_64 passing conventions. (function_arg): Likewise. * i386.h (FUNCTION_ARG_BOUNDARY): New macro. (RETURN_IN_MEMORY): Move offline. (FUNCTION_VALUE, LIBCALL_VALUE): Likewise. (FUNCTION_VALUE_REGNO_P): New macro. (FUNCTION_ARG_REGNO_P): Move offline. (struct ix86_args): Add maybe_vaarg. * next.h (FUNCTION_VALUE_REGNO_P): Delete. * unix.h (FUNCTION_VALUE_REGNO_P): Delete. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45726 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfg.c')
-rw-r--r--gcc/cfg.c116
1 files changed, 50 insertions, 66 deletions
diff --git a/gcc/cfg.c b/gcc/cfg.c
index 9ba752d456e..9988ecd2099 100644
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -27,7 +27,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
- Initialization/deallocation
init_flow, clear_edges
- CFG aware instruction chain manipulation
- flow_delete_insn, flow_delete_insn_chain
+ delete_insn, 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.
@@ -242,26 +242,35 @@ can_delete_label_p (label)
/* Delete INSN by patching it out. Return the next insn. */
rtx
-flow_delete_insn (insn)
+delete_insn (insn)
rtx insn;
{
- rtx prev = PREV_INSN (insn);
rtx next = NEXT_INSN (insn);
rtx note;
+ bool really_delete = true;
- PREV_INSN (insn) = NULL_RTX;
- NEXT_INSN (insn) = NULL_RTX;
- INSN_DELETED_P (insn) = 1;
+ if (GET_CODE (insn) == CODE_LABEL)
+ {
+ /* Some labels can't be directly removed from the INSN chain, as they
+ might be references via variables, constant pool etc.
+ Convert them to the special NOTE_INSN_DELETED_LABEL note. */
+ if (! can_delete_label_p (insn))
+ {
+ const char *name = LABEL_NAME (insn);
- if (prev)
- NEXT_INSN (prev) = next;
- if (next)
- PREV_INSN (next) = prev;
- else
- set_last_insn (prev);
+ really_delete = false;
+ PUT_CODE (insn, NOTE);
+ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
+ NOTE_SOURCE_FILE (insn) = name;
+ }
+ remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
+ }
- if (GET_CODE (insn) == CODE_LABEL)
- remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
+ if (really_delete)
+ {
+ remove_insn (insn);
+ INSN_DELETED_P (insn) = 1;
+ }
/* If deleting a jump, decrement the use count of the label. Deleting
the label itself should happen in the normal course of block merging. */
@@ -295,7 +304,7 @@ flow_delete_insn (insn)
that must be paired. */
void
-flow_delete_insn_chain (start, finish)
+delete_insn_chain (start, finish)
rtx start, finish;
{
/* Unchain the insns one by one. It would be quicker to delete all
@@ -309,16 +318,8 @@ flow_delete_insn_chain (start, finish)
next = NEXT_INSN (start);
if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
;
- else if (GET_CODE (start) == CODE_LABEL
- && ! can_delete_label_p (start))
- {
- const char *name = LABEL_NAME (start);
- PUT_CODE (start, NOTE);
- NOTE_LINE_NUMBER (start) = NOTE_INSN_DELETED_LABEL;
- NOTE_SOURCE_FILE (start) = name;
- }
else
- next = flow_delete_insn (start);
+ next = delete_insn (start);
if (start == finish)
break;
@@ -510,19 +511,18 @@ flow_delete_block (b)
end = tmp;
/* Selectively delete the entire chain. */
- flow_delete_insn_chain (insn, end);
+ b->head = NULL;
+ delete_insn_chain (insn, end);
/* Remove the edges into and out of this block. Note that there may
indeed be edges in, if we are removing an unreachable loop. */
- {
- while (b->pred != NULL)
- remove_edge (b->pred);
- while (b->succ != NULL)
- remove_edge (b->succ);
+ while (b->pred != NULL)
+ remove_edge (b->pred);
+ while (b->succ != NULL)
+ remove_edge (b->succ);
- b->pred = NULL;
- b->succ = NULL;
- }
+ b->pred = NULL;
+ b->succ = NULL;
/* Remove the basic block from the array, and compact behind it. */
expunge_block (b);
@@ -958,10 +958,6 @@ merge_blocks_nomove (a, b)
else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
del_first = NEXT_INSN (a_end);
- /* Delete everything marked above as well as crap that might be
- hanging out between the two blocks. */
- flow_delete_insn_chain (del_first, del_last);
-
/* Normally there should only be one successor of A and that is B, but
partway though the merge of blocks for conditional_execution we'll
be merging a TEST block with THEN and ELSE successors. Free the
@@ -977,6 +973,12 @@ merge_blocks_nomove (a, b)
/* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
b->pred = b->succ = NULL;
+ expunge_block (b);
+
+ /* Delete everything marked above as well as crap that might be
+ hanging out between the two blocks. */
+ delete_insn_chain (del_first, del_last);
+
/* Reassociate the insns of B with A. */
if (!b_empty)
{
@@ -993,8 +995,6 @@ merge_blocks_nomove (a, b)
a_end = b_end;
}
a->end = a_end;
-
- expunge_block (b);
}
/* Return label in the head of basic block. Create one if it doesn't exist. */
@@ -1055,13 +1055,12 @@ try_redirect_by_replacing_jump (e, target)
/* See if we can create the fallthru edge. */
if (can_fallthru (src, target))
{
- src->end = PREV_INSN (kill_from);
if (rtl_dump_file)
fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
fallthru = 1;
/* Selectivly unlink whole insn chain. */
- flow_delete_insn_chain (kill_from, PREV_INSN (target->head));
+ delete_insn_chain (kill_from, PREV_INSN (target->head));
}
/* If this already is simplejump, redirect it. */
else if (simplejump_p (insn))
@@ -1079,14 +1078,14 @@ try_redirect_by_replacing_jump (e, target)
rtx target_label = block_label (target);
rtx barrier;
- src->end = emit_jump_insn_before (gen_jump (target_label), kill_from);
+ emit_jump_insn_after (gen_jump (target_label), kill_from);
JUMP_LABEL (src->end) = target_label;
LABEL_NUSES (target_label)++;
if (rtl_dump_file)
fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
INSN_UID (insn), INSN_UID (src->end));
- flow_delete_insn_chain (kill_from, insn);
+ delete_insn_chain (kill_from, insn);
barrier = next_nonnote_insn (src->end);
if (!barrier || GET_CODE (barrier) != BARRIER)
@@ -1108,11 +1107,7 @@ try_redirect_by_replacing_jump (e, target)
the potential of changing the code between -g and not -g. */
while (GET_CODE (e->src->end) == NOTE
&& NOTE_LINE_NUMBER (e->src->end) >= 0)
- {
- rtx prev = PREV_INSN (e->src->end);
- flow_delete_insn (e->src->end);
- e->src->end = prev;
- }
+ delete_insn (e->src->end);
if (e->dest != target)
redirect_edge_succ (e, target);
@@ -1387,28 +1382,17 @@ tidy_fallthru_edge (e, b, c)
q = PREV_INSN (q);
#endif
- if (b->head == q)
- {
- PUT_CODE (q, NOTE);
- NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
- NOTE_SOURCE_FILE (q) = 0;
- }
- else
- {
- q = PREV_INSN (q);
-
- /* We don't want a block to end on a line-number note since that has
- the potential of changing the code between -g and not -g. */
- while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
- q = PREV_INSN (q);
- }
+ q = PREV_INSN (q);
- b->end = q;
+ /* We don't want a block to end on a line-number note since that has
+ the potential of changing the code between -g and not -g. */
+ while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
+ q = PREV_INSN (q);
}
/* Selectively unlink the sequence. */
if (q != PREV_INSN (c->head))
- flow_delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
+ delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
e->flags |= EDGE_FALLTHRU;
}
@@ -1692,7 +1676,7 @@ commit_one_edge_insertion (e)
emit_barrier_after (last);
if (before)
- flow_delete_insn (before);
+ delete_insn (before);
}
else if (GET_CODE (last) == JUMP_INSN)
abort ();