GCC Middle and Back End API Reference
regcprop.cc File Reference
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "rtl.h"
#include "df.h"
#include "memmodel.h"
#include "tm_p.h"
#include "insn-config.h"
#include "regs.h"
#include "emit-rtl.h"
#include "recog.h"
#include "diagnostic-core.h"
#include "addresses.h"
#include "tree-pass.h"
#include "rtl-iter.h"
#include "cfgrtl.h"
#include "target.h"
#include "function-abi.h"
Include dependency graph for regcprop.cc:

Data Structures

struct  queued_debug_insn_change
struct  value_data_entry
struct  value_data
struct  kill_set_value_data

Functions

static void kill_value_one_regno (unsigned, struct value_data *)
static void kill_value_regno (unsigned, unsigned, struct value_data *)
static void kill_value (const_rtx, struct value_data *)
static void set_value_regno (unsigned, machine_mode, struct value_data *)
static void init_value_data (struct value_data *)
static void kill_clobbered_value (rtx, const_rtx, void *)
static void kill_set_value (rtx, const_rtx, void *)
static void copy_value (rtx, rtx, struct value_data *, bool frame_related)
static bool mode_change_ok (machine_mode, machine_mode, unsigned int)
static rtx maybe_mode_change (machine_mode, machine_mode, machine_mode, unsigned int, unsigned int)
static bool incompatible_frame_status (bool, bool)
static rtx find_oldest_value_reg (enum reg_class, rtx, struct value_data *, bool frame_related)
static bool replace_oldest_value_reg (rtx *, enum reg_class, rtx_insn *, struct value_data *)
static bool replace_oldest_value_addr (rtx *, enum reg_class, machine_mode, addr_space_t, rtx_insn *, struct value_data *)
static bool replace_oldest_value_mem (rtx, rtx_insn *, struct value_data *)
static bool copyprop_hardreg_forward_1 (basic_block, struct value_data *)
void debug_value_data (struct value_data *)
static void validate_value_data (struct value_data *)
static void free_debug_insn_changes (struct value_data *vd, unsigned int regno)
static void kill_value_one_regno (unsigned int regno, struct value_data *vd)
static void kill_value_regno (unsigned int regno, unsigned int nregs, struct value_data *vd)
static void set_value_regno (unsigned int regno, machine_mode mode, struct value_data *vd)
static void kill_autoinc_value (rtx_insn *insn, struct value_data *vd)
static void apply_debug_insn_changes (struct value_data *vd, unsigned int regno)
static void cprop_find_used_regs (rtx *loc, void *data)
static void kill_clobbered_values (rtx_insn *insn, struct value_data *vd)
void copyprop_hardreg_forward_bb_without_debug_insn (basic_block bb)
rtl_opt_passmake_pass_cprop_hardreg (gcc::context *ctxt)

Variables

static object_allocator< queued_debug_insn_changequeued_debug_insn_change_pool ("debug insn changes pool")
static bool skip_debug_insn_p

Function Documentation

◆ apply_debug_insn_changes()

void apply_debug_insn_changes ( struct value_data * vd,
unsigned int regno )
static

◆ copy_value()

◆ copyprop_hardreg_forward_1()

bool copyprop_hardreg_forward_1 ( basic_block bb,
struct value_data * vd )
static
Perform the forward copy propagation on basic block BB.   

References ADDR_SPACE_GENERIC, alternative_class(), apply_change_group(), asm_noperands(), BB_END, BB_HEAD, CALL_INSN_FUNCTION_USAGE, CALL_P, changed, function_abi::clobbers_reg_p(), copy_value(), cprop_find_used_regs(), DEBUG_BIND_INSN_P, delete_insn(), df_insn_rescan(), dump_file, value_data::e, exp(), extract_constrain_insn(), find_oldest_value_reg(), find_reg_note(), value_data_entry::frame_related, GET_CODE, GET_MODE, hard_regno_nregs(), i, kill_set_value_data::ignore_set_reg, incompatible_frame_status(), insn_callee_abi(), kill_set_value_data::insn_is_frame_related, INSN_UID(), INSN_VAR_LOCATION_LOC, INVALID_REGNUM, kill_autoinc_value(), kill_clobbered_values(), kill_set_value(), kill_value(), kill_value_regno(), last, operand_alternative::matches, may_trap_p(), maybe_mode_change(), MEM_P, value_data_entry::mode, value_data::n_debug_insn_changes, NEXT_INSN(), value_data_entry::next_regno, NONDEBUG_INSN_P, NONJUMP_INSN_P, noop_move_p(), note_stores(), note_uses(), NULL, NULL_RTX, value_data_entry::oldest_regno, OP_IN, OP_INOUT, OP_OUT, ORIGINAL_REGNO, partial_subreg_p(), PATTERN(), preprocess_constraints(), recog_data, REG_ATTRS, REG_NOTE_KIND, REG_NOTES, REG_NREGS, reg_overlap_mentioned_p(), REG_P, REG_POINTER, REGNO, replace_oldest_value_addr(), replace_oldest_value_mem(), replace_oldest_value_reg(), rtx_equal_p(), RTX_FRAME_RELATED_P, SET, SET_DEST, SET_SRC, set_value_regno(), side_effects_p(), single_set(), stack_pointer_rtx, subreg_lowpart_offset(), targetm, validate_change(), validate_unshare_change(), VAR_LOC_UNKNOWN_P, kill_set_value_data::vd, which_op_alt(), and XEXP.

Referenced by copyprop_hardreg_forward_bb_without_debug_insn().

◆ copyprop_hardreg_forward_bb_without_debug_insn()

void copyprop_hardreg_forward_bb_without_debug_insn ( basic_block bb)
Do copyprop_hardreg_forward_1 for a single basic block BB.
DEBUG_INSN is skipped since we do not want to involve DF related
staff as how it is handled in function pass_cprop_hardreg::execute.

NOTE: Currently it is only used for shrink-wrap.  Maybe extend it
to handle DEBUG_INSN for other uses.   

References copyprop_hardreg_forward_1(), free(), init_value_data(), and skip_debug_insn_p.

Referenced by prepare_shrink_wrap().

◆ cprop_find_used_regs()

void cprop_find_used_regs ( rtx * loc,
void * data )
static
Called via note_uses, for all used registers in a real insn
apply DEBUG_INSN changes that change registers to the used
registers.   

References apply_debug_insn_changes(), value_data_entry::debug_insn_changes, value_data::e, FOR_EACH_SUBRTX, free_debug_insn_changes(), REG_P, and REGNO.

Referenced by copyprop_hardreg_forward_1().

◆ debug_value_data()

◆ find_oldest_value_reg()

rtx find_oldest_value_reg ( enum reg_class cl,
rtx reg,
struct value_data * vd,
bool frame_related )
static

◆ free_debug_insn_changes()

void free_debug_insn_changes ( struct value_data * vd,
unsigned int regno )
static
Free all queued updates for DEBUG_INSNs that change some reg to
register REGNO.   

References value_data_entry::debug_insn_changes, value_data::e, value_data::n_debug_insn_changes, queued_debug_insn_change::next, NULL, and queued_debug_insn_change_pool.

Referenced by cprop_find_used_regs(), and kill_value_one_regno().

◆ incompatible_frame_status()

bool incompatible_frame_status ( bool to_frame_related,
bool from_frame_related )
static
Copy propagation must not replace a value in a frame-related
instruction with one produced by a non–frame-related instruction.
Doing so may cause the DCE pass to delete the original frame-related
instruction, which would in turn produce incorrect DWARF information
(see PR122274).  TO_FRAME_RELATED indicates whether the destination
instruction receiving the propagated value is frame-related.
FROM_FRAME_RELATED indicates whether the instruction providing that
value is frame-related.
Return true if copy propagation is not permitted.   

Referenced by copyprop_hardreg_forward_1(), and find_oldest_value_reg().

◆ init_value_data()

◆ kill_autoinc_value()

void kill_autoinc_value ( rtx_insn * insn,
struct value_data * vd )
static
Kill any register used in X as the base of an auto-increment expression,
and install that register as the root of its own value list.   

References value_data::e, FOR_EACH_SUBRTX, value_data_entry::frame_related, GET_CODE, GET_MODE, GET_RTX_CLASS, kill_value(), PATTERN(), REGNO, RTX_AUTOINC, RTX_FRAME_RELATED_P, set_value_regno(), kill_set_value_data::vd, and XEXP.

Referenced by copyprop_hardreg_forward_1().

◆ kill_clobbered_value()

void kill_clobbered_value ( rtx x,
const_rtx set,
void * data )
static
Called through note_stores.  If X is clobbered, kill its value.   

References GET_CODE, and kill_value().

Referenced by kill_clobbered_values().

◆ kill_clobbered_values()

void kill_clobbered_values ( rtx_insn * insn,
struct value_data * vd )
static
Apply clobbers of INSN in PATTERN and C_I_F_U to value_data VD.   

References kill_clobbered_value(), and note_stores().

Referenced by copyprop_hardreg_forward_1().

◆ kill_set_value()

void kill_set_value ( rtx x,
const_rtx set,
void * data )
static
Called through note_stores.  If X is set, not clobbered, kill its
current value and install it as the root of its own value list.   

References value_data::e, value_data_entry::frame_related, GET_CODE, GET_MODE, kill_set_value_data::ignore_set_reg, kill_set_value_data::insn_is_frame_related, kill_value(), REG_P, REGNO, rtx_equal_p(), set_value_regno(), and kill_set_value_data::vd.

Referenced by copyprop_hardreg_forward_1().

◆ kill_value()

void kill_value ( const_rtx x,
struct value_data * vd )
static
Kill X.  This is a convenience function wrapping kill_value_regno
so that we mind the mode the register is in.   

References GET_CODE, GET_MODE, kill_value_regno(), REG_NREGS, REG_P, REGNO, simplify_subreg(), SUBREG_BYTE, and SUBREG_REG.

Referenced by copyprop_hardreg_forward_1(), kill_autoinc_value(), kill_clobbered_value(), and kill_set_value().

◆ kill_value_one_regno() [1/2]

void kill_value_one_regno ( unsigned int regno,
struct value_data * vd )
static
Kill register REGNO.  This involves removing it from any value
lists, and resetting the value mode to VOIDmode.  This is only a
helper function; it does not handle any hard registers overlapping
with REGNO.   

References value_data_entry::debug_insn_changes, value_data::e, value_data_entry::frame_related, free_debug_insn_changes(), i, INVALID_REGNUM, value_data_entry::mode, queued_debug_insn_change::next, value_data_entry::next_regno, value_data_entry::oldest_regno, and validate_value_data().

◆ kill_value_one_regno() [2/2]

void kill_value_one_regno ( unsigned ,
struct value_data *  )
static

Referenced by kill_value_regno().

◆ kill_value_regno() [1/2]

void kill_value_regno ( unsigned int regno,
unsigned int nregs,
struct value_data * vd )
static
Kill the value in register REGNO for NREGS, and any other registers
whose values overlap.   

References value_data::e, hard_regno_nregs(), i, kill_value_one_regno(), max_value_regs, value_data::max_value_regs, and value_data_entry::mode.

◆ kill_value_regno() [2/2]

void kill_value_regno ( unsigned ,
unsigned ,
struct value_data *  )
static

◆ make_pass_cprop_hardreg()

rtl_opt_pass * make_pass_cprop_hardreg ( gcc::context * ctxt)

◆ maybe_mode_change()

rtx maybe_mode_change ( machine_mode orig_mode,
machine_mode copy_mode,
machine_mode new_mode,
unsigned int regno,
unsigned int copy_regno )
static
Register REGNO was originally set in ORIG_MODE.  It - or a copy of it -
was copied in COPY_MODE to COPY_REGNO, and then COPY_REGNO was accessed
in NEW_MODE.
Return a NEW_MODE rtx for REGNO if that's OK, otherwise return NULL_RTX.   

References gen_raw_REG(), GET_MODE, GET_MODE_SIZE(), hard_regno_nregs(), mode_change_ok(), new_mode(), NULL_RTX, partial_subreg_p(), stack_pointer_rtx, subreg_regno_offset(), subreg_size_lowpart_offset(), and targetm.

Referenced by copyprop_hardreg_forward_1(), and find_oldest_value_reg().

◆ mode_change_ok()

bool mode_change_ok ( machine_mode orig_mode,
machine_mode new_mode,
unsigned int regno )
static
Return true if a mode change from ORIG to NEW is allowed for REGNO.   

References new_mode(), partial_subreg_p(), and REG_CAN_CHANGE_MODE_P.

Referenced by maybe_mode_change().

◆ replace_oldest_value_addr()

bool replace_oldest_value_addr ( rtx * loc,
enum reg_class cl,
machine_mode mode,
addr_space_t as,
rtx_insn * insn,
struct value_data * vd )
static
Similar to replace_oldest_value_reg, but *LOC contains an address.
Adapted from find_reloads_address_1.  CL is INDEX_REG_CLASS or
BASE_REG_CLASS depending on how the register is being considered.   

References base_reg_class(), changed, DEBUG_INSN_P, GET_CODE, GET_RTX_FORMAT, GET_RTX_LENGTH, i, queued_debug_insn_change::insn, queued_debug_insn_change::loc, NULL, REGNO, regno_ok_for_base_p(), replace_oldest_value_addr(), replace_oldest_value_mem(), replace_oldest_value_reg(), RTX_CODE, SUBREG_REG, XEXP, XVECEXP, and XVECLEN.

Referenced by copyprop_hardreg_forward_1(), replace_oldest_value_addr(), and replace_oldest_value_mem().

◆ replace_oldest_value_mem()

bool replace_oldest_value_mem ( rtx x,
rtx_insn * insn,
struct value_data * vd )
static
Similar to replace_oldest_value_reg, but X contains a memory.   

References base_reg_class(), DEBUG_INSN_P, GET_MODE, queued_debug_insn_change::insn, MEM_ADDR_SPACE, replace_oldest_value_addr(), and XEXP.

Referenced by copyprop_hardreg_forward_1(), and replace_oldest_value_addr().

◆ replace_oldest_value_reg()

◆ set_value_regno() [1/2]

void set_value_regno ( unsigned int regno,
machine_mode mode,
struct value_data * vd )
static
Remember that REGNO is valid in MODE.   

References value_data::e, hard_regno_nregs(), value_data::max_value_regs, and value_data_entry::mode.

◆ set_value_regno() [2/2]

void set_value_regno ( unsigned ,
machine_mode ,
struct value_data *  )
static

◆ validate_value_data()

Variable Documentation

◆ queued_debug_insn_change_pool

object_allocator< queued_debug_insn_change > queued_debug_insn_change_pool("debug insn changes pool") ( "debug insn changes pool" )
static

◆ skip_debug_insn_p