diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-21 12:55:18 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-21 12:55:18 +0000 |
commit | e4bf866d3b6dcde0717eea60e420ff147a7b0304 (patch) | |
tree | 270b09662a6e53b3a40319fd6d71ba88ad553f13 /gcc/cfg.c | |
parent | 369293ed9c65de0c519c829159ead40bd141af1d (diff) | |
download | gcc-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.c | 116 |
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 (); |