diff options
author | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-05-08 09:17:27 +0000 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-05-08 09:17:27 +0000 |
commit | 969d70ca573bbd887b1ccfa21130c70b463ad1f9 (patch) | |
tree | e792f9087c41693050ce30fb1cf4b7791611a354 /gcc/emit-rtl.c | |
parent | 41f8d041be068873c8c27b3e9c86bed3b2c90385 (diff) | |
download | gcc-969d70ca573bbd887b1ccfa21130c70b463ad1f9.zip gcc-969d70ca573bbd887b1ccfa21130c70b463ad1f9.tar.gz gcc-969d70ca573bbd887b1ccfa21130c70b463ad1f9.tar.bz2 |
cfglayout.c (function_tail_eff_head): Rename to ...
* cfglayout.c (function_tail_eff_head): Rename to ...
(function_footer): ... this one.
(unlink_insn_chain): New functions.
(label_for_bb): Only call block_label and emit debug message.
(record_effective_endpoints): Actually unlink the headers and footers.
(fixup_reorder_cahin): Re-insert the unlinked sequences.
(cfg_layout_duplicate_bb): Use duplicate_insn_chain.
* cfglayout.h (struct reorder_block_def): New fields footer/header;
remove eff_head/eff_end.
* rtl.h (set_first_insn): Declare.
* emit-rtl.c (set_first_insn): New function.
* cfglayout.c (fixup_reorder_chain): Dump duplicated
(cfg_layout_can_duplicate_bb_p, cfg_layout_rerirect_edge,
cfg_layout_duplicate_bb): New global function.
(duplicate_insn_chain): New static function.
* cfglayout.h (cfg_layout_can_duplicate_bb_p, cfg_layout_rerirect_edge,
cfg_layout_duplicate_bb): Declare.
(struct reorder_block_def): Add "original" field.
* emit-rtl.c (emit_copy_of_insn_after): New function.
* rtl.h (emit_copy_of_insn_after): Declare.
* cfglayout.c (fixup_fallthru_exit_predecessor): Kill.
(fixup_reorder_chain): properly handle edges to exit block.
Wed May 8 11:10:31 CEST 2002 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Jan Hubicka <jh@suse.cz>
* basic-block.h (note_prediction_to_br_prob): declare.
* c-semantics.c: Inlucde predit.h
(expand_stmt): predict GOTO_STMT as not taken.
* cfgcleanup.c: (delete_unreachable_blocks): Make global.
(cleanup_cfg): Do not free tail_recursion_list.
* cfgrtl.c (can_delete_note_p): Delete NOTE_INSN_PREDICTION.
(flow_delete_block): Kill predictions past end of basic block.
* output.h (delete_unreachable_blocks): Declare.
* predict.c (predicted_by_p, process_note_predictions,
process_note_prediction, last_block_p): New function.
(estimate_probability): Bypass loop on PRED_CONTINUE;
do not handle noreturn heuristics; kill PRED_RETURN; add
PRED_EARLY_RETURN.
* predict.def (PRED_CONTINUE, PRED_EARLY_RETURN, PRED_GOTO,
PRED_CONST_RETURN, PRED_NEGATIVE_RETURN, PRED_NULL_RETURN): New.
* predict.h (IS_TAKEN): New constant.
* print-rtl.c (print_rtx): Pretty print NOTE_INSN_PREDICTION.
* rtl.c (NOTE_INSN_PREDICTION): New.
* rtl.h (NOTE_PREDICTION, NOTE_PREDICTION_ALG, NOTE_PREDICTION_FLAGS):
New macro.
(insn_note): add NOTE_INSN_PREDICTION.
* sibcall.c (optimize_sibling_and_tail_recursive_call): Do not build
CFG; free tail_recursion_label_list.
* stmt.c: Include predict.h;
(return_prediction): New.
(expand_value_return): Use it.
* toplev.c: Lower NOTE_INSN_PREDICTION before sibcall.
From-SVN: r53285
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r-- | gcc/emit-rtl.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 4b9c2dc..adeabe9 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -3731,6 +3731,27 @@ emit_call_insn_before (pattern, before) return insn; } +/* Make an instruction with body PATTERN and code CALL_INSN + and output it before the instruction BEFORE. */ + +rtx +emit_call_insn_after (pattern, before) + rtx pattern, before; +{ + rtx insn; + + if (GET_CODE (pattern) == SEQUENCE) + insn = emit_insn_after (pattern, before); + else + { + insn = make_call_insn_raw (pattern); + add_insn_after (insn, before); + PUT_CODE (insn, CALL_INSN); + } + + return insn; +} + /* Make an insn of code BARRIER and output it before the insn BEFORE. */ @@ -5052,3 +5073,68 @@ restore_line_number_status (old_value) { no_line_numbers = old_value; } + +/* Produce exact duplicate of insn INSN after AFTER. + Care updating of libcall regions if present. */ + +rtx +emit_copy_of_insn_after (insn, after) + rtx insn, after; +{ + rtx new; + rtx note1, note2, link; + + switch (GET_CODE (insn)) + { + case INSN: + new = emit_insn_after (copy_insn (PATTERN (insn)), after); + break; + + case JUMP_INSN: + new = emit_jump_insn_after (copy_insn (PATTERN (insn)), after); + break; + + case CALL_INSN: + new = emit_call_insn_after (copy_insn (PATTERN (insn)), after); + if (CALL_INSN_FUNCTION_USAGE (insn)) + CALL_INSN_FUNCTION_USAGE (new) + = copy_insn (CALL_INSN_FUNCTION_USAGE (insn)); + SIBLING_CALL_P (new) = SIBLING_CALL_P (insn); + CONST_OR_PURE_CALL_P (new) = CONST_OR_PURE_CALL_P (insn); + break; + + default: + abort (); + } + + /* Update LABEL_NUSES. */ + mark_jump_label (PATTERN (new), new, 0); + + /* Copy all REG_NOTES except REG_LABEL since mark_jump_label will + make them. */ + for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) + if (REG_NOTE_KIND (link) != REG_LABEL) + { + if (GET_CODE (link) == EXPR_LIST) + REG_NOTES (new) + = copy_insn_1 (gen_rtx_EXPR_LIST (REG_NOTE_KIND (link), + XEXP (link, 0), + REG_NOTES (new))); + else + REG_NOTES (new) + = copy_insn_1 (gen_rtx_INSN_LIST (REG_NOTE_KIND (link), + XEXP (link, 0), + REG_NOTES (new))); + } + + /* Fix the libcall sequences. */ + if ((note1 = find_reg_note (new, REG_RETVAL, NULL_RTX)) != NULL) + { + rtx p = new; + while ((note2 = find_reg_note (p, REG_LIBCALL, NULL_RTX)) == NULL) + p = PREV_INSN (p); + XEXP (note1, 0) = p; + XEXP (note2, 0) = new; + } + return new; +} |