* i386.c (ix86_expand_int_movcc): Cleanup; use expand_simple_*op.
* toplev.c (rest_of_compilation): Use CLEANUP_UPDATE_LIFE
to avoid update_life_info call.
* basic-block.h (CLEANUP_UPATE_LIFE): Define.
* cfgcleanup.c (bb_flags): New enum.
(BB_FLAGS, BB_SET_FLAG, BB_CLEAR_FLAG, FORWARDER_BLOCK_P): New macros.
(notice_new_block, update_forwarder_flag): New functions.
(try_simplify_condjump): Use FORWARDER_BLOCK_P.
(try_forward_edges): Likewise; update flags.
(merge_blocks): Likewise.
(outgoing_edges_match): Likewise.
(try_crossjump_to_edge): Likewise.
(try_optimize_cfg): Likewise; initialize and clear the flags;
recompute life info if needed.
(cleanup_cfg): No need to clear aux pointers.
From-SVN: r46434
* basic-block.h (free_bb_for_insn): Declare.
* bb-reorder.c (label_for_bb): Use block_label.
(emit_jump_to_block_after): Remove.
(insert_intra_1): Do not update block_for_insn.
(insert_inter_bb_scope_notes): Likewise; update bb->end
* cfg.c (free_bb_for_insn): New.
(try_rediret_by_replacing_jump): Avoid set_block_for_new_insns call.
(force_nonfallthru_and_redirect): Likewise; do not update BB boundaries.
(commit_one_edge_insertion): Likewise.
(commit_one_edge_insertion): Do not update BB boundary.
(commit_edge_insertions): Do not call compute_bb_for_insn.
* cfgbuild.c (find_basic_blocks): Do not free basic_block_for_insn.
* cfgcleanup.c (merge_blocks_move_predecessor): Use reorder_insns_nobb.
(merge_blocks_move_successor_nojumps): Likewise.
(try_crossjump_to_edge): Do not update block_for_insn.
* combine.c (combine_instructions): Remove compute_bb_for_insn call.
* df.c (df_pattern_emit_later): Do not update BB boundary.
(df_jump_pattern_emit_after): Likewise.
(df_insn_move_before): Use emit_insn_before.
* emit-rtl.c (try_split): Emit after trial to get bb boundary updated
properly.
(add_insn_after, add_insn_before, emit_insns_after): Update BB
boundaries and basic_block_for_insn.
(reorder_insns_nobb): Rename from reorder_insns.
(reorder_insns): New.
(emit_block_insn_before, emit_block_insn_after): Kill.
* flow.c (check_function_return_warnings): Do not call
compute_bb_for_insn; Do not free basic_block_for_insn.
(attempt_auto_inc): Do not update basic_block_for_insn.
* function.c (emit_return_into_block): Likewise;
do not update BB boundaries.
* gcse.c (handle_avail_expr): Do not update basic_block_for_insn.
(insert_insn_end_bb): Use emit_insn_before; Likewise.
(pre_insert_copy_insn): Likewise.
(update_ld_motion_notes): Likewise.
(insert_insn_start_bb): Likewise.
(replace_store_insn): Likewise.
* ifcvt.c (noce_process_if_block): Likewise.
(if_convert): Do not call compute_bb_for_insn.
* lcm.c (optimize_mode_switching): Do not update BB boundaries.
Use emit_insn_before and emit_insn_after.
* recog.c (split_all_insns): Do not update BB boundaries;
Do not call compute_bb_for_insn.
(peephole2_optimize): Do not update BB boundaries.
* reg-stack.c (emit_pop_insn): Use emit_insn_after and
emit_insn_before.
(emit_swap_insn): Likewise.
(convert_regs_1): Likewise.
* reload1.c (reload): Call compute_bb_for_insn.
* rtl.h (reorder_insns_nobb): Declare.
* ssa.c (rename_equivalent_regs): Use emit_insn_before.
* toplev.c (rest_of_compilation): Call free_bb_for_insn
at places CFG is invalidated; do not call compute_bb_for_insn.
* cfg.c (expunge_block): Invalidate BB structure.
* (merge_blocks_nomove): Update properly BLOCK_FOR_INSN
array.
* cfg.c (verify_flow_info): Verify the basic_block_for_insn array.
From-SVN: r45647
2001-08-28 Daniel Berlin <dan@cgsoftware.com>
* df.h (struct df): Add rts_order variable.
* df.c (df_visit_next_rts): New function.
(df_visit_next): Renamed to df_visit_next_rc
(df_analyse_1): Allocate/compute/free rts_order as well.
(df_rd_global_compute): Use df_visit_next_rc instead of
df_visit_next.
(df_ru_global_compute): Use df_visit_next_rts instead of
df_visit_next.
* flow.c (flow_reverse_top_sort_order_compute): New function.
* basic-block.h: Add prototype.
From-SVN: r45246
* basic-block.h (basic_block): Add new field 'flags'.
(BB_REACHABLE): Define.
(expunge_block): Declare.
* flow.c (ENTRY_BLOCK_PTR): Initialize field 'flags'.
(EXIT_BLOCK_PTR): Ditto.
(expunge_block): Remove static declaration.
(cleanup_cfg): Clear bb->aux on every basic block.
(find_unreachable_blocks): Set BB_REACHABLE bit in bb->flags when
computing reachability.
(delete_unreachable_blocks): Delete block b if b->flags has
BB_REACHABLE unset.
From-SVN: r45068
* i386.c (ix86_output_main_function_alignment_hack): New function.
(TARGET_ASM_FUNCTION_PROLOGUE): Default to it.
* flow.c (mark_dfs_back_edges): Move from loop_p ; mark back
edges by EDGE_DFS_BACK flag.
(dump_edge_info): Add dfs_back flag.
* basic-block.h (EDGE_DFS_BACK): New constant.
(mark_dfs_back_edges): Declare.
* alias.c (loop_p): Remove.
(mark_constant_function): Use mark_dfs_back_edges.
* reg-stack.c (block_info_def): Add predecesors counter and stack_out.
(reg_to_stack): Call mark_dfs_back_edges; count the predecesors.
(compensate_edge): Break out from ...
(convert_regs_1): ... here; do smart choosing of stack_out to copy.
(convert_regs_2): Set block_done once block is really done;
Do updating of the predecesors counts.
* toplev.c (rest_of_compilation): Recompute block_for_insn
before post-reload cfg_cleanup.
* function.c (thread_prologue_epilogue_insns):
Call set_block_for_new_insns when emitting prologue directly.
From-SVN: r44486
* basic-block.h (EDGE_FREQUENCY): New macro.
* bb-reorder (fixup_reorder_chain): Set counts and frequencies
for new BB/edges.
* flow.c (find_sub_basic_blocks): Likewise.
(try_crossjump_to_edge): Likewise; use EDGE_FREQUENCY
(redirect_edge_and_branch): Use EDGE_FREQUENCY.
* predict.c (DEF_PREDICTOR): New argument FLAGS.
(HITRATE): New macro.
(PRED_FLAG_FIRST_MATCH): New constant.
(predictor_info): New field flgags.
(combine_predictions_for_insn): Use DS theory to combine
probabilities; set the edge probabilities when finished.
(estimate_probability): Avoid duplicated matches
of LOOP_BRANCH heuristics for nested loops; update comment.
* predict.def: Add flags for each prediction, set probabilities
according to B&L paper.
* predict.h (DEF_PREDICTOR): New argument FLAGS.
* profile.c (compute_branch_probabilities): Cleanup way the edge
probabilities are computed and REG_BR_PROB notes are dropped; if
values does not match, emit error.
(init_branch_prob): Do error instead of warning when profile driven
feedback is missing or corrupt.
From-SVN: r44439
* basic-block.h (PROP_ALLOW_CFG_CHANGES): Define.
(PROP_FINAL): Include PROP_ALLOW_CFG_CHANGES.
(propagate_block): Update prototype.
* flow.c (update_life_info): Simplify the CFG and
recalculate the global regs which are alive when
removing dead code during a global update.
(propagate_block): Return non-zero if an INSN is
deleted.
From-SVN: r44403
* basic-block.h (find_sub_basic_block): Declare.
* flow.c (make_edges): New arguments MIN and MAX;
(find_sub_basic_blocks): Revamp to use make_edges
and purge_dead_edges.
(find_basic_blocks): Update call of find_sub_basic_block.
* recog.c (split_all_insns): Always expect CFG to be consistent;
call find_sub_basic_blocks in case something has changed.
* toplev.c (rest_of_compilation): Always call split_all_insns once CFG
has been built.
* basic-block.h (delete_noop_moves): Declare.
* combine.c (combine_instructions): Call it.
(recog_for_combine): Tolerate noop moves
(distribute_notes): Force refresh when register dies at noop move.
* flow.c (delete_noop_moves): Use BB structure; delete JUMP insns
too.
(life_analysis): Update delete_noop_moves call.
(set_noop_p): Move too ...
* rtlanal.c (noop_move_p): ... here.
* rtl.h (noop_move_p): Declare.
* basic-block.h (purge_all_dead_edges, purge_dead_edges): New functions.
* toplev.c (rest_of_compilation): Conditionally call purge_all_dead_edges
after combine.
* gcse.c (cprop_cc0_jump, cprop_insn): New argument "basic_block".
(cprop_jump): Likewise; call purge_dead_edges if substitution suceeded.
From-SVN: r44267
* basic-block.h (redirect_edge_and_branch_force,
redirect_edge_and_branch, block_label, forwarder_block_p): Declare.
* flow.c (redirect_edge_and_branch_force,
redirect_edge_and_branch, block_label, forwarder_block_p): Make global.
(redirect_edge_and_branch_force): Fix copying of lifeness information.
(block_label): Handle EXIT_BLOCK_PTR by returning NULL.
* ifcvt.c (dead_or_predictable): Take BB as an new destionation
instead of label; update CFG after transformation.
(find_if_case_1): Update call, use redirect_edge_and_branch_force
for finishing the transformation; handle even case where ELSE
does not follow THEN.
(find_if_case_2): Update call of dead_or_predictable; simplify
CFG update.
* emit-rtl.c (split_branch_probability): New global variable.
(try_split): Take care to set split_branch_probability and
create REG_BR_PROB note for new jump insns.
* md.texi (define_split): Document new feature.
* i386.c (ix86_split_fp_branch): Redistribute branch probability notes.
From-SVN: r44249
* basic-block.h (CLEANUP_PRE_SIBCALL): New constant.
* except.c (finish_eh_generation): Update call of cleanup_cfg;
do rebuild_jump_labels instead of jump_optimize
* sibcall.c (optimize_sibling_and_tail_recursive_call): Likewise.
* toplev.c (rest_of_compulation): Likewise for -Wreturn_type.
* flow.c (try_optimize_cfg): Remove unneeded code_labels.
* flow.c: Include timevar.h
(find_basic_block): Push/pop timevar;
(cleanup_cfg): Likewise.
* timevar.def (TV_CFG, TV_CLEANUP_CFG): New.
* Makefile: Add dependencies on timevar.h
* integrate.c (save_for_inline): Kill all BASIC_BLOCK notes.
(copy_insn_list): Avoid killing of BASIC_BLOCK notes.
* rtl.h (delete_trivially_dead_insns): Add new parameter.
* toplev.c (rest_of_compilation): Update calls.
* cse.c (set_live_p, insn_live_p, dead_libcall_p): Break out from ...
(delete_trivially_dead_insns): ... here; accept new argument
preserve_basic_blocks; preserve basic blocks if set.
* reg-stack.c (stack_regs_mentioned): Return 0 if
stack_regs_mentioned_data is not initialized.
(reg_to_stack): Make stack_regs_mentioned survive after the
reg-stack is completted; do not call cleanup_cfg.
* toplev.c (rest_of_compilation): Do cleanup_cfg before bb-reorder;
make cleanup_cfg after bb-reorder to output to debug file.
From-SVN: r44056
* basic-block.h (first_insn_after_basic_block_note): Declare.
* flow.c (first_insn_after_basic_block_note): Define. Moved
from...
* ssa.c (first_insn_after_basic_block_note): Remove.
* ssa-dce.c (find_inherently_necessary): Consider BARRIERs
necessary.
(ssa_eliminate_dead_code): Properly update the CFG and PHI
nodes when we find a dead conditional branch. Insert BARRIERs
after any blocks with no successors, but which do not have
any BARRIERs.
From-SVN: r43816
2001-04-09 Andrew MacLeod <amacleod@redhat.com>
* basic-block.h (set_new_block_for_insns): New Prototype.
(set_block_num): Delete prototype.
* flow.c (set_block_num): Remove obsolete function.
(set_block_for_new_insns): Set BB for single or multiple insns.
* gcse.c (handle_avail_expr): Use set_block_for_new_insns.
(process_insn_end_bb): Use set_block_for_new_insns or
set_block_for_insn instead of set_block_num.
(pre_insert_copy_insn): Use set_block_for_new_insns.
(update_ld_motion_stores): Use set_block_for_new_insns.
(insert_insn_start_bb): Use set_block_for_new_insns.
(replace_store_insn): Use set_block_for_new_insns.
From-SVN: r41208