GCC Middle and Back End API Reference
|
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "target.h"
#include "rtl.h"
#include "tree.h"
#include "cfghooks.h"
#include "df.h"
#include "memmodel.h"
#include "tm_p.h"
#include "insn-config.h"
#include "emit-rtl.h"
#include "cselib.h"
#include "tree-pass.h"
#include "cfgloop.h"
#include "cfgrtl.h"
#include "cfganal.h"
#include "cfgbuild.h"
#include "cfgcleanup.h"
#include "dce.h"
#include "dbgcnt.h"
#include "rtl-iter.h"
#include "regs.h"
#include "function-abi.h"
#include "reg-notes.def"
Macros | |
#define | FORWARDER_BLOCK_P(BB) |
#define | DEF_REG_NOTE(NAME) |
#define | REG_CFA_NOTE(NAME) |
#define | REG_NOTE(NAME) |
Variables | |
static bool | first_pass |
static bool | crossjumps_occurred |
static bool | block_was_dirty |
static const bool | reg_note_cfa_p [] |
#define DEF_REG_NOTE | ( | NAME | ) |
#define FORWARDER_BLOCK_P | ( | BB | ) |
Control flow optimization code for GNU compiler. Copyright (C) 1987-2025 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>.
This file contains optimizer of the control flow. The main entry point is cleanup_cfg. Following optimizations are performed: - Unreachable blocks removal - Edge forwarding (edge to the forwarder block is forwarded to its successor. Simplification of the branch instruction is performed by underlying infrastructure so branch can be converted to simplejump or eliminated). - Cross jumping (tail merging) - Conditional jump-around-simplejump simplification - Basic block merging.
Referenced by merge_blocks_move(), outgoing_edges_match(), try_crossjump_to_edge(), try_forward_edges(), try_optimize_cfg(), and try_simplify_condjump().
#define REG_CFA_NOTE | ( | NAME | ) |
#define REG_NOTE | ( | NAME | ) |
bool bb_is_just_return | ( | basic_block | bb, |
rtx_insn ** | ret, | ||
rtx_insn ** | use ) |
Return true if BB contains just a return and possibly a USE of the return value. Fill in *RET and *USE with the return and use insns if any found, otherwise NULL. All CLOBBERs are ignored.
References ANY_RETURN_P, cfun, EXIT_BLOCK_PTR_FOR_FN, FOR_BB_INSNS_REVERSE, GET_CODE, NONDEBUG_INSN_P, NULL, PATTERN(), REG_FUNCTION_VALUE_P, REG_P, and XEXP.
Referenced by fixup_reorder_chain(), and try_optimize_cfg().
|
static |
Returns true if BB basic block has a preserve label.
References block_label(), and LABEL_PRESERVE_P.
Referenced by try_crossjump_to_edge().
|
static |
Examine register notes on I1 and I2 and return: - dir_forward if I1 can be replaced by I2, or - dir_backward if I2 can be replaced by I1, or - dir_both if both are the case.
References CONST_INT_P, d1, d2, dir_backward, dir_both, dir_forward, dir_none, equal_different_set_p(), find_reg_equal_equiv_note(), i1, i2, NULL_RTX, PATTERN(), reload_completed, rtx_equal_p(), rtx_renumbered_equal_p(), SET_DEST, SET_SRC, single_set(), and values_equal_p().
Referenced by old_insns_match_p().
bool cleanup_cfg | ( | int | mode | ) |
Tidy the CFG by deleting unreachable code and whatnot.
References add_noreturn_fake_exit_edges(), calculate_dominance_info(), CDI_DOMINATORS, changed, CLEANUP_CFG_CHANGED, CLEANUP_CFGLAYOUT, CLEANUP_CROSSJUMP, CLEANUP_EXPENSIVE, CLEANUP_FORCE_FAST_DCE, CLEANUP_NO_INSN_DEL, compact_blocks(), crossjumps_occurred, current_ir_type(), current_loops, dbg_cnt(), delete_dead_jumptables(), delete_trivially_dead_insns(), delete_unreachable_blocks(), dom_info_available_p(), fix_loop_structure(), free_dominance_info(), gcc_assert, get_insns(), IR_RTL_CFGLAYOUT, max_reg_num(), NULL, reload_completed, remove_fake_exit_edges(), run_fast_dce(), timevar_pop(), timevar_push(), and try_optimize_cfg().
Referenced by cfg_layout_initialize(), do_reload(), duplicate_computed_gotos(), execute_hardreg_pre(), execute_rtl_cprop(), execute_rtl_hoist(), execute_rtl_pre(), fwprop_done(), peephole2_optimize(), reload_cse_regs_1(), rest_of_handle_combine(), rest_of_handle_cse(), rest_of_handle_cse2(), rest_of_handle_cse_after_global_opts(), rest_of_handle_dse(), rest_of_handle_if_conversion(), rest_of_handle_thread_prologue_and_epilogue(), split_all_insns(), and pair_fusion::~pair_fusion().
void delete_dead_jumptables | ( | void | ) |
Delete any jump tables never referenced. We can't delete them at the time of removing tablejump insn as they are referenced by the preceding insns computing the destination, so we delay deleting and garbagecollect them once life information is computed.
References BB_END, cfun, delete_insn(), dump_file, FOR_EACH_BB_FN, INSN_UID(), JUMP_TABLE_DATA_P, LABEL_NUSES, LABEL_P, LABEL_PRESERVE_P, NEXT_INSN(), and NOTE_INSN_BASIC_BLOCK_P.
Referenced by cfg_layout_finalize(), and cleanup_cfg().
bool delete_unreachable_blocks | ( | void | ) |
Delete all unreachable basic blocks.
References b, CDI_DOMINATORS, cfun, changed, current_ir_type(), delete_basic_block(), dom_info_available_p(), ENTRY_BLOCK_PTR_FOR_FN, EXIT_BLOCK_PTR_FOR_FN, find_unreachable_blocks(), first_dom_son(), gcc_assert, get_all_dominated_blocks(), IR_GIMPLE, MAY_HAVE_DEBUG_BIND_INSNS, and tidy_fallthru_edges().
Referenced by cleanup_cfg(), delete_unmarked_insns(), execute_cleanup_eh_1(), execute_hardreg_pre(), execute_rtl_cprop(), execute_rtl_hoist(), execute_rtl_pre(), execute_rtl_store_motion(), expand_thunk(), fixup_partitions(), fixup_reorder_chain(), indirect_jump_optimize(), one_cprop_pass(), rest_of_handle_dse(), tail_merge_optimize(), and unsplit_eh_edges().
References GET_CODE, i, reload_completed, rtx_equal_p(), rtx_renumbered_equal_p(), XVECEXP, and XVECLEN.
Referenced by can_replace_by().
int flow_find_cross_jump | ( | basic_block | bb1, |
basic_block | bb2, | ||
rtx_insn ** | f1, | ||
rtx_insn ** | f2, | ||
enum replace_direction * | dir_p ) |
Look through the insns at the end of BB1 and BB2 and find the longest sequence that are either equivalent, or allow forward or backward replacement. Store the first insns for that sequence in *F1 and *F2 and return the sequence length. DIR_P indicates the allowed replacement direction on function entry, and the actual replacement direction on function exit. If NULL, only equivalent sequences are allowed. To simplify callers of this function, if the blocks match exactly, store the head of the blocks in *F1 and *F2.
References active_insn_p(), BB_END, BB_HEAD, BB_PARTITION, BLOCK_FOR_INSN(), dir_backward, dir_both, dir_forward, dir_none, f1, f2, i1, i2, INSN_P, LABEL_P, merge_dir(), merge_memattrs(), merge_notes(), NONDEBUG_INSN_P, NULL, old_insns_match_p(), onlyjump_p(), PATTERN(), PREV_INSN(), reload_completed, returnjump_p(), side_effects_p(), simplejump_p(), and walk_to_nondebug_insn().
Referenced by cond_exec_process_if_block(), and try_crossjump_to_edge().
int flow_find_head_matching_sequence | ( | basic_block | bb1, |
basic_block | bb2, | ||
rtx_insn ** | f1, | ||
rtx_insn ** | f2, | ||
int | stop_after ) |
Like flow_find_cross_jump, except start looking for a matching sequence from the head of the two blocks. Do not include jumps at the end. If STOP_AFTER is nonzero, stop after finding that many matching instructions. If STOP_AFTER is zero, count all INSN_P insns, if it is non-zero, only count active insns.
References active_insn_p(), BB_END, BB_HEAD, dir_both, f1, f2, FOR_EACH_EDGE, i1, i2, INSN_P, JUMP_P, merge_memattrs(), merge_notes(), NEXT_INSN(), NONDEBUG_INSN_P, NOTE_KIND, NOTE_P, NULL, old_insns_match_p(), and basic_block_def::succs.
Referenced by cond_exec_process_if_block(), and try_head_merge_bb().
Return true if I1 and I2 have identical CFA notes (the same order and equivalent content).
References i1, i2, NULL_RTX, reg_note_cfa_p, REG_NOTE_KIND, REG_NOTES, reload_completed, rtx_equal_p(), rtx_renumbered_equal_p(), and XEXP.
Referenced by old_insns_match_p().
rtl_opt_pass * make_pass_jump | ( | gcc::context * | ctxt | ) |
rtl_opt_pass * make_pass_jump2 | ( | gcc::context * | ctxt | ) |
rtl_opt_pass * make_pass_jump_after_combine | ( | gcc::context * | ctxt | ) |
Attempt to prove that operation is NOOP using CSElib or mark the effect on register. Used by jump threading.
References bitmap_clear_range(), bitmap_set_range(), cselib_redundant_set_p(), exp(), GET_CODE, pc_rtx, REG_NREGS, REG_P, REGNO, SET, SET_DEST, and XEXP.
Referenced by thread_jump().
Return true if X contains a register in NONEQUAL.
References END_REGNO(), FOR_EACH_SUBRTX, REG_P, REGNO, and REGNO_REG_SET_P.
Referenced by thread_jump().
|
static |
Attempt to merge basic blocks that are potentially non-adjacent. Return NULL iff the attempt failed, otherwise return basic block where cleanup_cfg should continue. Because the merging commonly moves basic block away or introduces another optimization possibility, return basic block just before B so cleanup_cfg don't need to iterate. It may be good idea to return basic block before C in the case C has been moved after B and originally appeared earlier in the insn sequence, but we have no information available about the relative ordering of these two. Hopefully it is not too common.
References b, BB_PARTITION, cfun, CLEANUP_EXPENSIVE, current_loops, dump_file, ENTRY_BLOCK_PTR_FOR_FN, find_fallthru_edge(), force_nonfallthru(), FORWARDER_BLOCK_P, basic_block_def::index, loop::latch, basic_block_def::loop_father, merge_blocks(), merge_blocks_move_predecessor_nojumps(), merge_blocks_move_successor_nojumps(), basic_block_def::next_bb, notice_new_block(), NULL, basic_block_def::prev_bb, basic_block_def::succs, and update_forwarder_flag().
Referenced by try_optimize_cfg().
|
static |
Blocks A and B are to be merged into a single block. A has no incoming fallthru edge, so it can be moved before B without adding or modifying any jumps (aside from the jump from A to B).
References a, b, BARRIER_P, BB_END, BB_HEAD, BB_PARTITION, delete_insn(), df_set_bb_dirty(), dump_file, gcc_assert, link_block(), merge_blocks(), next_nonnote_insn(), PREV_INSN(), reorder_insns_nobb(), and unlink_block().
Referenced by merge_blocks_move().
|
static |
Blocks A and B are to be merged into a single block. B has no outgoing fallthru edge, so it can be moved after A without adding or modifying any jumps (aside from the jump from A to B).
References a, b, BARRIER_P, BB_END, BB_HEAD, BB_PARTITION, delete_insn(), dump_file, merge_blocks(), NEXT_INSN(), prev_active_insn(), reorder_insns_nobb(), table, and tablejump_p().
Referenced by merge_blocks_move().
|
static |
Merges directions A and B.
References a, b, dir_both, and dir_none.
Referenced by flow_find_cross_jump().
Removes the memory attributes of MEM expression if they are not equal.
References clear_mem_offset(), clear_mem_size(), GET_CODE, GET_MODE, GET_RTX_FORMAT, GET_RTX_LENGTH, i, known_le, MEM_ALIAS_SET, MEM_ALIGN, MEM_ATTRS, mem_attrs_eq_p(), MEM_EXPR, mem_expr_equal_p(), MEM_NOTRAP_P, MEM_OFFSET, MEM_OFFSET_KNOWN_P, MEM_READONLY_P, MEM_SIZE, MEM_SIZE_KNOWN_P, MEM_VOLATILE_P, merge_memattrs(), MIN, set_mem_alias_set(), set_mem_align(), set_mem_expr(), set_mem_size(), XEXP, XVECEXP, XVECLEN, and y.
Referenced by flow_find_cross_jump(), flow_find_head_matching_sequence(), and merge_memattrs().
When comparing insns I1 and I2 in flow_find_cross_jump or flow_find_head_matching_sequence, ensure the notes match.
References find_reg_equal_equiv_note(), i1, i2, remove_note(), rtx_equal_p(), and XEXP.
Referenced by flow_find_cross_jump(), and flow_find_head_matching_sequence().
|
static |
Set flags for newly created block.
References basic_block_def::flags, and forwarder_block_p().
Referenced by merge_blocks_move(), try_forward_edges(), and try_optimize_cfg().
|
static |
Examine I1 and I2 and return: - dir_forward if I1 can be replaced by I2, or - dir_backward if I2 can be replaced by I1, or - dir_both if both are the case.
References BUILT_IN_NORMAL, CALL_INSN_FUNCTION_USAGE, CALL_P, can_replace_by(), CLEANUP_POST_REGSTACK, CLEAR_HARD_REG_SET, DECL_BUILT_IN_CLASS, DECL_FUNCTION_CODE(), dir_both, dir_none, find_args_size_adjust(), find_reg_note(), frame_pointer_needed, get_call_rtx_from(), GET_CODE, HOST_WIDE_INT_MIN, i1, i2, insn_callee_abi(), insns_have_identical_cfa_notes(), known_eq, NOTE_INSN_BASIC_BLOCK_P, NULL, PATTERN(), REG_NOTE_KIND, REG_NOTES, REGNO, reload_completed, rtx_equal_p(), RTX_FRAME_RELATED_P, rtx_renumbered_equal_p(), SANITIZE_ADDRESS, SET_HARD_REG_BIT, SIBLING_CALL_P, SYMBOL_REF_DECL, TREE_CODE, and XEXP.
Referenced by flow_find_cross_jump(), flow_find_head_matching_sequence(), and outgoing_edges_match().
|
static |
Return true iff outgoing edges of BB1 and BB2 match, together with the branch instruction. This means that if we commonize the control flow before end of the basic block, the semantic remains unchanged. We may assume that there exists one edge with a common destination.
References ACCUMULATE_OUTGOING_ARGS, any_condjump_p(), BB_END, BRANCH_EDGE, CALL_P, cfun, crtl, d1, d2, DEBUG_INSN_P, dir_both, profile_probability::dump(), dump_file, EDGE_COMPLEX, EDGE_COUNT, EDGE_SUCC, EXIT_BLOCK_PTR_FOR_FN, f1, f2, FALLTHRU_EDGE, find_reg_note(), FOR_EACH_EDGE, FORWARDER_BLOCK_P, gcc_assert, GET_CODE, i, basic_block_def::index, edge_iterator::index, INSN_P, profile_probability::invert(), JUMP_P, NOTE_INSN_BASIC_BLOCK_P, NOTE_P, NULL, old_insns_match_p(), onlyjump_p(), optimize_bb_for_speed_p(), PATTERN(), pc_rtx, pc_set(), PREV_INSN(), replace_label_in_insn(), reversed_comparison_code(), rtx_equal_p(), rtx_referenced_p(), rtx_renumbered_equal_p(), SET_SRC, SIBLING_CALL_P, simplejump_p(), single_succ(), single_succ_edge(), single_succ_p(), basic_block_def::succs, swap_condition(), tablejump_p(), XEXP, XVECEXP, and XVECLEN.
Referenced by try_crossjump_to_edge().
|
static |
Attempt to prove that the basic block B will have no side effects and always continues in the same edge if reached via E. Return the edge if exist, NULL otherwise.
References any_condjump_p(), b, BB_END, BB_HEAD, BITMAP_ALLOC, BITMAP_FREE, BRANCH_EDGE, CLEAR_REG_SET, comparison_dominates_p(), crtl, cselib_finish(), cselib_init(), cselib_process_insn(), EDGE_COUNT, FALLTHRU_EDGE, gcc_checking_assert, GET_CODE, i, INSN_P, mark_effect(), mentions_nonequal_regs(), modified_in_p(), NEXT_INSN(), NULL, onlyjump_p(), PATTERN(), pc_rtx, pc_set(), REG_SET_EMPTY_P, reload_completed, reversed_comparison_code(), rtx_equal_p(), SET_SRC, side_effects_p(), XEXP, XVECEXP, and XVECLEN.
Referenced by try_forward_edges().
|
static |
Return true if BB contains just bb note, or bb note followed by only DEBUG_INSNs.
References BB_END, BB_HEAD, DEBUG_INSN_P, and PREV_INSN().
Referenced by try_optimize_cfg().
|
static |
Search the predecessors of BB for common insn sequences. When found, share code between them by redirecting control flow. Return true if any changes made.
References BB_END, BB_PARTITION, cfun, changed, computed_jump_p(), crossjumps_occurred, dir_both, dir_forward, EDGE_COUNT, EDGE_PRED, EDGE_SUCC, EXIT_BLOCK_PTR_FOR_FN, find_fallthru_edge(), first_pass, NULL, optimize_bb_for_size_p(), basic_block_def::preds, and try_crossjump_to_edge().
Referenced by try_optimize_cfg().
|
static |
E1 and E2 are edges with the same destination block. Search their predecessors for common code. If found, redirect control flow from (maybe the middle of) E1->SRC to (maybe the middle of) E2->SRC (dir_forward), or the other way around (dir_backward). DIR specifies the allowed replacement direction.
References BB_END, BB_HEAD, BB_PARTITION, BLOCK_FOR_INSN(), block_has_preserve_label(), cfun, basic_block_def::count, d2, DEBUG_INSN_P, delete_basic_block(), df_set_bb_dirty(), dir_backward, dump_file, EDGE_COUNT, EDGE_PRED, ENTRY_BLOCK_PTR_FOR_FN, find_fallthru_edge(), flow_find_cross_jump(), FOR_EACH_EDGE, FORWARDER_BLOCK_P, get_insns(), basic_block_def::index, LABEL_P, NEXT_INSN(), NOTE_INSN_BASIC_BLOCK_P, NOTE_KIND, NOTE_P, NULL, NULL_RTX, outgoing_edges_match(), basic_block_def::preds, PREV_INSN(), redirect_edge_and_branch_force(), reload_completed, replace_label_in_insn(), single_pred_edge(), single_pred_p(), single_succ(), single_succ_edge(), split_block(), basic_block_def::succs, tablejump_p(), update_br_prob_note(), and update_forwarder_flag().
Referenced by try_crossjump_bb().
|
static |
Attempt to forward edges leaving basic block B. Return true if successful.
References b, BB_END, BB_PARTITION, cfun, changed, CLEANUP_THREADING, basic_block_def::count, DEBUG_INSN_P, dump_file, EDGE_COMPLEX, ei_next(), ei_safe_edge(), ei_start, EXIT_BLOCK_PTR_FOR_FN, first_pass, basic_block_def::flags, FORWARDER_BLOCK_P, free(), gcc_assert, i, basic_block_def::index, INSN_LOCATION(), INSN_P, last, LOCATION_LOCUS, n_basic_blocks_for_fn, notice_new_block(), NULL, NUM_FIXED_BLOCKS, prev_nondebug_insn(), redirect_edge_and_branch(), redirect_edge_and_branch_force(), single_succ(), single_succ_edge(), single_succ_p(), thread_jump(), UNKNOWN_LOCATION, update_bb_profile_for_threading(), and update_br_prob_note().
Referenced by try_optimize_cfg().
|
static |
Search the successors of BB for common insn sequences. When found, share code between them by moving it across the basic block boundary. Return true if any changes made.
References BB_END, BB_HEAD, BITMAP_ALLOC, block_was_dirty, can_move_insns_across(), cfun, changed, computed_jump_p(), control_flow_insn_p(), crossjumps_occurred, delete_insn_chain(), df_get_bb_dirty(), df_set_bb_dirty(), df_simulate_one_insn_backwards(), EDGE_COUNT, EDGE_PRED, EDGE_SUCC, EXIT_BLOCK_PTR_FOR_FN, find_reg_note(), flow_find_head_matching_sequence(), FOR_EACH_EDGE, free(), get_condition(), INT_MAX, IOR_REG_SET, NEXT_INSN(), NONDEBUG_INSN_P, NULL, NULL_RTX, optimize_bb_for_size_p(), basic_block_def::preds, PREV_INSN(), prev_real_nondebug_insn(), reorder_insns(), simulate_backwards_to_point(), and basic_block_def::succs.
Referenced by try_optimize_cfg().
|
static |
Do simple CFG optimizations - basic block merging, simplifying of jump instructions etc. Return nonzero if changes were made.
References any_condjump_p(), as_a(), b, BARRIER_P, BB_END, BB_FOOTER, BB_HEAD, bb_is_just_return(), block_label(), block_was_dirty, BRANCH_EDGE, can_merge_blocks_p(), cfun, changed, checking_verify_flow_info(), CLEANUP_CFGLAYOUT, CLEANUP_CROSSJUMP, CLEANUP_EXPENSIVE, CLEANUP_NO_INSN_DEL, CLEANUP_NO_PARTITIONING, CLEANUP_THREADING, clear_bb_flags(), copy_insn(), CROSSING_JUMP_P, crossjumps_occurred, current_ir_type(), delete_basic_block(), delete_insn(), df_analyze(), dump_file, EDGE_COMPLEX, EDGE_COUNT, emit_barrier_after(), emit_barrier_after_bb(), emit_insn_before(), ENTRY_BLOCK_PTR_FOR_FN, EXIT_BLOCK_PTR_FOR_FN, FALLTHRU_EDGE, first_pass, fixup_partitions(), FOR_ALL_BB_FN, FOR_EACH_BB_FN, FOR_EACH_EDGE, force_nonfallthru(), FORWARDER_BLOCK_P, gcc_assert, gcc_unreachable, get_last_bb_insn(), invert_jump(), IR_RTL_CFGLAYOUT, JUMP_LABEL, JUMP_P, label_is_jump_target_p(), LABEL_P, LABEL_PRESERVE_P, last, merge_blocks(), merge_blocks_move(), n_basic_blocks_for_fn, basic_block_def::next_bb, NEXT_INSN(), notice_new_block(), NULL, NUM_FIXED_BLOCKS, onlyjump_p(), PATTERN(), redirect_edge_succ(), redirect_edge_succ_nodup(), redirect_jump(), reload_completed, simplejump_p(), single_pred(), single_pred_edge(), single_pred_p(), single_succ(), single_succ_edge(), single_succ_p(), tablejump_p(), targetm, trivially_empty_bb_p(), try_crossjump_bb(), try_forward_edges(), try_head_merge_bb(), try_redirect_by_replacing_jump(), try_simplify_condjump(), update_br_prob_note(), and update_forwarder_flag().
Referenced by cleanup_cfg().
|
static |
Simplify a conditional jump around an unconditional jump. Return true if something changed.
References any_condjump_p(), as_a(), BB_END, BB_PARTITION, block_label(), BRANCH_EDGE, can_fallthru(), cfun, delete_basic_block(), dump_file, EDGE_COUNT, EXIT_BLOCK_PTR_FOR_FN, FALLTHRU_EDGE, FORWARDER_BLOCK_P, INSN_UID(), invert_jump(), basic_block_def::next_bb, redirect_edge_succ_nodup(), single_pred_p(), single_succ(), basic_block_def::succs, tidy_fallthru_edge(), update_br_prob_note(), and update_forwarder_flag().
Referenced by try_optimize_cfg().
|
static |
Recompute forwarder flag after block has been modified.
References basic_block_def::flags, and forwarder_block_p().
Referenced by merge_blocks_move(), try_crossjump_to_edge(), try_optimize_cfg(), and try_simplify_condjump().
NOTE1 is the REG_EQUAL note, if any, attached to an insn that is a single_set with a SET_SRC of SRC1. Similarly for NOTE2/SRC2. So effectively NOTE1/NOTE2 are an alternate form of SRC1/SRC2 respectively. Return nonzero if SRC1 or NOTE1 has the same constant integer value as SRC2 or NOTE2. Else return zero.
References CONST_INT_P, rtx_equal_p(), and XEXP.
Referenced by can_replace_by().
|
static |
References BB_END, BB_HEAD, cfun, ENTRY_BLOCK_PTR_FOR_FN, find_fallthru_edge(), i1, NONDEBUG_INSN_P, PREV_INSN(), and single_succ_p().
Referenced by flow_find_cross_jump().
|
static |
Set to true if we couldn't run an optimization due to stale liveness information; we should run df_analyze to enable more opportunities.
Referenced by try_head_merge_bb(), and try_optimize_cfg().
|
static |
Set to true if crossjumps occurred in the latest run of try_optimize_cfg.
Referenced by cleanup_cfg(), try_crossjump_bb(), try_head_merge_bb(), and try_optimize_cfg().
|
static |
Set to true when we are running first pass of try_optimize_cfg loop.
Referenced by try_crossjump_bb(), try_forward_edges(), and try_optimize_cfg().
|
static |
Array of flags indexed by reg note kind, true if the given reg note is CFA related.
Referenced by insns_have_identical_cfa_notes().