Skip to content
Snippets Groups Projects
  • Lewis Hyatt's avatar
    5c8b9788
    Support for 64-bit location_t: RTL parts · 5c8b9788
    Lewis Hyatt authored
    Some RTL objects need to store a location_t. Currently, they store it in the
    rt_int field of union rtunion, but in a world where location_t could be
    64-bit, they need to store it in a larger variable. Unfortunately, rtunion
    does not currently have a 64-bit int type for that purpose, so add one. In
    order to avoid increasing any overhead when 64-bit locations are not in use,
    the new field is dedicated for location_t storage only and has type
    "location_t" so it will only be 64-bit if necessary. This necessitates
    adding a new RTX format code 'L' for locations. There are very many switch
    statements in the codebase that inspect the RTX format code. I took the
    approach of finding all of them that handle code 'i' or 'n' and making sure
    they handle 'L' too. I am sure that some of these call sites can never see
    an 'L' code, but I thought it would be safer and more future-proof to handle
    as many as possible, given it's just a line or two to add in most cases.
    
    gcc/ChangeLog:
    
    	* rtl.def (DEBUG_INSN): Use new format code 'L' for location_t fields.
    	(INSN): Likewise.
    	(JUMP_INSN): Likewise.
    	(CALL_INSN): Likewise.
    	(ASM_INPUT): Likewise.
    	(ASM_OPERANDS): Likewise.
    	* rtl.h (union rtunion): Add new location_t RT_LOC member for use by
    	the 'L' format.
    	(struct rtx_debug_insn): Adjust comment.
    	(struct rtx_nonjump_insn): Adjust comment.
    	(struct rtx_call_insn): Adjust comment.
    	(XLOC): New accessor macro for rtunion::rt_loc.
    	(X0LOC): Likewise.
    	(XCLOC): Likewise.
    	(INSN_LOCATION): Use XLOC instead of XUINT to retrieve a location_t.
    	(NOTE_MARKER_LOCATION): Likewise for XCUINT -> XCLOC.
    	(ASM_OPERANDS_SOURCE_LOCATION): Likewise.
    	(ASM_INPUT_SOURCE_LOCATION):Likewise.
    	(gen_rtx_ASM_INPUT): Adjust to use sL format instead of si.
    	(gen_rtx_INSN): Adjust prototype to use location_r rather than int
    	for the location.
    	* cfgrtl.cc (force_nonfallthru_and_redirect): Change type of LOC
    	local variable from int to location_t.
    	* rtlhash.cc (add_rtx): Support 'L' format in the switch statement.
    	* var-tracking.cc (loc_cmp): Likewise.
    	* alias.cc (rtx_equal_for_memref_p): Likewise.
    	* config/alpha/alpha.cc (summarize_insn): Likewise.
    	* config/ia64/ia64.cc (rtx_needs_barrier): Likewise.
    	* config/rs6000/rs6000.cc (rs6000_hash_constant): Likewise.
    	* cse.cc (hash_rtx): Likewise.
    	(exp_equiv_p): Likewise.
    	* cselib.cc (rtx_equal_for_cselib_1): Likewise.
    	(cselib_hash_rtx): Likewise.
    	(cselib_expand_value_rtx_1): Likewise.
    	* emit-rtl.cc (copy_insn_1): Likewise.
    	(gen_rtx_INSN): Change the location argument from int to location_t,
    	and call the corresponding gen_rtf_fmt_* function.
    	* final.cc (leaf_renumber_regs_insn): Support 'L' format in the
    	switch statement.
    	* genattrtab.cc (attr_rtx_1): Likewise.
    	* genemit.cc (gen_exp): Likewise.
    	* gengenrtl.cc (type_from_format): Likewise.
    	(accessor_from_format): Likewise.
    	* gengtype.cc (adjust_field_rtx_def): Likewise.
    	* genpeep.cc (match_rtx): Likewise; just mark gcc_unreachable() for
    	now.
    	* genrecog.cc (find_operand): Support 'L' format in the switch statement.
    	(find_matching_operand): Likewise.
    	(validate_pattern): Likewise.
    	* gensupport.cc (subst_pattern_match): Likewise.
    	(get_alternatives_number): Likewise.
    	(collect_insn_data): Likewise.
    	(alter_predicate_for_insn): Likewise.
    	(alter_constraints): Likewise.
    	(subst_dup): Likewise.
    	* jump.cc (rtx_renumbered_equal_p): Likewise.
    	* loop-invariant.cc (hash_invariant_expr_1): Likewise.
    	* lra-constraints.cc (operands_match_p): Likewise.
    	* lra.cc (lra_rtx_hash): Likewise.
    	* print-rtl.cc (rtx_writer::print_rtx_operand_code_i): Refactor
    	location_t-relevant code to...
    	(rtx_writer::print_rtx_operand_code_L): ...new function here.
    	(rtx_writer::print_rtx_operand): Support 'L' format in the switch statement.
    	* print-rtl.h (rtx_writer::print_rtx_operand_code_L): Add prototype
    	for new function.
    	* read-rtl-function.cc (function_reader::read_rtx_operand): Support
    	'L' format in the switch statement.
    	(function_reader::read_rtx_operand_i_or_n): Rename to...
    	(function_reader::read_rtx_operand_inL): ...this, and support 'L' as
    	well.
    	* read-rtl.cc (apply_int_iterator): Support 'L' format in the switch
    	statement.
    	(rtx_reader::read_rtx_operand): Likewise.
    	* reload.cc (operands_match_p): Likewise.
    	* rtl.cc (rtx_format): Add new code 'L'.
    	(rtx_equal_p): Support 'L' in the switch statement. Remove dead code
    	in the handling for 'i' and 'n'.
    5c8b9788
    History
    Support for 64-bit location_t: RTL parts
    Lewis Hyatt authored
    Some RTL objects need to store a location_t. Currently, they store it in the
    rt_int field of union rtunion, but in a world where location_t could be
    64-bit, they need to store it in a larger variable. Unfortunately, rtunion
    does not currently have a 64-bit int type for that purpose, so add one. In
    order to avoid increasing any overhead when 64-bit locations are not in use,
    the new field is dedicated for location_t storage only and has type
    "location_t" so it will only be 64-bit if necessary. This necessitates
    adding a new RTX format code 'L' for locations. There are very many switch
    statements in the codebase that inspect the RTX format code. I took the
    approach of finding all of them that handle code 'i' or 'n' and making sure
    they handle 'L' too. I am sure that some of these call sites can never see
    an 'L' code, but I thought it would be safer and more future-proof to handle
    as many as possible, given it's just a line or two to add in most cases.
    
    gcc/ChangeLog:
    
    	* rtl.def (DEBUG_INSN): Use new format code 'L' for location_t fields.
    	(INSN): Likewise.
    	(JUMP_INSN): Likewise.
    	(CALL_INSN): Likewise.
    	(ASM_INPUT): Likewise.
    	(ASM_OPERANDS): Likewise.
    	* rtl.h (union rtunion): Add new location_t RT_LOC member for use by
    	the 'L' format.
    	(struct rtx_debug_insn): Adjust comment.
    	(struct rtx_nonjump_insn): Adjust comment.
    	(struct rtx_call_insn): Adjust comment.
    	(XLOC): New accessor macro for rtunion::rt_loc.
    	(X0LOC): Likewise.
    	(XCLOC): Likewise.
    	(INSN_LOCATION): Use XLOC instead of XUINT to retrieve a location_t.
    	(NOTE_MARKER_LOCATION): Likewise for XCUINT -> XCLOC.
    	(ASM_OPERANDS_SOURCE_LOCATION): Likewise.
    	(ASM_INPUT_SOURCE_LOCATION):Likewise.
    	(gen_rtx_ASM_INPUT): Adjust to use sL format instead of si.
    	(gen_rtx_INSN): Adjust prototype to use location_r rather than int
    	for the location.
    	* cfgrtl.cc (force_nonfallthru_and_redirect): Change type of LOC
    	local variable from int to location_t.
    	* rtlhash.cc (add_rtx): Support 'L' format in the switch statement.
    	* var-tracking.cc (loc_cmp): Likewise.
    	* alias.cc (rtx_equal_for_memref_p): Likewise.
    	* config/alpha/alpha.cc (summarize_insn): Likewise.
    	* config/ia64/ia64.cc (rtx_needs_barrier): Likewise.
    	* config/rs6000/rs6000.cc (rs6000_hash_constant): Likewise.
    	* cse.cc (hash_rtx): Likewise.
    	(exp_equiv_p): Likewise.
    	* cselib.cc (rtx_equal_for_cselib_1): Likewise.
    	(cselib_hash_rtx): Likewise.
    	(cselib_expand_value_rtx_1): Likewise.
    	* emit-rtl.cc (copy_insn_1): Likewise.
    	(gen_rtx_INSN): Change the location argument from int to location_t,
    	and call the corresponding gen_rtf_fmt_* function.
    	* final.cc (leaf_renumber_regs_insn): Support 'L' format in the
    	switch statement.
    	* genattrtab.cc (attr_rtx_1): Likewise.
    	* genemit.cc (gen_exp): Likewise.
    	* gengenrtl.cc (type_from_format): Likewise.
    	(accessor_from_format): Likewise.
    	* gengtype.cc (adjust_field_rtx_def): Likewise.
    	* genpeep.cc (match_rtx): Likewise; just mark gcc_unreachable() for
    	now.
    	* genrecog.cc (find_operand): Support 'L' format in the switch statement.
    	(find_matching_operand): Likewise.
    	(validate_pattern): Likewise.
    	* gensupport.cc (subst_pattern_match): Likewise.
    	(get_alternatives_number): Likewise.
    	(collect_insn_data): Likewise.
    	(alter_predicate_for_insn): Likewise.
    	(alter_constraints): Likewise.
    	(subst_dup): Likewise.
    	* jump.cc (rtx_renumbered_equal_p): Likewise.
    	* loop-invariant.cc (hash_invariant_expr_1): Likewise.
    	* lra-constraints.cc (operands_match_p): Likewise.
    	* lra.cc (lra_rtx_hash): Likewise.
    	* print-rtl.cc (rtx_writer::print_rtx_operand_code_i): Refactor
    	location_t-relevant code to...
    	(rtx_writer::print_rtx_operand_code_L): ...new function here.
    	(rtx_writer::print_rtx_operand): Support 'L' format in the switch statement.
    	* print-rtl.h (rtx_writer::print_rtx_operand_code_L): Add prototype
    	for new function.
    	* read-rtl-function.cc (function_reader::read_rtx_operand): Support
    	'L' format in the switch statement.
    	(function_reader::read_rtx_operand_i_or_n): Rename to...
    	(function_reader::read_rtx_operand_inL): ...this, and support 'L' as
    	well.
    	* read-rtl.cc (apply_int_iterator): Support 'L' format in the switch
    	statement.
    	(rtx_reader::read_rtx_operand): Likewise.
    	* reload.cc (operands_match_p): Likewise.
    	* rtl.cc (rtx_format): Add new code 'L'.
    	(rtx_equal_p): Support 'L' in the switch statement. Remove dead code
    	in the handling for 'i' and 'n'.