GCC Middle and Back End API Reference
emit-rtl.h File Reference

Go to the source code of this file.

Data Structures

struct  incoming_args
 
struct  rtl_data
 
struct  address_reload_context
 

Namespaces

namespace  rtl_ssa
 

Macros

#define return_label   (crtl->x_return_label)
 
#define naked_return_label   (crtl->x_naked_return_label)
 
#define stack_slot_list   (crtl->x_stack_slot_list)
 
#define function_beg_insn   (crtl->x_function_beg_insn)
 
#define parm_birth_insn   (crtl->x_parm_birth_insn)
 
#define frame_offset   (crtl->x_frame_offset)
 
#define stack_check_probe_note   (crtl->x_stack_check_probe_note)
 
#define arg_pointer_save_area   (crtl->x_arg_pointer_save_area)
 
#define used_temp_slots   (crtl->x_used_temp_slots)
 
#define avail_temp_slots   (crtl->x_avail_temp_slots)
 
#define temp_slot_level   (crtl->x_temp_slot_level)
 
#define nonlocal_goto_handler_labels   (crtl->x_nonlocal_goto_handler_labels)
 
#define frame_pointer_needed   (crtl->frame_pointer_needed)
 
#define stack_realign_fp   (crtl->stack_realign_needed && !crtl->need_drap)
 
#define stack_realign_drap   (crtl->stack_realign_needed && crtl->need_drap)
 
#define crtl   (&x_rtl)
 
#define adjust_address(MEMREF, MODE, OFFSET)    adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1, 0, 0)
 
#define adjust_address_nv(MEMREF, MODE, OFFSET)    adjust_address_1 (MEMREF, MODE, OFFSET, 0, 1, 0, 0)
 
#define adjust_bitfield_address(MEMREF, MODE, OFFSET)    adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1, 1, 0)
 
#define adjust_bitfield_address_size(MEMREF, MODE, OFFSET, SIZE)    adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1, 1, SIZE)
 
#define adjust_bitfield_address_nv(MEMREF, MODE, OFFSET)    adjust_address_1 (MEMREF, MODE, OFFSET, 0, 1, 1, 0)
 
#define adjust_automodify_address(MEMREF, MODE, ADDR, OFFSET)    adjust_automodify_address_1 (MEMREF, MODE, ADDR, OFFSET, 1)
 
#define adjust_automodify_address_nv(MEMREF, MODE, ADDR, OFFSET)    adjust_automodify_address_1 (MEMREF, MODE, ADDR, OFFSET, 0)
 

Typedefs

typedef class temp_slottemp_slot_p
 

Functions

bool mem_attrs_eq_p (const class mem_attrs *, const class mem_attrs *)
 
void set_mem_alias_set (rtx, alias_set_type)
 
void set_mem_align (rtx, unsigned int)
 
void set_mem_addr_space (rtx, addr_space_t)
 
void set_mem_expr (rtx, tree)
 
void set_mem_offset (rtx, poly_int64)
 
void clear_mem_offset (rtx)
 
void set_mem_size (rtx, poly_int64)
 
void clear_mem_size (rtx)
 
void set_mem_attrs_for_spill (rtx)
 
tree get_spill_slot_decl (bool)
 
rtx replace_equiv_address (rtx, rtx, bool=false)
 
rtx replace_equiv_address_nv (rtx, rtx, bool=false)
 
rtx gen_blockage (void)
 
rtvec gen_rtvec (int,...)
 
rtx copy_insn_1 (rtx)
 
rtx copy_insn (rtx)
 
rtx_insncopy_delay_slot_insn (rtx_insn *)
 
rtx gen_int_mode (poly_int64, machine_mode)
 
rtx_insnemit_copy_of_insn_after (rtx_insn *, rtx_insn *)
 
void set_reg_attrs_from_value (rtx, rtx)
 
void set_reg_attrs_for_parm (rtx, rtx)
 
void set_reg_attrs_for_decl_rtl (tree t, rtx x)
 
void adjust_reg_mode (rtx, machine_mode)
 
bool mem_expr_equal_p (const_tree, const_tree)
 
rtx gen_int_shift_amount (machine_mode, poly_int64)
 
bool need_atomic_barrier_p (enum memmodel, bool)
 
struct sequence_stackget_current_sequence (void)
 
struct sequence_stackget_topmost_sequence (void)
 
rtx_insnget_insns (void)
 
void set_first_insn (rtx_insn *insn)
 
rtx_insnget_last_insn (void)
 
void set_last_insn (rtx_insn *insn)
 
int get_max_uid (void)
 
bool valid_for_const_vector_p (machine_mode, rtx)
 
rtx gen_const_vec_duplicate (machine_mode, rtx)
 
rtx gen_vec_duplicate (machine_mode, rtx)
 
rtx gen_const_vec_series (machine_mode, rtx, rtx)
 
rtx gen_vec_series (machine_mode, rtx, rtx)
 
void set_decl_incoming_rtl (tree, rtx, bool)
 
rtx change_address (rtx, machine_mode, rtx)
 
rtx adjust_address_1 (rtx, machine_mode, poly_int64, int, int, int, poly_int64)
 
rtx adjust_automodify_address_1 (rtx, machine_mode, rtx, poly_int64, int)
 
rtx force_reload_address (rtx mem)
 
rtx offset_address (rtx, rtx, unsigned HOST_WIDE_INT)
 
void set_mem_attributes (rtx, tree, int)
 
void set_mem_attributes_minus_bitpos (rtx, tree, int, poly_int64)
 
int get_mem_align_offset (rtx, unsigned int)
 
rtx widen_memory_access (rtx, machine_mode, poly_int64)
 
void maybe_set_max_label_num (rtx_code_label *x)
 

Variables

struct rtl_data x_rtl
 

Macro Definition Documentation

◆ adjust_address

◆ adjust_address_nv

◆ adjust_automodify_address

#define adjust_automodify_address ( MEMREF,
MODE,
ADDR,
OFFSET )    adjust_automodify_address_1 (MEMREF, MODE, ADDR, OFFSET, 1)
Return a memory reference like MEMREF, but with its mode changed
to MODE and its address changed to ADDR, which is assumed to be
increased by OFFSET bytes from MEMREF.   

Referenced by pieces_addr::adjust(), and asan_clear_shadow().

◆ adjust_automodify_address_nv

#define adjust_automodify_address_nv ( MEMREF,
MODE,
ADDR,
OFFSET )    adjust_automodify_address_1 (MEMREF, MODE, ADDR, OFFSET, 0)
Likewise, but the reference is not required to be valid.   

Referenced by resolve_simple_move().

◆ adjust_bitfield_address

#define adjust_bitfield_address ( MEMREF,
MODE,
OFFSET )    adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1, 1, 0)
Return a memory reference like MEMREF, but with its mode changed
to MODE and its address offset by OFFSET bytes.  Assume that it's
for a bitfield and conservatively drop the underlying object if we
cannot be sure to stay within its bounds.   

Referenced by extract_bit_field(), extract_bit_field_1(), narrow_bit_field_mem(), store_bit_field(), and store_bit_field_1().

◆ adjust_bitfield_address_nv

#define adjust_bitfield_address_nv ( MEMREF,
MODE,
OFFSET )    adjust_address_1 (MEMREF, MODE, OFFSET, 0, 1, 1, 0)
Likewise, but the reference is not required to be valid.   

◆ adjust_bitfield_address_size

#define adjust_bitfield_address_size ( MEMREF,
MODE,
OFFSET,
SIZE )    adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1, 1, SIZE)
As for adjust_bitfield_address, but specify that the width of
BLKmode accesses is SIZE bytes.   

Referenced by extract_bit_field_1(), narrow_bit_field_mem(), store_bit_field(), and store_bit_field_1().

◆ arg_pointer_save_area

#define arg_pointer_save_area   (crtl->x_arg_pointer_save_area)

◆ avail_temp_slots

#define avail_temp_slots   (crtl->x_avail_temp_slots)

◆ crtl

#define crtl   (&x_rtl)
Accessor to RTL datastructures.  We keep them statically allocated now since
we never keep multiple functions.  For threaded compiler we might however
want to do differently.   

Referenced by add_action_record(), add_call_site(), add_frame_space(), allocate_dynamic_stack_space(), asan_emit_stack_protection(), asm_clobber_reg_is_valid(), assemble_end_function(), assemble_start_function(), assign_parm_adjust_stack_rtl(), assign_parm_find_entry_rtl(), assign_parm_find_stack_rtl(), assign_parms(), assign_stack_local_1(), based_loc_descr(), calculate_saved_nregs(), calculate_spill_cost(), can_implement_as_sibling_call_p(), cfg_layout_initialize(), check_mem_read_rtx(), check_new_reg_p(), pair_fusion_bb_info::cleanup_tombstones(), collect_fn_hard_reg_usage(), computation_cost(), compute_regs_asm_clobbered(), connect_traces(), constant_pool_empty_p(), convert_to_eh_region_ranges(), create_stack_guard(), cse_insn(), dbr_schedule(), debugger_reg_number(), default_rtl_profile(), deletable_insn_p(), df_epilogue_uses_p(), df_get_call_refs(), df_get_entry_block_def_set(), df_get_exit_block_use_set(), diddle_return_value(), do_reload(), dse_step1(), dw2_output_call_site_table(), dw2_size_of_call_site_table(), dw_loc_list(), dwarf2out_alloc_current_fde(), dwarf2out_do_cfi_startproc(), dwarf2out_switch_text_section(), emit_call_1(), emit_initial_value_sets(), emit_library_call_value_1(), emit_stack_restore(), ensure_regno(), emit_status::ensure_regno_capacity(), expand_asm_stmt(), expand_builtin_apply(), expand_builtin_apply_args(), expand_builtin_apply_args_1(), expand_builtin_eh_return(), expand_builtin_longjmp(), expand_builtin_next_arg(), expand_builtin_nonlocal_goto(), expand_builtin_return_addr(), expand_builtin_setjmp_receiver(), expand_builtin_unwind_init(), expand_call(), expand_eh_return(), expand_expr_real_1(), expand_function_end(), expand_function_start(), expand_one_stack_var_1(), expand_one_var(), expand_stack_alignment(), expand_stack_vars(), final_start_function_1(), find_empty_loc_ranges_at_text_label(), find_hard_regno_for_1(), find_partition_fixes(), find_reg(), fixup_debug_use(), fixup_debug_uses(), fixup_partitions(), force_const_mem(), free_after_compilation(), pair_fusion_bb_info::fuse_pair(), fwprop(), fwprop_done(), fwprop_init(), gen_call_used_regs_seq(), gen_reg_rtx(), get_arg_pointer_save_area(), get_current_sequence(), get_dynamic_stack_base(), get_dynamic_stack_size(), get_hard_reg_initial_reg(), get_hard_reg_initial_val(), get_initial_register_offset(), get_max_uid(), function_reader::handle_insn_uids(), has_hard_reg_initial_val(), improve_allocation(), init_emit(), init_expmed(), init_expr(), init_resource_info(), init_set_costs(), init_varasm_status(), initial_value_entry(), insert_section_boundary_note(), instantiate_new_reg(), internal_arg_pointer_based_exp(), ira(), ira_build_conflicts(), ira_setup_eliminable_regset(), leaf_function_p(), locate_and_pad_parm(), lra(), lra_spill(), make_prologue_seq(), mark_constant_pool(), maybe_add_nop_after_section_switch(), mem_loc_descriptor(), mem_might_overlap_already_clobbered_arg_p(), multiple_reg_loc_descriptor(), non_spilled_static_chain_regno_p(), notice_stack_pointer_modification_1(), outgoing_edges_match(), output_constant_pool(), output_function_exception_table(), output_one_function_exception_table(), pair_fusion::pair_fusion(), function_reader::parse_crtl(), function_reader::parse_function(), peep2_find_free_register(), prepare_function_start(), print_rtx_function(), profile_after_prologue(), read_rtl_function_body(), read_rtl_function_body_from_file_range(), recog_for_combine(), record_alignment_for_reg_var(), reg_single_def_p(), reload(), reload_combine_recognize_pattern(), reorder_basic_blocks(), reorg_loops(), reset_debug_use(), rest_of_clean_state(), rest_of_handle_check_leaf_regs(), rest_of_handle_df_initialize(), rest_of_handle_final(), round_push(), rtl_profile_for_bb(), rtl_profile_for_edge(), rtl_split_edge(), rtl_verify_edges(), rtx_addr_can_trap_p_1(), pair_fusion::run(), secname_for_decl(), set_nothrow_function_flags(), setup_save_areas(), shorten_branches(), sjlj_assign_call_site_values(), sjlj_build_landing_pads(), sjlj_emit_dispatch_table(), sjlj_emit_function_enter(), sjlj_emit_function_exit(), sjlj_emit_function_exit_after(), sjlj_mark_call_sites(), sjlj_output_call_site_table(), sjlj_size_of_call_site_table(), stack_protect_epilogue(), stack_protect_prologue(), store_one_arg(), target_reinit(), thread_jump(), thread_prologue_and_epilogue_insns(), try_fwprop_subst(), try_fwprop_subst_pattern(), pair_fusion::try_promote_writeback(), try_shrink_wrapping(), try_shrink_wrapping_separate(), try_validate_parallel(), update_eliminables(), update_equiv_regs_prescan(), update_stack_alignment_for_call(), use_shrink_wrapping_separate(), verify_hot_cold_block_grouping(), vt_add_function_parameter(), vt_init_cfa_base(), vt_initialize(), and pair_fusion::~pair_fusion().

◆ frame_offset

◆ frame_pointer_needed

◆ function_beg_insn

#define function_beg_insn   (crtl->x_function_beg_insn)

Referenced by expand_function_start().

◆ naked_return_label

#define naked_return_label   (crtl->x_naked_return_label)

◆ nonlocal_goto_handler_labels

#define nonlocal_goto_handler_labels   (crtl->x_nonlocal_goto_handler_labels)

◆ parm_birth_insn

#define parm_birth_insn   (crtl->x_parm_birth_insn)

◆ return_label

#define return_label   (crtl->x_return_label)

◆ stack_check_probe_note

#define stack_check_probe_note   (crtl->x_stack_check_probe_note)

◆ stack_realign_drap

#define stack_realign_drap   (crtl->stack_realign_needed && crtl->need_drap)

◆ stack_realign_fp

#define stack_realign_fp   (crtl->stack_realign_needed && !crtl->need_drap)

Referenced by init_elim_table(), and init_elim_table().

◆ stack_slot_list

#define stack_slot_list   (crtl->x_stack_slot_list)

◆ temp_slot_level

#define temp_slot_level   (crtl->x_temp_slot_level)

◆ used_temp_slots

#define used_temp_slots   (crtl->x_used_temp_slots)

Typedef Documentation

◆ temp_slot_p

typedef class temp_slot* temp_slot_p

Function Documentation

◆ adjust_address_1()

rtx adjust_address_1 ( rtx memref,
machine_mode mode,
poly_int64 offset,
int validate,
int adjust_address,
int adjust_object,
poly_int64 size )
extern
Return a memory reference like MEMREF, but with its mode changed
to MODE and its address offset by OFFSET bytes.  If VALIDATE is
nonzero, the memory address is forced to be valid.
If ADJUST_ADDRESS is zero, OFFSET is only used to update MEM_ATTRS
and the caller is responsible for adjusting MEMREF base register.
If ADJUST_OBJECT is zero, the underlying object associated with the
memory reference is left unchanged and the caller is responsible for
dealing with it.  Otherwise, if the new memory reference is outside
the underlying object, even partially, then the object is dropped.
SIZE, if nonzero, is the size of an access in cases where MODE
has no inherent size.   

References adjust_address, change_address_1(), copy_rtx(), gcc_assert, get_address_mode(), GET_CODE, get_mem_attrs(), GET_MODE, GET_MODE_ALIGNMENT, known_eq, maybe_gt, memory_address_addr_space_p(), MIN, mode_mem_attrs, NULL_TREE, attrs::offset, offset, plus_constant(), set_mem_attrs(), mem_attrs::size, targetm, trunc_int_for_mode(), and XEXP.

Referenced by adjust_automodify_address_1(), store_expr(), and widen_memory_access().

◆ adjust_automodify_address_1()

rtx adjust_automodify_address_1 ( rtx memref,
machine_mode mode,
rtx addr,
poly_int64 offset,
int validate )
extern
Return a memory reference like MEMREF, but with its mode changed
to MODE and its address changed to ADDR, which is assumed to be
MEMREF offset by OFFSET bytes.  If VALIDATE is
nonzero, the memory address is forced to be valid.   

References adjust_address_1(), change_address_1(), and offset.

◆ adjust_reg_mode()

void adjust_reg_mode ( rtx reg,
machine_mode mode )
extern
Adjust REG in-place so that it has mode MODE.  It is assumed that the
new register is a (possibly paradoxical) lowpart of the old one.   

References byte_lowpart_offset(), GET_MODE, PUT_MODE(), and update_reg_offset().

Referenced by subst_mode(), try_combine(), and undo_to_marker().

◆ change_address()

rtx change_address ( rtx memref,
machine_mode mode,
rtx addr )
extern
Return a memory reference like MEMREF, but with its mode changed
to MODE and its address changed to ADDR.
(VOIDmode means don't change the mode.
NULL for ADDR means don't change the address.)   
Like change_address_1 with VALIDATE nonzero, but we are not saying in what
way we are changing MEMREF, so we only preserve the alias set.   

References mem_attrs::align, attrs, change_address_1(), gen_rtx_MEM(), get_mem_attrs(), GET_MODE, mem_attrs_eq_p(), MEM_COPY_ATTRIBUTES, mode_mem_attrs, NULL_TREE, set_mem_attrs(), mem_attrs::size, mem_attrs::size_known_p, and XEXP.

Referenced by assign_parm_setup_block(), drop_writeback(), emit_block_cmp_via_loop(), emit_block_move_via_loop(), expand_assignment(), expand_builtin_init_trampoline(), expand_expr_real_1(), extract_writebacks(), store_expr(), and try_store_by_multiple_pieces().

◆ clear_mem_offset()

void clear_mem_offset ( rtx mem)
extern
Clear the offset recorded for MEM.   
Clear the offset of MEM.   

References attrs, get_mem_attrs(), and set_mem_attrs().

Referenced by expand_partial_load_optab_fn(), expand_partial_store_optab_fn(), get_memory_rtx(), merge_memattrs(), and try_store_by_multiple_pieces().

◆ clear_mem_size()

void clear_mem_size ( rtx mem)
extern
Clear the size recorded for MEM.   
Clear the size of MEM.   

References attrs, get_mem_attrs(), and set_mem_attrs().

Referenced by merge_memattrs().

◆ copy_delay_slot_insn()

rtx_insn * copy_delay_slot_insn ( rtx_insn * insn)
extern
Return a copy of INSN that can be used in a SEQUENCE delay slot,
on that assumption that INSN itself remains in its original place.   

References as_a(), copy_rtx(), cur_insn_uid, and INSN_UID().

Referenced by fill_simple_delay_slots(), fill_slots_from_thread(), and steal_delay_list_from_target().

◆ copy_insn()

rtx copy_insn ( rtx insn)
extern
Create a new copy of an rtx.
This function differs from copy_rtx in that it handles SCRATCHes and
ASM_OPERANDs properly.
INSN doesn't really have to be a full INSN; it could be just the
pattern.   

References copy_asm_constraints_vector, copy_asm_operands_vector, copy_insn_1(), copy_insn_n_scratches, orig_asm_constraints_vector, and orig_asm_operands_vector.

Referenced by bypass_block(), compare_and_jump_seq(), do_remat(), eliminate_partially_redundant_load(), eliminate_regs_in_insn(), emit_copy_of_insn_after(), lra_process_new_insns(), and try_optimize_cfg().

◆ copy_insn_1()

rtx copy_insn_1 ( rtx orig)
extern
Recursively create a new copy of an rtx for copy_insn.
This function differs from copy_rtx in that it handles SCRATCHes and
ASM_OPERANDs properly.
Normally, this function is not used directly; use copy_insn as front end.
However, you could first copy an insn pattern with copy_insn and then use
this function afterwards to properly copy any REG_NOTEs containing
SCRATCHes.   

References ASM_OPERANDS_INPUT_CONSTRAINT_VEC, ASM_OPERANDS_INPUT_VEC, CASE_CONST_ANY, copy_asm_constraints_vector, copy_asm_operands_vector, copy_insn_1(), copy_insn_n_scratches, copy_insn_scratch_in, copy_insn_scratch_out, gcc_assert, gcc_unreachable, GET_CODE, GET_RTX_FORMAT, GET_RTX_LENGTH, HARD_REGISTER_NUM_P, i, INSN_P, NULL, orig_asm_constraints_vector, orig_asm_operands_vector, ORIGINAL_REGNO, REG_P, REGNO, rtvec_alloc(), RTX_CODE, RTX_FLAG, shallow_copy_rtx(), shared_const_p(), XEXP, XVEC, XVECEXP, and XVECLEN.

Referenced by copy_insn(), copy_insn_1(), duplicate_reg_note(), eliminate_regs_in_insn(), and gcse_emit_move_after().

◆ emit_copy_of_insn_after()

◆ force_reload_address()

rtx force_reload_address ( rtx mem)
extern
Return a memory reference like MEM, but with the address reloaded into a
pseudo register.   

References address_reload_context::emit_autoinc(), force_reg(), GET_CODE, GET_MODE, GET_MODE_SIZE(), GET_RTX_CLASS, replace_equiv_address(), RTX_AUTOINC, mem_attrs::size, and XEXP.

◆ gen_blockage()

rtx gen_blockage ( void )
extern
Generate an empty ASM_INPUT, which is used to block attempts to schedule,
and to block register equivalences to be seen across this insn.   

References gen_rtx_ASM_INPUT, and MEM_VOLATILE_P.

Referenced by anti_adjust_stack_and_probe_stack_clash(), expand_builtin_longjmp(), expand_builtin_nonlocal_goto(), expand_builtin_setjmp_receiver(), expand_function_end(), make_prologue_seq(), and probe_stack_range().

◆ gen_const_vec_duplicate()

rtx gen_const_vec_duplicate ( machine_mode mode,
rtx elt )
extern

◆ gen_const_vec_series()

rtx gen_const_vec_series ( machine_mode mode,
rtx base,
rtx step )
extern
Generate a vector constant of mode MODE in which element I has
the value BASE + I * STEP.   

References rtx_vector_builder::build(), gcc_assert, GET_MODE_INNER, i, simplify_gen_binary(), and valid_for_const_vector_p().

Referenced by gen_vec_series(), and simplify_context::simplify_binary_operation_1().

◆ gen_int_mode()

rtx gen_int_mode ( poly_int64 c,
machine_mode mode )
extern

References as_a(), poly_int< N, C >::coeffs, poly_int< N, C >::from(), GEN_INT, GET_MODE_PRECISION(), immed_wide_int_const(), poly_int< N, C >::is_constant(), SIGNED, and trunc_int_for_mode().

Referenced by add_args_size_note(), addr_offset_valid_p(), align_dynamic_address(), allocate_dynamic_stack_space(), anti_adjust_stack_and_probe(), asan_clear_shadow(), asan_emit_stack_protection(), assemble_real(), assign_parm_setup_block(), assign_parms(), autoinc_split(), builtin_memset_read_str(), canonicalize_address_mult(), canonicalize_condition(), cleanup_auto_inc_dec(), combine_set_extension(), combine_simplify_rtx(), convert_mode_scalar(), create_integer_operand(), cselib_hash_rtx(), default_memtag_untagged_pointer(), do_pending_stack_adjust(), do_tablejump(), dw2_asm_output_offset(), address_reload_context::emit_autoinc(), emit_call_1(), emit_library_call_value_1(), emit_move_complex(), emit_move_resolve_push(), emit_push_insn(), emit_store_flag(), emit_store_flag_int(), expand_atomic_test_and_set(), expand_binop(), expand_builtin_memset_args(), expand_call(), expand_ctz(), expand_debug_expr(), expand_divmod(), expand_doubleword_clz_ctz_ffs(), expand_doubleword_mod(), expand_expr_real_1(), expand_expr_real_2(), expand_ffs(), expand_field_assignment(), expand_fix(), expand_HWASAN_CHOOSE_TAG(), expand_sdiv_pow2(), expand_SET_EDOM(), expand_shift_1(), expand_smod_pow2(), expand_stack_vars(), expand_unop(), expand_vector_ubsan_overflow(), expmed_mult_highpart(), extract_left_shift(), find_split_point(), asan_redzone_buffer::flush_redzone_payload(), for_each_inc_dec_find_inc_dec(), force_int_to_mode(), force_to_mode(), gen_int_shift_amount(), get_call_args(), get_dynamic_stack_base(), get_mode_bounds(), get_stored_val(), hwasan_emit_prologue(), hwasan_truncate_to_tag_size(), if_then_else_cond(), immed_double_const(), immed_wide_int_const_1(), inc_for_reload(), pieces_addr::increment_address(), init_caller_save(), init_one_dwarf_reg_size(), init_reload(), init_return_column_size(), insert_const_anchor(), instantiate_virtual_regs_in_insn(), iv_number_of_iterations(), make_compound_operation_int(), make_extraction(), make_field_assignment(), maybe_legitimize_operand(), mem_loc_descriptor(), move2add_use_add2_insn(), move2add_use_add3_insn(), multiplier_allowed_in_address_p(), native_decode_vector_rtx(), noce_try_bitop(), noce_try_cmove(), noce_try_store_flag_constants(), optimize_bitfield_assignment_op(), output_constant_pool_2(), plus_constant(), probe_stack_range(), push_block(), reload_cse_move2add(), round_trampoline_addr(), simplify_and_const_int(), simplify_and_const_int_1(), simplify_context::simplify_binary_operation_1(), simplify_compare_const(), simplify_comparison(), simplify_if_then_else(), simplify_set(), simplify_shift_const_1(), simplify_context::simplify_ternary_operation(), sjlj_mark_call_sites(), split_iv(), store_bit_field_using_insv(), store_constructor(), store_field(), store_one_arg(), try_store_by_multiple_pieces(), unroll_loop_constant_iterations(), unroll_loop_runtime_iterations(), update_reg_equal_equiv_notes(), validate_test_and_branch(), vec_perm_indices_to_rtx(), and widen_leading().

◆ gen_int_shift_amount()

◆ gen_rtvec()

rtvec gen_rtvec ( int n,
... )
extern

◆ gen_vec_duplicate()

rtx gen_vec_duplicate ( machine_mode mode,
rtx x )
extern
Return a vector rtx of mode MODE in which every element has value X.
The result will be a constant if X is constant.   

References gen_const_vec_duplicate(), and valid_for_const_vector_p().

Referenced by gen_vec_series(), simplify_context::simplify_binary_operation_1(), simplify_context::simplify_subreg(), and simplify_context::simplify_unary_operation_1().

◆ gen_vec_series()

rtx gen_vec_series ( machine_mode mode,
rtx base,
rtx step )
extern
Generate a vector of mode MODE in which element I has the value
BASE + I * STEP.  The result will be a constant if BASE and STEP
are both constants.   

References const0_rtx, gen_const_vec_series(), gen_vec_duplicate(), and valid_for_const_vector_p().

Referenced by simplify_context::simplify_binary_operation_series(), and simplify_context::simplify_unary_operation_1().

◆ get_current_sequence()

◆ get_insns()

rtx_insn * get_insns ( void )
inline
Return the first insn of the current sequence or current function.   

References sequence_stack::first, and get_current_sequence().

Referenced by add_cfis_to_fde(), add_insn(), add_store_equivs(), add_test(), asan_clear_shadow(), asan_emit_allocas_unpoison(), asan_emit_stack_protection(), assign_parm_setup_block(), assign_parm_setup_reg(), assign_parm_setup_stack(), assign_parms_unsplit_complex(), attempt_change(), break_superblocks(), calculate_elim_costs_all_insns(), cfg_layout_delete_block(), cfg_layout_finalize(), cfg_layout_split_edge(), check_and_process_move(), check_sibcall_argument_overlap(), cleanup_barriers(), cleanup_cfg(), collect_fn_hard_reg_usage(), combine_and_move_insns(), combine_reaching_defs(), combine_var_copies_in_loop_exit(), compare_and_jump_seq(), computation_cost(), construct_init_block(), convert_mode_scalar(), convert_to_eh_region_ranges(), create_cands(), create_pseudo_cfg(), cse_main(), curr_insn_transform(), delete_vta_debug_insns(), do_reload(), do_remat(), doloop_modify(), dw2_build_landing_pads(), emit_common_heads_for_components(), emit_common_tails_for_components(), emit_inc_dec_insn_before(), emit_initial_value_sets(), emit_input_reload_insns(), emit_move_list(), emit_move_multi_word(), emit_output_reload_insns(), emit_partition_copy(), emit_pattern_before_setloc(), end_ifcvt_sequence(), entry_of_function(), execute_function_dump(), expand_absneg_bit(), expand_asm_stmt(), expand_atomic_fetch_op(), expand_binop(), expand_builtin_apply_args(), expand_builtin_int_roundingfn(), expand_builtin_int_roundingfn_2(), expand_builtin_mathfn_3(), expand_builtin_mathfn_ternary(), expand_builtin_return(), expand_builtin_saveregs(), expand_builtin_strlen(), expand_call(), expand_clrsb_using_clz(), expand_cond_expr_using_cmove(), expand_copysign_bit(), expand_ctz(), expand_debug_locations(), expand_DIVMOD(), expand_doubleword_clz_ctz_ffs(), expand_doubleword_divmod(), expand_doubleword_mod(), expand_doubleword_popcount(), expand_expr_divmod(), expand_expr_real_2(), expand_ffs(), expand_fix(), expand_fixed_convert(), expand_float(), expand_function_end(), expand_POPCOUNT(), expand_sdiv_pow2(), expand_twoval_binop_libfunc(), expand_unop(), expmed_mult_highpart_optab(), fill_slots_from_thread(), find_shift_sequence(), fix_crossing_unconditional_branches(), fixup_tail_calls(), free_bb_for_insn(), fwprop_done(), gen_call_used_regs_seq(), gen_clobber(), gen_cond_trap(), gen_move_insn(), gen_reload(), gen_use(), get_arg_pointer_save_area(), get_first_nonnote_insn(), get_some_local_dynamic_name(), function_reader::handle_insn_uids(), hwasan_emit_untag_frame(), hwasan_frame_base(), if_convert(), indirect_jump_optimize(), inherit_in_ebb(), inherit_reload_reg(), init_set_costs(), initialize_uninitialized_regs(), inline_string_cmp(), insert_base_initialization(), insert_insn_on_edge(), insert_move_for_subreg(), insert_prologue_epilogue_for_components(), insert_value_copy_on_edge(), insert_var_expansion_initialization(), instantiate_virtual_regs(), instantiate_virtual_regs_in_insn(), internal_arg_pointer_based_exp_scan(), ira(), leaf_function_p(), lra(), lra_dump_insns(), lra_process_new_insns(), make_epilogue_seq(), make_prologue_seq(), make_split_prologue_seq(), mark_constant_pool(), match_asm_constraints_1(), match_reload(), maybe_optimize_mod_cmp(), maybe_optimize_pow2p_mod_cmp(), noce_convert_multiple_sets(), noce_emit_cmove(), noce_emit_move_insn(), noce_emit_store_flag(), noce_process_if_block(), noce_try_inverse_constants(), function_reader::parse_function(), peephole2_optimize(), pop_topmost_sequence(), prepare_copy_insn(), prepare_float_lib_cmp(), prepend_insn_to_edge(), print_rtx_function(), process_addr_reg(), process_address_1(), process_invariant_for_inheritance(), record_effective_endpoints(), record_entry_value(), record_store(), reemit_insn_block_notes(), remove_inheritance_pseudos(), reorder_blocks(), reorder_insns_nobb(), reorg_loops(), replace_read(), reposition_prologue_and_epilogue_notes(), reset_all_used_flags(), resolve_shift_zext(), resolve_simple_move(), rest_of_clean_state(), rest_of_handle_combine(), rest_of_handle_cse(), rest_of_handle_cse2(), rest_of_handle_cse_after_global_opts(), rest_of_handle_delay_slots(), rest_of_handle_final(), rest_of_handle_gcse2(), rest_of_handle_shorten_branches(), rtl_lv_add_condition_to_bb(), rtl_verify_bb_layout(), rtl_verify_edges(), set_nothrow_function_flags(), shorten_branches(), sjlj_emit_dispatch_table(), sjlj_emit_function_enter(), sjlj_emit_function_exit(), sjlj_mark_call_sites(), spill_pseudos(), split_all_insns_noflow(), split_iv(), start_sequence(), thread_prologue_and_epilogue_insns(), try_crossjump_to_edge(), try_emit_cmove_seq(), unroll_loop_runtime_iterations(), unshare_all_rtl(), verify_insn_chain(), verify_rtl_sharing(), vt_add_function_parameter(), vt_init_cfa_base(), and vt_initialize().

◆ get_last_insn()

rtx_insn * get_last_insn ( void )
inline
Return the last insn emitted in current sequence or current function.   

References get_current_sequence(), and sequence_stack::last.

Referenced by add_insn(), add_test(), adjust_stack_1(), allocate_dynamic_stack_space(), asan_clear_shadow(), assign_parm_setup_block(), assign_parm_setup_reg(), assign_parm_setup_stack(), assign_parms_unsplit_complex(), base_to_reg(), can_widen_mult_without_libcall(), cfg_layout_delete_block(), cfg_layout_duplicate_bb(), commit_one_edge_insertion(), compare_and_jump_seq(), compress_float_constant(), construct_exit_block(), construct_init_block(), convert_memory_address_addr_space_1(), create_basic_block_structure(), default_zero_call_used_regs(), delete_trivially_dead_insns(), duplicate_insn_chain(), emit_add3_insn(), address_reload_context::emit_autoinc(), emit_conditional_add(), emit_conditional_move(), emit_conditional_neg_or_complement(), emit_cstore(), emit_debug_insn(), emit_insn(), emit_insn_after_1(), emit_insn_if_valid_for_reload_1(), emit_library_call_value_1(), emit_move_complex(), emit_move_complex_parts(), emit_moves(), emit_store_flag(), emit_store_flag_int(), expand_abs_nojump(), expand_absneg_bit(), expand_addsub_overflow(), expand_asm_stmt(), expand_atomic_compare_and_swap(), expand_atomic_load(), expand_atomic_store(), expand_binop(), expand_builtin_apply(), expand_builtin_interclass_mathfn(), expand_builtin_issignaling(), expand_builtin_longjmp(), expand_builtin_nonlocal_goto(), expand_builtin_signbit(), expand_builtin_strlen(), expand_call(), expand_call_stmt(), expand_case(), expand_ccmp_expr(), expand_debug_locations(), expand_DIVMOD(), expand_divmod(), expand_doubleword_divmod(), expand_doubleword_mod(), expand_doubleword_shift(), expand_fix(), expand_function_end(), expand_function_start(), expand_gimple_basic_block(), expand_gimple_cond(), expand_gimple_stmt(), expand_gimple_tailcall(), expand_mul_overflow(), expand_mult_const(), expand_neg_overflow(), expand_one_cmpl_abs_nojump(), expand_parity(), expand_sfix_optab(), expand_sjlj_dispatch_table(), expand_stack_restore(), expand_twoval_binop(), expand_twoval_unop(), expand_unop(), expand_unop_direct(), expand_vec_perm_const(), extract_integral_bit_field(), find_end_label(), force_reg(), gen_reload(), gen_reload_chain_without_interm_reg_p(), get_last_nonnote_insn(), inc_for_reload(), last_call_insn(), load_register_parameters(), lra(), lra_emit_add(), lra_process_new_insns(), make_epilogue_seq(), mark_transaction_restart_calls(), maybe_cleanup_end_of_block(), maybe_emit_sync_lock_test_and_set(), maybe_legitimize_operand_same_code(), maybe_legitimize_operands(), move_block_from_reg(), move_block_to_reg(), function_reader::parse_insn(), pop_topmost_sequence(), prepare_call_address(), prepare_cmp_insn(), prepare_function_start(), process_address_1(), record_effective_endpoints(), reload_combine(), reorder_insns_nobb(), rtl_lv_add_condition_to_bb(), rtl_split_block(), rtl_verify_bb_insn_chain(), shorten_branches(), stack_protect_epilogue(), start_sequence(), store_bit_field_using_insv(), store_integral_bit_field(), try_split(), verify_insn_chain(), widen_bswap(), and widen_leading().

◆ get_max_uid()

◆ get_mem_align_offset()

int get_mem_align_offset ( rtx mem,
unsigned int align )
extern
Return OFFSET if XEXP (MEM, 0) - OFFSET is known to be ALIGN
bits aligned for 0 <= OFFSET < ALIGN / BITS_PER_UNIT, or
-1 if not known.   

References component_ref_field_offset(), DECL_ALIGN, DECL_FIELD_BIT_OFFSET, DECL_FIELD_CONTEXT, DECL_P, expr, gcc_assert, INDIRECT_REF_P, MEM_EXPR, MEM_OFFSET, MEM_OFFSET_KNOWN_P, MEM_P, NULL_TREE, offset, poly_int_tree_p(), TREE_CODE, tree_fits_uhwi_p(), TREE_OPERAND, tree_to_uhwi(), TREE_TYPE, and TYPE_ALIGN.

◆ get_spill_slot_decl()

◆ get_topmost_sequence()

struct sequence_stack * get_topmost_sequence ( void )
inline
Return the outermost sequence.   

References get_current_sequence(), and sequence_stack::next.

Referenced by pop_topmost_sequence(), and push_topmost_sequence().

◆ maybe_set_max_label_num()

void maybe_set_max_label_num ( rtx_code_label * x)
extern
For use by the RTL function loader, when mingling with normal
functions.
Ensure that label_num is greater than the label num of X, to avoid
duplicate labels in the generated assembler.   

References CODE_LABEL_NUMBER, and label_num.

Referenced by function_reader::parse_insn().

◆ mem_attrs_eq_p()

bool mem_attrs_eq_p ( const class mem_attrs * p,
const class mem_attrs * q )

◆ mem_expr_equal_p()

bool mem_expr_equal_p ( const_tree expr1,
const_tree expr2 )
extern
Returns true if both MEM_EXPR can be considered equal
and false otherwise.   

References operand_equal_p(), and TREE_CODE.

Referenced by merge_memattrs().

◆ need_atomic_barrier_p()

bool need_atomic_barrier_p ( enum memmodel model,
bool pre )
extern
Return true if memory model MODEL requires a pre-operation (release-style)
barrier or a post-operation (acquire-style) barrier.  While not universal,
this function matches behavior of several targets.   

References gcc_unreachable, MEMMODEL_ACQ_REL, MEMMODEL_ACQUIRE, MEMMODEL_BASE_MASK, MEMMODEL_CONSUME, MEMMODEL_RELAXED, MEMMODEL_RELEASE, and MEMMODEL_SEQ_CST.

◆ offset_address()

rtx offset_address ( rtx memref,
rtx offset,
unsigned HOST_WIDE_INT pow2 )
extern
Return a memory reference like MEMREF, but whose address is changed by
adding OFFSET, an RTX, to it.  POW2 is the highest power of two factor
known to be in OFFSET (possibly 1).   

References attrs, change_address_1(), force_reg(), get_address_mode(), GET_CODE, get_mem_attrs(), GET_MODE, memory_address_addr_space_p(), MIN, mode_mem_attrs, offset, pic_offset_table_rtx, set_mem_attrs(), simplify_gen_binary(), mem_attrs::size, mem_attrs::size_known_p, update_temp_slot_address(), and XEXP.

Referenced by expand_assignment(), expand_expr_real_1(), store_constructor(), and store_expr().

◆ replace_equiv_address()

rtx replace_equiv_address ( rtx memref,
rtx addr,
bool inplace )
extern
Return a memory reference like MEMREF, but with its address changed to
ADDR.  The caller is asserting that the actual piece of memory pointed
to is the same, just the form of the address is being changed, such as
by putting something into a register.   
Return a memory reference like MEMREF, but with its address changed to
ADDR.  The caller is asserting that the actual piece of memory pointed
to is the same, just the form of the address is being changed, such as
by putting something into a register.  INPLACE is true if any changes
can be made directly to MEMREF or false if MEMREF must be treated as
immutable.   

References change_address_1(), update_temp_slot_address(), and XEXP.

Referenced by emit_move_resolve_push(), expand_expr_real_1(), expand_movstr(), force_reload_address(), instantiate_virtual_regs_in_insn(), maybe_legitimize_operand_same_code(), operand_subword(), try_apply_stack_adjustment(), try_store_by_multiple_pieces(), use_anchored_address(), and validize_mem().

◆ replace_equiv_address_nv()

◆ set_decl_incoming_rtl()

void set_decl_incoming_rtl ( tree t,
rtx x,
bool by_reference_p )
extern
Assign the RTX X to parameter declaration T.  BY_REFERENCE_P is true
if the ABI requires the parameter to be passed by reference.   

References DECL_INCOMING_RTL, and set_reg_attrs_for_decl_rtl().

Referenced by assign_parms(), assign_parms_unsplit_complex(), and expand_function_start().

◆ set_first_insn()

◆ set_last_insn()

◆ set_mem_addr_space()

void set_mem_addr_space ( rtx mem,
addr_space_t addrspace )
extern
Set the address space of MEM to ADDRSPACE.   
Set the address space of MEM to ADDRSPACE (target-defined).   

References mem_attrs::addrspace, attrs, get_mem_attrs(), and set_mem_attrs().

Referenced by expand_debug_expr(), expand_expr_real_1(), get_builtin_sync_mem(), function_reader::handle_any_trailing_information(), noce_try_cmove_arith(), and produce_memory_decl_rtl().

◆ set_mem_alias_set()

◆ set_mem_align()

◆ set_mem_attributes()

void set_mem_attributes ( rtx ref,
tree t,
int objectp )
extern

◆ set_mem_attributes_minus_bitpos()

void set_mem_attributes_minus_bitpos ( rtx ref,
tree t,
int objectp,
poly_int64 bitpos )
extern
Similar, except that BITPOS has not yet been applied to REF, so if
we alter MEM_OFFSET according to T then we should subtract BITPOS
expecting that it'll be added back in later.   
Given REF (a MEM) and T, either the type of X or the expression
corresponding to REF, set the memory attributes.  OBJECTP is nonzero
if we are making a new object of this type.  BITPOS is nonzero if
there is an offset outstanding on T that will be applied later.   

References mem_attrs::align, bits_to_bytes_round_down, build2(), build_int_cst(), cfun, component_uses_parent_alias_set_from(), CONSTANT_CLASS_P, CONVERT_EXPR_P, DECL_BIT_FIELD, DECL_EXTERNAL, DECL_P, DECL_RTL_IF_SET, DECL_SIZE_UNIT, error_mark_node, mem_attrs::expr, gcc_assert, get_alias_set(), get_base_address(), GET_MODE, get_object_alignment_1(), handled_component_p(), is_global_var(), MAX, MEM_ATTRS, MEM_KEEP_ALIAS_SET_P, MEM_NOTRAP_P, MEM_POINTER, MEM_READONLY_P, MEM_VOLATILE_P, MIN, mode_mem_attrs, NULL, NULL_TREE, attrs::offset, mem_attrs::offset, mem_attrs::offset_known_p, POINTER_TYPE_P, poly_int_tree_p(), reference_alias_ptr_type(), set_mem_attrs(), mem_attrs::size, mem_attrs::size_known_p, TREE_CODE, tree_could_trap_p(), TREE_OPERAND, TREE_READONLY, TREE_STATIC, TREE_THIS_VOLATILE, TREE_TYPE, type(), TYPE_ADDR_SPACE, TYPE_ALIGN, TYPE_P, TYPE_SIZE_UNIT, TYPE_VOLATILE, unshare_expr(), and VAR_P.

Referenced by expand_assignment(), and set_mem_attributes().

◆ set_mem_attrs_for_spill()

void set_mem_attrs_for_spill ( rtx mem)
extern
Set the attributes for MEM appropriate for a spill slot.   
Given MEM, a result from assign_stack_local, fill in the memory
attributes as appropriate for a register allocator spill slot.
These slots are not aliasable by other memory.  We arrange for
them all to use a single MEM_EXPR, so that the aliasing code can
work properly in the case of shared spill slots.   

References ADDR_SPACE_GENERIC, attrs, DECL_RTL, get_mem_attrs(), get_spill_slot_decl(), MEM_ALIAS_SET, MEM_NOTRAP_P, attrs::offset, set_mem_attrs(), strip_offset(), and XEXP.

Referenced by alter_reg(), and assign_mem_slot().

◆ set_mem_expr()

◆ set_mem_offset()

void set_mem_offset ( rtx mem,
poly_int64 offset )
extern
Set the offset for MEM to OFFSET.   
Set the offset of MEM to OFFSET.   

References attrs, get_mem_attrs(), attrs::offset, offset, and set_mem_attrs().

Referenced by assign_parm_find_stack_rtl(), assign_parm_setup_stack(), and function_reader::handle_any_trailing_information().

◆ set_mem_size()

◆ set_reg_attrs_for_decl_rtl()

void set_reg_attrs_for_decl_rtl ( tree t,
rtx x )
extern

◆ set_reg_attrs_for_parm()

void set_reg_attrs_for_parm ( rtx parm_rtx,
rtx mem )
extern
Set the register attributes for registers contained in PARM_RTX.
Use needed values from memory attributes of MEM.   

References GET_CODE, get_reg_attrs(), i, INTVAL, MEM_EXPR, REG_ATTRS, REG_P, set_reg_attrs_from_value(), XEXP, XVECEXP, and XVECLEN.

Referenced by assign_parm_find_stack_rtl().

◆ set_reg_attrs_from_value()

void set_reg_attrs_from_value ( rtx reg,
rtx x )
extern

◆ valid_for_const_vector_p()

bool valid_for_const_vector_p ( machine_mode ,
rtx x )
extern

◆ widen_memory_access()

rtx widen_memory_access ( rtx memref,
machine_mode mode,
poly_int64 offset )
extern
Return a memory reference like MEMREF, but with its mode widened to
MODE and adjusted by OFFSET.   
Return a memory reference like MEMREF, but with its mode widened to
MODE and offset by OFFSET.  This would be used by targets that e.g.
cannot issue QImode memory operations and have to use SImode memory
operations plus masking logic.   

References adjust_address_1(), attrs, component_ref_field_offset(), DECL_FIELD_BIT_OFFSET, DECL_P, DECL_SIZE_UNIT, get_mem_attrs(), GET_MODE_SIZE(), known_ge, NULL_TREE, attrs::offset, offset, poly_int_tree_p(), set_mem_attrs(), mem_attrs::size, wi::to_poly_offset(), TREE_CODE, TREE_OPERAND, and tree_to_uhwi().

Variable Documentation

◆ x_rtl

struct rtl_data x_rtl
extern
Datastructures maintained for currently processed function in RTL form.