From f1ec5147f5dbed64487903c497484c6556548dd7 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Mon, 9 Jul 2001 07:20:51 -0400 Subject: [PATCH] [multiple changes] Mon Jul 9 06:41:07 2001 Richard Kenner * emit-rtl.c (adjust_address_nv, replace_equiv_address_nv): New fcns. (operand_subword): Use them. (change_address_1): Renamed from change_address; new arg VALIDATE. * expr.h: Reflect above changes; change_address now macro. * alias.c (canon_rtx): Use replace_equiv_address_nv instead of making MEM. * cselib.c (add_mem_for_addr): Likewise. * expr.c (protect_from_queue, emit_move_insn_1): Likewise. * regmove.c (try_apply_stack_adjustment): Likewise. * reload.c (push_reload, make_memloc): Likewise. * reload1.c (eliminate_regs): Likewise. * simplify-rtx.c (simplify_replace_rtx): Likewise. * caller-save.c (setup_save_areas): Use adjust_address_nv instead of adjust_addess. * combine.c (make_extraction, simplify_shift_const): Likewise. (gen_lowpart_for_combine): Likewise. * cse.c (gen_lowpart_if_possible): Likewise. * function.c (fixup_var_refs_1, purge_addressof_1): Likewise. * expr.c (expand_expr, case COMPONENT_REF): Likewise. * optabs.c (gen_move_insn): Likewise. * reload1.c (alter_reg): Likewise. * simplify-rtx.c (simplify_subreg): Likewise. * stmt.c (expand_anon_union_decl): Likewise. * recog.c (validate_replace_rtx_1): Likewise. (expr.h): Include. * Makefile.in (recog.o): Add $(EXPR_H). * explow.c (stabilize): Call replace_equiv_address. * expr.c (move_by_pieces_1, store_by_pieces_2): Likewise. * final.c (alter_subreg): OFFSET is HOST_WIDE_INT. 2001-07-09 Bo Thorsen * config/i386/unix.h (ASM_OUTPUT_MI_THUNK): Fix x86-64 vtable support. 2001-07-09 Neil Booth * final.c (output_addr_const): Use target opening and closing parentheses. * target-def.h: Define TARGET_ASM_OPEN_PAREN, TARGET_ASM_CLOSE_PAREN defaults, add to TARGET_ASM_OUT. * target.h (struct gcc_target): Add open_paren and close_paren. * doc/md.texi: Update. * doc/tm.texi: Document TARGET_ASM_FUNCTION_END_PROLOGUE, TARGET_ASM_FUNCTION_BEGIN_EPILOGUE, TARGET_ASM_OPEN_PAREN and TARGET_ASM_CLOSE_PAREN. * config/i386/i386.c (TARGET_ASM_OPEN_PAREN, TARGET_ASM_CLOSE_PAREN): Override. * config/pdp11/pdp11.c (TARGET_ASM_OPEN_PAREN, TARGET_ASM_CLOSE_PAREN): Override. * config/1750a/1750a.h (ASM_OPEN_PAREN, ASM_CLOSE_PAREN): Remove. * config/a29k/a29k.h: Similarly. * config/alpha/alpha.h: Similarly. * config/arc/arc.h: Similarly. * config/arm/aof.h: Similarly. * config/arm/aout.h: Similarly. * config/avr/avr.h: Similarly. * config/c4x/c4x.h: Similarly. * config/clipper/clipper.h: Similarly. * config/convex/convex.h: Similarly. * config/d30v/d30v.h: Similarly. * config/dsp16xx/dsp16xx.h: Similarly. * config/elxsi/elxsi.h: Similarly. * config/fr30/fr30.h: Similarly. * config/h8300/h8300.h: Similarly. * config/i370/i370.h: Similarly. * config/i386/i386.h: Similarly. * config/i860/i860.h: Similarly. * config/i960/i960.h: Similarly. * config/ia64/ia64.h: Similarly. * config/m32r/m32r.h: Similarly. * config/m68hc11/m68hc11.h: Similarly. * config/m68k/m68k.h: Similarly. * config/m88k/m88k.h: Similarly. * config/mcore/mcore.h: Similarly. * config/mips/mips.h: Similarly. * config/mn10200/mn10200.h: Similarly. * config/mn10300/mn10300.h: Similarly. * config/ns32k/ns32k.h: Similarly. * config/pa/pa.h: Similarly. * config/pdp11/pdp11.h: Similarly. * config/pj/pj.h: Similarly. * config/romp/romp.h: Similarly. * config/rs6000/rs6000.h: Similarly. * config/sh/sh.h: Similarly. * config/sparc/sparc.h: Similarly. * config/v850/v850.h: Similarly. * config/vax/vax.h: Similarly. * config/we32k/we32k.h: Similarly. 2001-07-09 Joseph S. Myers * doc/c-tree.texi: Document representation of attributes. 2001-07-08 Joseph S. Myers * doc/tm.texi: Update some places for the rename of target to targetm. Fix typo. 2001-07-08 Joseph S. Myers * target.h (struct gcc_target): Add insert_attributes. * target-def.h (TARGET_INSERT_ATTRIBUTES): Define. (TARGET_INITIALIZER): Update. * tree.c, tree.h (default_insert_attributes): New function. Update comments on other default functions to refer to targetm, not target. * doc/tm.texi (INSERT_ATTRIBUTES): Update to document TARGET_INSERT_ATTRIBUTES. (SET_DEFAULT_DECL_ATTRIBUTES): Remove. * c-common.c (decl_attributes): Use targetm.insert_attributes. Don't use PRAGMA_INSERT_ATTRIBUTES. * Makefile.in (c-common.o): Depend on $(TARGET_H). * c-decl.c (start_decl, start_function): Don't call SET_DEFAULT_DECL_ATTRIBUTES. * config/c4x/c4x.h (SET_DEFAULT_DECL_ATTRIBUTES): Don't define. * config/c4x/c4x-protos.h (c4x_set_default_attributes): Don't declare. * config/c4x/c4x.c (TARGET_INSERT_ATTRIBUTES): Define. (c4x_check_attribute): Avoid modifying attribute list itself. (c4x_set_default_attributes): Rename to c4x_insert_attributes. Make static. * config/sh/sh.h (PRAGMA_INSERT_ATTRIBUTES): Don't define. * config/sh/sh-protos.h (sh_pragma_insert_attributes): Don't declare. * config/sh/sh.c (TARGET_INSERT_ATTRIBUTES): Define. (sh_pragma_insert_attributes): Rename to sh_insert_attributes. Make static. * config/v850/v850.h (SET_DEFAULT_DECL_ATTRIBUTES): Don't define. * config/v850/v850-protos.h (v850_set_default_decl_attr): Don't declare. * config/v850/v850.c (TARGET_INSERT_ATTRIBUTES): Define. (v850_set_default_decl_attr): Rename to v850_insert_attributes. Adjust parameters. Make static. 2001-07-08 Joseph S. Myers * c-common.c (decl_attributes): Only take a single attributes parameter. * c-common.h (decl_attributes): Update prototype. * c-decl.c (start_decl, start_function): Only take a single attributes parameter. Update calls to decl_attributes. (finish_struct, finish_enum): Update calls to decl_attributes. (push_parm_decl): Expect unified list of attributes. Update call to decl_attributes. * c-parse.in (fndef, initdcl, notype_initdcl, nested_function, notype_nested_function, component_declarator, component_notype_declarator, label): Update calls to decl_attributes. (absdcl_maybe_attribute, parm, firstparm, myparm): Unify attribute lists that are passed to push_parm_decl. * c-tree.h (start_function, start_decl): Update prototypes. * config/sh/sh-protos.h, config/sh/sh.c (sh_pragma_insert_attributes): Only take a single attributes parameter. * config/sh/sh.h (PRAGMA_INSERT_ATTRIBUTES): Likewise. * doc/tm.texi (INSERT_ATTRIBUTES): Update. * objc/objc-act.c (define_decl, generate_objc_symtab_decl, build_module_descriptor, generate_static_references, generate_strings, build_selector_translation_table, generate_descriptor_table, generate_protocols, generate_ivars_list, generate_dispatch_table, generate_protocol_list, generate_category, generate_shared_structures, really_start_method, add_objc_decls, generate_classref_translation_entry): Update calls to start_decl and start_function. (build_tmp_function_decl, start_method_def): Unify attribute lists that are passed to push_parm_decl. 2001-07-08 Neil Booth * final.c (no_asm_to_stream): New. (final_scan_insn): Use target structures for prologue ends and epilogue starts. * output.h (no_asm_to_stream): New. * target-def.h (TARGET_ASM_FUNCTION_END_PROLOGUE, TARGET_ASM_FUNCTION_BEGIN_EPILOGUE): New. (TARGET_ASM_OUT): Update. * target.h (struct gcc_target): New members function_end_prologue and function_begin_epilogue. * config/1750/1750.h (ASM_OUTPUT_FUNNAM): Delete as unused. * config/alpha/alpha-protos.h (output_end_prologue): Delete. * config/alpha/alpha.c (output_end_prologue): Rename to alpha_output_function_end_prologue. Use in target struct and make static. * config/alpha/alpha.h (FUNCTION_END_PROLOGUE): Delete. * config/ia64/ia64-protos.h (ia64_output_end_prologue): Delete. * config/ia64/ia64.c (ia64_output_end_prologue): Rename to ia64_output_function_end_prologue. Use in target struct and make static. (ia64_function_prologue, ia64_funciton_epilogue): Rename mistyped prototypes. * config/ia64/ia64.h (FUNCTION_END_PROLOGUE): Delete. * config/m88k/m88k-protos.h (m88k_end_prologue, m88k_begin_epilogue): Delete. * config/m88k/m88k.c (m88k_end_prologue, m88k_begin_epilogue): Rename an use in target struct, make static. * config/ia64/ia64.h (FUNCTION_END_PROLOGUE, FUNCTION_BEGIN_EPILOGUE): Delete. 2001-07-08 Richard Henderson * stmt.c (emit_case_nodes): Convert modes properly in low+high test. 2001-07-08 Richard Henderson * config/i386/i386.md: Remove constraints strings from define_split and define_peephole2 patterns. (eh_return_si, eh_return_di): Split eh_return_1 for modes. (eh_return): Use them. 2001-07-08 Richard Henderson * doc/tm.texi (Exception Handling): New subnode of Stack and Calling. Document MD_FALLBACK_FRAME_STATE_FOR. 2001-07-07 Stephane Carrez * config/m68hc11/m68hc11.c (m68hc11_initial_elimination_offset): Take into account m68hc11_sp_correction for FRAME_POINTER_REGNUM elimination. * config/m68hc11/m68hc11.h (STARTING_FRAME_OFFSET): Use 0. 2001-07-07 Nick Clifton * config/ia64/sysv4.h (ASM_OUTPUT_LABELREF): Append # to end of the label inside NAME as opposed to just the end of NAME. 2001-07-07 Neil Booth * config/alpha/alpha-protos.h (vms_valid_decl_attribute_p): Delete. * config/alpha/alpha.c (alpha_init_machine_status, alpha_mark_machine_status, alpha_free_machine_status): Delete. (TARGET_VALID_DECL_ATTRIBUTE): Define for VMS. (vms_valid_decl_attribute_p): Make static, conditionally compile. * config/alpha/alpha.h (VALID_MACHINE_DECL_ATTRIBUTE): Delete. 2001-07-06 Stan Shebs * target.h (targetm): Rename global from "target", so as not to conflict with local variables. * c-decl.c: Ditto. * c-typeck.c: Ditto. * final.c: Ditto. * tree.c: Ditto. * cp/decl.c: Ditto. * cp/decl2.c: Ditto. * cp/typeck.c: Ditto. * 1750a/1750a.c: Ditto. * a29k/a29k.c: Ditto. * arc/arc.c: Ditto. * arm/arm.c: Ditto. * avr/avr.c: Ditto. * clipper/clipper.c: Ditto. * convex/convex.c: Ditto. * d30v/d30v.c: Ditto. * dsp16xx/dsp16xx.c: Ditto. * elxsi/elxsi.c: Ditto. * fr30/fr30.c: Ditto. * h8300/h8300.c: Ditto. * i370/i370.c: Ditto. * i386/i386.c: Ditto. * i860/i860.c: Ditto. * i960/i960.c: Ditto. * ia64/ia64.c: Ditto. * m32r/m32r.c: Ditto. * m68hc11/m68hc11.c: Ditto. * m68k/m68k.c: Ditto. * m88k/m88k.c: Ditto. * mips/mips.c: Ditto. * ns32k/ns32k.c: Ditto. * pa/pa.c: Ditto. * pdp11/pdp11.c: Ditto. * romp/romp.c: Ditto. * rs6000/rs6000.c: Ditto. * sh/sh.c: Ditto. * sparc/sparc.c: Ditto. * vax/vax.c: Ditto. * we32k/we32k.c: Ditto. * doc/tm.texi: Update the manual to match. 2001-07-06 Richard Henderson * except.h (MUST_USE_SJLJ_EXCEPTIONS): Examine the value of DWARF2_UNWIND_INFO not just whether it is defined. 2001-07-06 Diego Novillo * combine.c (combine_simplify_rtx): Also recompute 'mode' if the call to simplify_binary_operation returns a new pattern. 2001-07-06 Roman Lechtchinsky * glimits.h (__SHRT_MAX__): New. (SHRT_MIN, USHRT_MAX): Define in terms of SHRT_MAX. (SHRT_MAX): Define in terms of __SHRT_MAX__. 2001-07-06 Jan van Male * alias.c (base_alias_check): Cast GET_MODE_UNIT_SIZE to int to avoid warnings. 2001-07-06 Richard Henderson * bitmap.c (bitmap_release_memory): Move adjacent to the allocation functions. (bitmap_first_set_bit, bitmap_last_set_bit): Streamline knowing the implementation. Binary search for the set bit. (bitmap_union_of_diff): Allocate the temporary on the stack instead of using xmalloc. 2001-07-06 Richard Henderson * genrecog.c (validate_pattern): Warn for constraints in define_{expand,split,peephole2}. Remove strict_low_part before looking up match_dup. 2001-07-06 DJ Delorie * doc/gcc.texi (Makefile): Rename to be a more general purpose chapter about various build hints and history. Add section talking about the various types of native and cross builds. 2001-07-06 Neil Booth * Makefile.in (final.o): Depend on target.h. * final.c: Include target.h. (default_function_pro_epilogue): New. (final_start_function): Use target structure for function prologues. (final_end_function): Use target structure for function epilogues. * fold-const.c (real_hex_to_f): Constify s and p. * output.h (default_function_pro_epilogue): New. * real.h (real_hex_to_f): Update prototype. * target-def.h (TARGET_ASM_FUNCTION_PROLOGUE, TARGET_ASM_FUNCTION_EPILOGUE, TARGET_ASM_OUT): New. (TARGET_INITIALIZER): Update. * target.h (gcc_target): Add struct asm_out. * doc/tm.texi: Update. config: Update each arch to use TARGET_ASM_FUNCTION_PROLOGUE and TARGET_ASM_FUNCTION_EPILOGUE. Move macro code to functions in cpu/cpu.c, or rename old functions consistently. Take a HOST_WIDE INT not an int as the SIZE parameter. Remove now redundant macros and prototypes. Make new functions static. * 1750a/1750a.c: Similarly. * 1750a/1750a.h: Similarly. * a29k/a29k-protos.h: Similarly. * a29k/a29k.c: Similarly. * a29k/a29k.h: Similarly. * arc/arc-protos.h: Similarly. * arc/arc.c: Similarly. * arc/arc.h: Similarly. * arm/arm-protos.h: Similarly. * arm/arm.c: Similarly. * arm/arm.h: Similarly. * avr/avr-protos.h: Similarly. * avr/avr.c: Similarly. * avr/avr.h: Similarly. * clipper/clipper-protos.h: Similarly. * clipper/clipper.c: Similarly. * clipper/clipper.h: Similarly. * convex/convex.c: Similarly. * convex/convex.h: Similarly. * d30v/d30v-protos.h: Similarly. * d30v/d30v.c: Similarly. * d30v/d30v.h: Similarly. * d30v/d30v.md: Similarly. * dsp16xx/dsp16xx-protos.h: Similarly. * dsp16xx/dsp16xx.c: Similarly. * dsp16xx/dsp16xx.h: Similarly. * elxsi/elxsi.c: Similarly. * elxsi/elxsi.h: Similarly. * fr30/fr30.c: Similarly. * fr30/fr30.md: Similarly. * h8300/h8300-protos.h: Similarly. * h8300/h8300.c: Similarly. * h8300/h8300.h: Similarly. * i370/i370-protos.h: Similarly. * i370/i370.c: Similarly. * i370/i370.h: Similarly. * i386/i386.c: Similarly. * i386/osf1elf.h: Similarly. * i386/osfrose.h: Similarly. * i860/i860-protos.h: Similarly. * i860/i860.c: Similarly. * i860/i860.h: Similarly. * i960/i960-protos.h: Similarly. * i960/i960.c: Similarly. * i960/i960.h: Similarly. * ia64/ia64-protos.h: Similarly. * ia64/ia64.c: Similarly. * ia64/ia64.h: Similarly. * m32r/m32r-protos.h: Similarly. * m32r/m32r.c: Similarly. * m32r/m32r.h: Similarly. * m68hc11/m68hc11-protos.h: Similarly. * m68hc11/m68hc11.c: Similarly. * m68hc11/m68hc11.h: Similarly. * m68k/crds.h: Similarly. * m68k/dpx2.h: Similarly. * m68k/m68k-protos.h: Similarly. * m68k/m68k.c: Similarly. * m68k/m68k.h: Similarly. * m68k/news.h: Similarly. * m88k/m88k-protos.h: Similarly. * m88k/m88k.c: Similarly. * m88k/m88k.h: Similarly. * mips/mips-protos.h: Similarly. * mips/mips.c: Similarly. * mips/mips.h: Similarly. * ns32k/merlin.h: Similarly. * ns32k/ns32k.c: Similarly. * ns32k/ns32k.h: Similarly. * ns32k/tek6000.h: Similarly. * pa/pa-protos.h: Similarly. * pa/pa.c: Similarly. * pa/pa.h: Similarly. * pdp11/2bsd.h: Similarly. * pdp11/pdp11-protos.h: Similarly. * pdp11/pdp11.c: Similarly. * pdp11/pdp11.h: Similarly. * romp/romp-protos.h: Similarly. * romp/romp.c: Similarly. * romp/romp.h: Similarly. * rs6000/rs6000-protos.h: Similarly. * rs6000/rs6000.c: Similarly. * rs6000/rs6000.h: Similarly. * rs6000/sysv4.h: Similarly. * sh/sh-protos.h: Similarly. * sh/sh.c: Similarly. * sh/sh.h: Similarly. * sparc/sparc-protos.h: Similarly. * sparc/sparc.c: Similarly. * sparc/sparc.h: Similarly. * vax/vax.c: Similarly. * vax/vax.h: Similarly. * vax/vms.h: Similarly. * we32k/we32k.c: Similarly. * we32k/we32k.h: Similarly. Fri Jul 6 11:47:59 2001 Jeffrey A Law (law@cygnus.com) * 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. 2001-07-06 Zack Weinberg * varray.c (varray_check_failed): Use internal_error. 2001-07-05 Andrew Haley * Makefile.in (LIB2_DIVMOD_FUNCS): New. (LIB2FUNCS): Move divmod functions to LIB2_DIVMOD_FUNCS. * mklibgcc.in: Compile LIB2_DIVMOD_FUNCS. 2001-07-02 Jason Merrill * dwarf2out.c (mem_loc_descriptor): Only look through a constant pool reference if the target constant is also a SYMBOL_REF. 2001-07-05 Eric Christopher * config/mips/mips.h (MASK_MIPS3900): Remove. (MASK_MIPS16,MASK_NO_CHECK_ZERO_DIV,MASK_CHECK_RANGE_DIV, MASK_UNINIT_CONST_IN_RODATA): Change for 3900 mask removal. (TARGET_MIPS3900): Change to use mips_arch. (TARGET_MIPS4000): New. (TARGET_MIPS4100): New. (TARGET_MIPS4300): New. (TARGET_SWITCHES): Change 3900 and 4650 options to NULL. (SUBTARGET_TARGET_OPTIONS): Add -march. Change help text for -mipsX. (GENERATE_BRANCHLIKELY): Move TARGET_MIPS3900. (ISA_HAS_BRANCHLIKELY): To here. (CC1_CPU_SPEC): New. (CC1_SPEC): Use here. Remove 4650 and 3900 options. (mips_arch_string): Declare. (mips_arch): Declare. (TARGET_OPTIONS): Add -march and -mtune. * config/mips/mips.c (mips_arch_string): New. (mips_arch): New. (override_options): Handle -march for codegen and -mtune for scheduling. Use mips_arch. Move tx39 target default here. (mips_parse_cpu): Move error message to override_options. * config/mips/r3900.h (TARGET_DEFAULT): Remove. * config/mips/mips.md: Use TARGET_MIPS4000 and TARGET_MIPS4300. * doc/invoke.texi (Option Summary): Add -march and -mtune entries. (MIPS Options): Ditto. Change mcpu entry to historical text. 2001-07-05 H.J. Lu (hjl@gnu.org) * config/mips/mips.c (mips_parse_cpu): New function to parse -march=*/-mcpu=*. 2001-07-05 Jim Wilson * config/ia64/lib1funcs.asm: Revert 2001-07-02 change. * config/ia64/t-ia64: Likewise. (LIB1ASMFUNCS): Update comment. 2001-07-05 David Edelsohn * doc/install.texi (Install GCC: Binaries): Fix typo. 2001-07-04 Stephane Carrez * config/m68hc11/m68hc11.md ("*ashlsi3"): Operand 1 can be a memory reference using the stack pointer, adjust it since we push Y temporarily. ("*ashrsi3"): Likewise. ("*lshrsi3"): Likewise. 2001-07-05 Stephane Carrez * config/m68hc11/m68hc11.h (RETURN_ADDR_RTX): Fix return address when -fomit-frame-pointer is used. 2001-07-05 Jeffrey Oldham * flow.c: Reverse Jan Hubicka's patch of 02July2001. (try_redirect_by_replacing_jump): Reverse updating properly the count and frequency information. Reverse removing cc0 setter. (forwarder_block_p): Reverse fixing for fallthru blocks. 2001-07-05 DJ Delorie * gcc.c (TARGET_OPTION_TRANSLATE_TABLE): New. (translate_options): If the above is defined, use it to map given options to new options. * doc/tm.texi: Document it. 2001-07-05 Brad Lucier Gerald Pfeifer * doc/invoke.texi (Optimize Options): Document that -fgcse may cause programs using computed gotos to run more slowly. 2001-07-05 Rainer Orth * doc/install.texi (Specific): Markup, spelling and typo fixes. Fixed sorting. Consistently require binutils 2.11.2, not prereleases. (Specific, decstation-*): Canonicalize as mips-dec-*. (Specific, i?86-*-sco3.2v5*): Remove make bootstrap requirement, always necessary. (Specific, m68k-altos): Removed reference to README.altos, deleted. (Specific, mips-*): Reword MIPS C compiler requirements. (Specific, powerpc*-*-*): New, mention --with-cpu once. (Specific, sunv5): Removed, obsolete. 2001-07-05 Nathan Sidwell * dwarf2out.c (output_loc_list): Use an all ones mask for .text asm output and don't rely on long long literals. Reformat some long lines. 2001-07-05 Andreas Jaeger * doc/gcc.texi (GNU/Linux): Remove accidental re-add of GPL section. 2001-07-04 Daniel Berlin * dwarf2out.c (dwarf2out_define): Update comment. (dwarf2out_undef): Ditto. (dwarf2out_start_source_file): Ditto. (dwarf2out_end_source_file): Ditto. (dwarf2out_finish): Output DW_MACINFO_end_file for primary file, since we never call the start/end debug hook for the primary file. 2001-07-04 Kazu Hirata * config/h8300/h8300.c (get_shift_alg): Remove an extra operand from shll. 2001-07-04 Nathan Sidwell * cppinit.c (remove_dup_dirs): Inform if a system include directory is being reordered. * doc/invoke.texi (Directory Options): GCC warns if you hide a system include. * doc/cpp.texi (Search Paths): Likewise. * doc/gcc.texi (Interoperation): Remove information about -I/usr/include. 2001-07-04 Nathan Sidwell * varray.h (VARRAY_TOP_GENERIC_PTR): Remove spurious parameter. (VARRAY_TOP_CHAR_PTR): Likewise. 2001-07-04 Kaveh R. Ghazi * gcc.c (process_command): Don't assign elements of a const char*. Wed Jul 4 13:40:02 2001 Richard Kenner * emit-rtl.c (change_address): Don't abort if invalid address while reload is in progress. 2001-07-04 Daniel Berlin * c-lex.c (cb_file_change): Pass line number to debug_start_source_file. (cb_undefine): Pass correct line number to debug_undef. * toplev.c (debug_start_source_file): Add line number to parameters. Pass it along to dwarf2out_start_source_file. (decode_g_option): Stop resetting debug level back to normal when we change debug formats, unless the current level is none. (Before, -g3 -gdwarf-2 would use debug level 2, rather than 3). * toplev.h (debug_start_source_file): Add line number to parameters. * dwarf2out.h (dwarf2out_start_source_file): Add line number to parameters. * dwarf2out.c (dwarf2out_start_source_file): Add line number to parameters. Output debug_macinfo data for starting file if requested. (dwarf2out_end_source_file): Output debug_macinfo data for ending file if requested. (dwarf2out_define): Output debug_macinfo data for defining a macro if requested. (dwarf2out_undef): Output debug_macinfo data for undefining a macro if requested. (DEBUG_MACINFO_SECTION): New. DWARF2 macro info section name. (DEBUG_MACINFO_SECTION_LABEL): New. DWARF2 macro info section label. (macinfo_section_label): New. DWARF2 macro info section label. (dwarf2out_init): If we want macro info, output the start label for the section. (dwarf2out_finish): If we want macro info, add a DW_AT_macro_info attribute to the compilation unit die pointing to the macro info. 2001-07-04 Daniel Berlin * dwarf2out.c (new_loc_list): Move to inside #ifdef DWARF2_DEBUGGING_INFO. (add_loc_descr_to_loc_list): Ditto. (output_loc_list): Ditto. Also, fix thinko in curr not being initialized. (gen_internal_sym): Ditto. Wed Jul 4 13:40:02 2001 Richard Kenner * emit-rtl.c (replace_equiv_address): New function. * expr.h (replace_equiv_address): New declaration. * explow.c (validize_mem): Call it instead of change_address and also call if -fforce-addr and address is constant. * expr.c: Replace more calls to change_address with adjust_address and/or replace_equiv_address or to validize_mem. * function.c, regmove.c, config/alpha/alpha.c: Likewise. * config/arm/arm.md, config/clipper/clipper.md: Likewise. * config/dsp16xx/dsp16xx.md, config/fr30/fr30.c: Likewise. * config/i370/i370.md, config/i860/i860.md: Likewise. * config/i960/i960.md, config/mips/mips.c: Likewise. * config/mips/mips.md, config/pa/pa.md: Likewise. * config/pdp11/pdp11.md, config/rs6000/rs6000.c: Likewise. * config/rs6000/rs6000.md, config/sh/sh.md: Likewise. 2001-07-04 Kaveh R. Ghazi * bitmap.c (bitmap_union_of_diff): Don't use BITMAP_ALLOCA. * bitmap.h (BITMAP_ALLOCA): Don't pass alloca as an argument to a function. 2001-07-04 Joseph S. Myers * doc/include: New directory. * doc/fdl.texi: Move to doc/include/fdl.texi. * doc/texinfo.tex: Move to doc/include/texinfo.tex. * doc/include/funding.texi, doc/include/gpl.texi: New files. * doc/gcc.texi: Use funding.texi and gpl.texi. * Makefile.in ($(docdir)/cpp.info, $(docdir)/gcc.info, $(docdir)/cppinternals.info, cpp.dvi. gcc.dvi. cppinternals.dvi): Update dependencies and use -I $(docdir)/include. 2001-07-04 Anthony Green * config/v850/t-v850 (v850-c.o): Add missing dependencies. 2001-07-04 Gerald Pfeifer * doc/install.texi (sparc64-*-*): Remove garbage. Wed Jul 4 09:07:44 2001 Jan van Male * i386.c (ix86_expand_builtin, case IX86_BUILTIN_SETPS): Fix typo in last change to use adjust_address. 2001-07-04 Gerald Pfeifer * doc/install.texi (Specific): Update information for *-*-solaris*. Tue Jul 3 22:33:15 2001 Richard Kenner * explow.c (plus_constant_wide): Reinitialize Y for restart. 2001-07-03 Stan Shebs * config/darwin.h (SECTION_FUNCTION): Remove WAS_TEXT argument, remove case for flag_no_mach_text_sections. (EXTRA_SECTION_FUNCTIONS): Remove arg from uses of SECTION_FUNCTION. * config/darwin.c (flag_no_mach_text_sections): Remove. * config/darwin-protos.h (darwin_init_pragma): Remove decl. Tue Jul 3 15:35:52 2001 Richard Kenner * explow.c (plus_constant_wide, case PLUS): Call find_constant_term and avoid checking for constant as first operand. * recog.c (find_constant_term_loc): No longer static. (adj_offettable_operand): Delete. * rtl.h (adj_offsettable_operand): Delete declaration. (find_constant_term): Add declaration. * caller-save.c: Replace calls to adj_offsettable_operand with calls to adjust_address. * config/arm/arm.c, config/c4x/c4x.c: Likewise. * config/clipper/clipper.md, config/h8300/h8300.c: Likewise. * config/i386/i386.c, config/i386/i386.md: Likewise. * config/i860/i860.c, config/i960/i960.c: Likewise. * config/i960/i960.md, config/m68hc11/m68hc11.c: Likewise. * config/m68k/m68k.c, config/m68k/m68k.md: Likewise. * config/m88k/m88k.md, config/mcore/mcore.c: Likewise. * config/mips/mips.c, config/mips/mips.md: Likewise. * config/mn10200/mn10200.c, config/mn10300/mn10300.c: Likewise. * config/ns32k/ns32k.c, config/ns32k/ns32k.md: Likewise. * config/pa/pa.c, config/pdp11/pdp11.c: Likewise. * config/pdp11/pdp11.md, config/sh/sh.c, config/v850/v850.c: Likewise. * config/vax/vax.md, config/ns32k/ns32k.c: Likewise. * config/ns32k/ns32k.md: Likewise. 2001-07-03 Zack Weinberg * rtl.c (copy_rtx): Handle 'T' format letter. * gensupport.c (collect_insn_data): Likewise. * print-rtl.c (print_rtx): Print 'T' slots like 's'. 2001-07-03 Nick Clifton * doc/invoke.texi (Directory Options): Specifiy range for in -B option. Use 'dir' not 'foo' as example directory name. 2001-07-03 Rainer Orth * config/i386/sol2.h (ASM_PREFERRED_EH_DATA_FORMAT): Define. Fixes PRs bootstrap/3067, bootstrap/3249, bootstrap/3275. 2001-07-03 Joseph S. Myers * doc/cppinternals.texi: Improve formatting and logical markup. 2001-07-03 Andreas Jaeger * Makefile.in (insn-recog.o): Add dependency on reload.h. * genrecog.c (write_header): Include reload.h for prototypes in insn-recog.c. 2001-07-03 Neil Booth config: * i386/cygwin.h (VALID_MACHINE_DECL_ATTRIBUTE, VALID_MACHINE_TYPE_ATTRIBUTE): Remove. * i386/i386-protos.h (i386_pe_valid_decl_attribute_p, i386_pe_valid_type_attribute_p): Add. * i386/i386.c (TARGET_INITIALIZER): Override for cygwin targets. * i386/winnt.c (i386_valid_decl_attribute_p): Return directly. Mon Jul 2 21:52:19 2001 Richard Kenner * explow.c (plus_constant_wide, case LO_SUM): New case. (plus_constant_for_output_wide): Delete. * rtl.h (plus_constant_for_output): Delete. * alias.c (canon_rtx, init_alias_analysis): Call plus_constant instead of plus_constant_for_output. * recog.c (offsettable_address_p, adj_offsettable_operand): Likewise. * config/darwin.c, config/arm/arm.c, config/m68k/m68k.c: Likewise. * config/m88k/m88k.c, config/mips/mips.c, config/pa/pa.c: Likewise. * config/rs6000/rs6000.c, config/sparc/sparc.c: Likewise. * config/sparc/sparc.md: Likewise. Convert some change_address calls to adjust_address. 2001-07-03 Joseph S. Myers * doc/extend.texi, doc/gcc.texi, doc/invoke.texi, doc/md.texi, doc/rtl.texi, doc/tm.texi: Improve formatting. Improve documentation of -std and -Wwrite-strings. 2001-07-02 Geoffrey Keating * cse.c (canon_hash): Don't register registers in very small register classes, as extending their lifetime might cause reload to fail. Mon Jul 2 23:14:00 CEST 2001 Jan Hubicka * flow.c (try_redirect_by_replacing_jump): Remove cc0 setter. * flow.c (forwarder_block_p): Fix for fallthru blocks. (try_redirect_by_replacing_jump): Update properly the count and frequency information. Mon Jul 2 14:20:13 2001 Jeffrey A Law (law@cygnus.com) * toplev.c (dump_file_index): Move SSA dumps just after first jump dump. (dump_file): Corresponding changes. (rest_of_compilation): Move SSA path to just after the first jump pass. * doc/gcc.texi (Passes): Update due to movement of SSA path. * doc/invoke.texi: Update dump file #s as they were completely out of date with reality. 2001-07-02 Geoffrey Keating * doc/tm.texi (Frame Layout): Document STACK_PUSH_CODE. * expr.c (emit_move_insn_1): Deal with non-default STACK_PUSH_CODE. * expr.c (emit_single_push_insn): Fix warning. 2001-07-02 Toshiyasu Morita * expr.c (emit_move_insn_1): Avoid modifying cfun->expr->x_stack_pointer when PUSH_ROUNDING is defined. Mon Jul 2 15:33:31 2001 Richard Kenner * emit-rtl.c (adjust_address): New function. * expr.h (adjust_address): Add declaration. * builtins.c: Replace some calls to change_address with calls to it or to validize_mem. * caller-save.c, dwarf2out.c, except.c, expmed.c, expr.c: Likewise. * function.c, config/a29k/a29k.md, config/alpha/alpha.c: Likewise. * config/arm/arm.c, config/convex/convex.c: Likewise. * config/dsp16xx/dsp16xx.md, config/fr30/fr30.c: Likewise. * config/i386/i386.c, config/i386/i386.md: Likewise. * config/ia64/ia64.c, config/ia64/ia64.md: Likewise. * config/m32r/m32r.c, config/m68k/m68k.md: Likewise. * config/m88k/m88k.c, config/mips/mips.md: Likewise. * config/ns32k/ns32k.c, config/rs6000/rs6000.c: Likewise. * config/sh/sh.c, config/sparc/sparc.md: Likewise. 2001-07-02 Jim Wilson * config/ia64/ia64.h: Delete obsolete lib1funcs.asm comment. 2001-07-02 Steve Ellcey * config/ia64/t-ia64: Change LIB1ASMFUNCS to use single underscore. * config/ia64/lib1funcs.asm: Change macro names to match t-ia64. 2001-07-02 Zack Weinberg * cppinit.c (lang_defaults): New table. (set_lang): Just read from lang_defaults into the live options structure. 2001-07-02 Zack Weinberg * Makefile.in (doc): Depend on $(GENERATED_MANPAGES). * doc/.cvsignore: Add gcc.1, cpp.1, gcov.1. * doc/gcc.1, doc/cpp.1, doc/gcov.1: Removed. 2001-07-02 Rainer Orth * doc/install.texi: Various spelling and markup fixes. (Installing GCC): Component specific installation instructions are gone. Fix reference. Warn about removing old install dir in the presence of shared libs. (Configuration): Invoke with options target to match configure --help. Consistently refer to gas, gld pathnames. Invert --enable-multilib documentation. Remove references to old compiler versions. Mon Jul 2 12:50:51 2001 Richard Kenner * flow.c (try_simplify_condjump): Fix typo in updating fallthru flags. 2001-07-02 Rainer Orth * doc/install.texi (Specific, mips*-sgi-irix4): Split from IRIX 5 section. (Specific, mips*-sgi-irix5): Note IDO download. Reworded MIPS C hints. Use GNU as instead of GAS. Markup fixes. Removed SGI Freeware reference, IRIX 6 only. (Specific, mips*-sgi-irix6): Removed ranlib caveats, obsolete. Note N64 library requirement/workaround. Update O32 hints. Complete list of structure passing bug victims. 2001-07-02 Gerald Pfeifer * doc/install.texi: Remove CVS Id. 2001-07-02 Andreas Jaeger * ssa-dce.c (note_inherently_necessary_set): Add unused attribute. (find_inherently_necessary): Remove unused variable. 2001-07-02 Nathan Sidwell * c-common.h (TDI_inlined): New ast dump phase. (dump_flag_name): New function. * c-dump.c (dump_files): Add inlined phase. (dump_flag_name): Define. * doc/invoke.texi (-fdump-ast-inlined): Document. Mon Jul 2 06:29:36 2001 Richard Kenner * stor-layout.c (layout_decl): Revert change to handling of alignment in packed types. Sun Jul 1 11:53:52 2001 Richard Kenner * c-common.c (decl_attributes, case A_MODE): Don't call layout_decl for FIELD_DECL. 2001-07-01 Geoffrey Keating * doc/tm.texi (FUNCTION_ARG): Document that the last call is special. 2001-07-01 Nathan Sidwell * tlink.c (recompile_files): Remove COMPILER_PATH and LIBRARY_PATH from the environment. 2001-07-01 Zack Weinberg * c-common.h (enum rid): Add RID_FIRST_AT, RID_LAST_AT, RID_LAST_PQ. Move RID_FIRST_PQ down with the other FIRST/LAST enumerators. (OBJC_IS_AT_KEYWORD, OBJC_IS_PQ_KEYWORD): New macros. * c-parse.in (OBJC_STRING): Kill. (objc_string): Decompose to [objc_string] '@' STRING. (reswords): Take the leading '@' off all the Objective C keywords. (objc_rid_sans_at): Kill. (init_reswords): Don't initialize it. (yylexname): Use OBJC_IS_AT_KEYWORD and OBJC_IS_PQ_KEYWORD. (_yylex): Kill reconsider label. Look ahead one token after an '@'; if we get an identifier, check whether it's an Objective C @-keyword. If so, return the keyword. Otherwise, put back the token and return the '@' as a terminal. * cpplib.c (lex_macro_node): Remove unnecessary check for leading '@' on identifier. Clarify control flow and commentary. Sun Jul 1 11:53:52 2001 Richard Kenner * cse.c (new_label_ref): Variable deleted. (insert): Remove set of new_label_ref. (check_for_label_ref): New function. (cse_basic_block): Don't check new_label_ref; call check_for_label_ref. See ChangeLog.5 for earlier changes. From-SVN: r43861 --- gcc/Makefile.in | 4 +-- gcc/alias.c | 11 +------ gcc/caller-save.c | 5 ++-- gcc/combine.c | 31 +++++++------------ gcc/cse.c | 15 +++++----- gcc/cselib.c | 8 ++--- gcc/emit-rtl.c | 74 +++++++++++++++++++++++++++++----------------- gcc/explow.c | 16 +++------- gcc/expr.c | 49 ++++++++++-------------------- gcc/expr.h | 15 ++++++++-- gcc/final.c | 2 +- gcc/function.c | 16 ++-------- gcc/optabs.c | 6 ++-- gcc/recog.c | 6 ++-- gcc/regmove.c | 13 ++++---- gcc/reload.c | 32 ++++++++------------ gcc/reload1.c | 21 ++++--------- gcc/simplify-rtx.c | 28 ++++-------------- gcc/stmt.c | 6 +--- 19 files changed, 142 insertions(+), 216 deletions(-) diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 846ddea834e..0cffa257c46 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1520,8 +1520,8 @@ final.o : final.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) flags.h intl.h \ xcoffout.h toplev.h reload.h dwarfout.h dwarf2out.h sdbout.h \ dbxout.h $(BASIC_BLOCK_H) $(TM_P_H) $(TARGET_H) recog.o : recog.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) function.h $(BASIC_BLOCK_H) \ - $(REGS_H) $(RECOG_H) hard-reg-set.h flags.h insn-config.h $(INSN_ATTR_H) \ - real.h toplev.h output.h reload.h $(TM_P_H) + $(REGS_H) $(RECOG_H) $(EXPR_H) hard-reg-set.h flags.h insn-config.h \ + $(INSN_ATTR_H) real.h toplev.h output.h reload.h $(TM_P_H) reg-stack.o : reg-stack.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) $(RECOG_H) \ $(REGS_H) hard-reg-set.h flags.h insn-config.h toplev.h reload.h \ varray.h function.h $(TM_P_H) diff --git a/gcc/alias.c b/gcc/alias.c index cacbf628e6c..3802e670fe1 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -972,17 +972,8 @@ canon_rtx (x) MEM alone, but need to return the canonicalized MEM with all the flags with their original values. */ else if (GET_CODE (x) == MEM) - { - rtx addr = canon_rtx (XEXP (x, 0)); - - if (addr != XEXP (x, 0)) - { - rtx new = gen_rtx_MEM (GET_MODE (x), addr); + x = replace_equiv_address_nv (x, canon_rtx (XEXP (x, 0))); - MEM_COPY_ATTRIBUTES (new, x); - x = new; - } - } return x; } diff --git a/gcc/caller-save.c b/gcc/caller-save.c index 1b5b4d93c6c..ae888fb9809 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -332,8 +332,9 @@ setup_save_areas () /* This should not depend on WORDS_BIG_ENDIAN. The order of words in regs is the same as in memory. */ regno_save_mem[i + k][1] - = adjust_address (regno_save_mem[i][j], regno_save_mode[i + k][1], - k * UNITS_PER_WORD); + = adjust_address_nv (regno_save_mem[i][j], + regno_save_mode[i + k][1], + k * UNITS_PER_WORD); } /* Now loop again and set the alias set of any save areas we made to diff --git a/gcc/combine.c b/gcc/combine.c index 2e41a2343de..84e4935a20e 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -5889,15 +5889,15 @@ make_extraction (mode, inner, pos, pos_rtx, len, if (GET_CODE (inner) == MEM) { - int offset; + HOST_WIDE_INT offset; + /* POS counts from lsb, but make OFFSET count in memory order. */ if (BYTES_BIG_ENDIAN) offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT; else offset = pos / BITS_PER_UNIT; - new = gen_rtx_MEM (tmode, plus_constant (XEXP (inner, 0), offset)); - MEM_COPY_ATTRIBUTES (new, inner); + new = adjust_address_nv (inner, tmode, offset); } else if (GET_CODE (inner) == REG) { @@ -5905,7 +5905,7 @@ make_extraction (mode, inner, pos, pos_rtx, len, a SUBREG and it would sometimes return a new hard register. */ if (tmode != inner_mode) { - int final_word = pos / BITS_PER_WORD; + HOST_WIDE_INT final_word = pos / BITS_PER_WORD; if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD) @@ -6125,13 +6125,7 @@ make_extraction (mode, inner, pos, pos_rtx, len, - GET_MODE_SIZE (wanted_inner_mode) - offset); if (offset != 0 || inner_mode != wanted_inner_mode) - { - rtx newmem = gen_rtx_MEM (wanted_inner_mode, - plus_constant (XEXP (inner, 0), offset)); - - MEM_COPY_ATTRIBUTES (newmem, inner); - inner = newmem; - } + inner = adjust_address_nv (inner, wanted_inner_mode, offset); } /* If INNER is not memory, we can always get it into the proper mode. If we @@ -8976,14 +8970,10 @@ simplify_shift_const (x, code, result_mode, varop, input_count) && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count, MODE_INT, 1)) != BLKmode) { - if (BYTES_BIG_ENDIAN) - new = gen_rtx_MEM (tmode, XEXP (varop, 0)); - else - new = gen_rtx_MEM (tmode, - plus_constant (XEXP (varop, 0), - count / BITS_PER_UNIT)); + new = adjust_address_nv (varop, tmode, + BYTES_BIG_ENDIAN ? 0 + : count / BITS_PER_UNIT); - MEM_COPY_ATTRIBUTES (new, varop); varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND : ZERO_EXTEND, mode, new); count = 0; @@ -9749,9 +9739,8 @@ gen_lowpart_for_combine (mode, x) offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); } - new = gen_rtx_MEM (mode, plus_constant (XEXP (x, 0), offset)); - MEM_COPY_ATTRIBUTES (new, x); - return new; + + return adjust_address_nv (x, mode, offset); } /* If X is a comparison operator, rewrite it in a new mode. This diff --git a/gcc/cse.c b/gcc/cse.c index 87694a14147..bc86cdc954c 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -4382,16 +4382,15 @@ gen_lowpart_if_possible (mode, x) offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)); if (BYTES_BIG_ENDIAN) - { - /* Adjust the address so that the address-after-the-data is - unchanged. */ - offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) - - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); - } - new = gen_rtx_MEM (mode, plus_constant (XEXP (x, 0), offset)); + /* Adjust the address so that the address-after-the-data is + unchanged. */ + offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) + - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); + + new = adjust_address_nv (x, mode, offset); if (! memory_address_p (mode, XEXP (new, 0))) return 0; - MEM_COPY_ATTRIBUTES (new, x); + return new; } else diff --git a/gcc/cselib.c b/gcc/cselib.c index 1cc4a74a48b..252d68eb691 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -706,7 +706,6 @@ add_mem_for_addr (addr_elt, mem_elt, x) cselib_val *addr_elt, *mem_elt; rtx x; { - rtx new; struct elt_loc_list *l; /* Avoid duplicates. */ @@ -715,11 +714,10 @@ add_mem_for_addr (addr_elt, mem_elt, x) && CSELIB_VAL_PTR (XEXP (l->loc, 0)) == addr_elt) return; - new = gen_rtx_MEM (GET_MODE (x), addr_elt->u.val_rtx); - MEM_COPY_ATTRIBUTES (new, x); - addr_elt->addr_list = new_elt_list (addr_elt->addr_list, mem_elt); - mem_elt->locs = new_elt_loc_list (mem_elt->locs, new); + mem_elt->locs + = new_elt_loc_list (mem_elt->locs, + replace_equiv_address_nv (x, addr_elt->u.val_rtx)); } /* Subroutine of cselib_lookup. Return a value for X, which is a MEM rtx. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 107e75d4cd0..3a96906424e 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1474,23 +1474,18 @@ operand_subword (op, offset, validate_address, mode) /* Form a new MEM at the requested address. */ if (GET_CODE (op) == MEM) { - rtx addr = plus_constant (XEXP (op, 0), (offset * UNITS_PER_WORD)); - rtx new; + rtx new = adjust_address_nv (op, word_mode, offset * UNITS_PER_WORD); - if (validate_address) + if (! validate_address) + return new; + + else if (reload_completed) { - if (reload_completed) - { - if (! strict_memory_address_p (word_mode, addr)) - return 0; - } - else - addr = memory_address (word_mode, addr); + if (! strict_memory_address_p (word_mode, XEXP (new, 0))) + return 0; } - - new = gen_rtx_MEM (word_mode, addr); - MEM_COPY_ATTRIBUTES (new, op); - return new; + else + return replace_equiv_address (new, XEXP (new, 0)); } /* Rest can be handled by simplify_subreg. */ @@ -1567,13 +1562,16 @@ reverse_comparison (insn) /* 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.) */ + NULL for ADDR means don't change the address.) + VALIDATE is nonzero if the returned memory location is required to be + valid. */ rtx -change_address (memref, mode, addr) +change_address_1 (memref, mode, addr, validate) rtx memref; enum machine_mode mode; rtx addr; + int validate; { rtx new; @@ -1584,19 +1582,16 @@ change_address (memref, mode, addr) if (addr == 0) addr = XEXP (memref, 0); - /* If reload is in progress, don't check for validity of the address since we - assume the caller knows what they are doing. If reload has completed, the - address must be valid. Otherwise, we call memory_address to make it - valid. */ - if (reload_in_progress) - ; - else if (reload_completed) + if (validate) { - if (! memory_address_p (mode, addr)) - abort (); + if (reload_in_progress || reload_completed) + { + if (! memory_address_p (mode, addr)) + abort (); + } + else + addr = memory_address (mode, addr); } - else - addr = memory_address (mode, addr); if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref)) return memref; @@ -1621,6 +1616,20 @@ adjust_address (memref, mode, offset) change_address (memref, mode, plus_constant (XEXP (memref, 0), offset)); } +/* Likewise, but the reference is not required to be valid. */ + +rtx +adjust_address_nv (memref, mode, offset) + rtx memref; + enum machine_mode mode; + HOST_WIDE_INT offset; +{ + /* For now, this is just a wrapper for change_address, but eventually + will do memref tracking. */ + return change_address_1 (memref, mode, + plus_constant (XEXP (memref, 0), offset), 0); +} + /* 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 @@ -1635,6 +1644,17 @@ replace_equiv_address (memref, addr) will do memref tracking. */ return change_address (memref, VOIDmode, addr); } +/* Likewise, but the reference is not required to be valid. */ + +rtx +replace_equiv_address_nv (memref, addr) + rtx memref; + rtx addr; +{ + /* For now, this is just a wrapper for change_address, but eventually + will do memref tracking. */ + return change_address_1 (memref, VOIDmode, addr, 0); +} /* Return a newly created CODE_LABEL rtx with a unique label number. */ diff --git a/gcc/explow.c b/gcc/explow.c index 68394598271..f7e00be1ce9 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -715,21 +715,13 @@ rtx stabilize (x) rtx x; { - register rtx addr; - if (GET_CODE (x) != MEM) + if (GET_CODE (x) != MEM + || ! rtx_unstable_p (XEXP (x, 0))) return x; - addr = XEXP (x, 0); - if (rtx_unstable_p (addr)) - { - rtx temp = force_reg (Pmode, copy_all_regs (addr)); - rtx mem = gen_rtx_MEM (GET_MODE (x), temp); - - MEM_COPY_ATTRIBUTES (mem, x); - return mem; - } - return x; + return + replace_equiv_address (x, force_reg (Pmode, copy_all_regs (XEXP (x, 0)))); } /* Copy the value or contents of X to a new temp reg and return that reg. */ diff --git a/gcc/expr.c b/gcc/expr.c index 3264aca2080..9be312b9f43 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -384,23 +384,23 @@ protect_from_queue (x, modify) if (code == MEM && GET_MODE (x) != BLKmode && GET_CODE (XEXP (x, 0)) == QUEUED && !modify) { - register rtx y = XEXP (x, 0); - register rtx new = gen_rtx_MEM (GET_MODE (x), QUEUED_VAR (y)); - - MEM_COPY_ATTRIBUTES (new, x); + rtx y = XEXP (x, 0); + rtx new = replace_equiv_address_nv (x, QUEUED_VAR (y)); if (QUEUED_INSN (y)) { - register rtx temp = gen_reg_rtx (GET_MODE (new)); + rtx temp = gen_reg_rtx (GET_MODE (x)); + emit_insn_before (gen_move_insn (temp, new), QUEUED_INSN (y)); return temp; } + /* Copy the address into a pseudo, so that the returned value remains correct across calls to emit_queue. */ - XEXP (new, 0) = copy_to_reg (XEXP (new, 0)); - return new; + return replace_equiv_address (new, copy_to_reg (XEXP (new, 0))); } + /* Otherwise, recursively protect the subexpressions of all the kinds of rtx's that can contain a QUEUED. */ if (code == MEM) @@ -1577,8 +1577,8 @@ move_by_pieces_1 (genfun, mode, data) { if (data->autinc_to) { - to1 = gen_rtx_MEM (mode, data->to_addr); - MEM_COPY_ATTRIBUTES (to1, data->to); + to1 = replace_equiv_address (data->to, data->to_addr); + to1 = adjust_address (to1, mode, 0); } else to1 = adjust_address (data->to, mode, data->offset); @@ -1586,8 +1586,8 @@ move_by_pieces_1 (genfun, mode, data) if (data->autinc_from) { - from1 = gen_rtx_MEM (mode, data->from_addr); - MEM_COPY_ATTRIBUTES (from1, data->from); + from1 = replace_equiv_address (data->from, data->from_addr); + from1 = adjust_address (from1, mode, 0); } else from1 = adjust_address (data->from, mode, data->offset); @@ -2508,8 +2508,8 @@ store_by_pieces_2 (genfun, mode, data) if (data->autinc_to) { - to1 = gen_rtx_MEM (mode, data->to_addr); - MEM_COPY_ATTRIBUTES (to1, data->to); + to1 = replace_equiv_address (data->to, data->to_addr); + to1 = adjust_address (to1, mode, 0); } else to1 = adjust_address (data->to, mode, data->offset); @@ -3003,20 +3003,10 @@ emit_move_insn_1 (x, y) is scheduled for replacement. */ if (reload_in_progress && GET_CODE (x) == MEM && (inner = find_replacement (&XEXP (x, 0))) != XEXP (x, 0)) - { - rtx new = gen_rtx_MEM (GET_MODE (x), inner); - - MEM_COPY_ATTRIBUTES (new, x); - x = new; - } + x = replace_equiv_address_nv (x, inner); if (reload_in_progress && GET_CODE (y) == MEM && (inner = find_replacement (&XEXP (y, 0))) != XEXP (y, 0)) - { - rtx new = gen_rtx_MEM (GET_MODE (y), inner); - - MEM_COPY_ATTRIBUTES (new, y); - y = new; - } + y = replace_equiv_address_nv (y, inner); start_sequence (); @@ -7241,14 +7231,7 @@ expand_expr (exp, target, tmode, modifier) /* Get a reference to just this component. */ if (modifier == EXPAND_CONST_ADDRESS || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER) - { - rtx new = gen_rtx_MEM (mode1, - plus_constant (XEXP (op0, 0), - (bitpos / BITS_PER_UNIT))); - - MEM_COPY_ATTRIBUTES (new, op0); - op0 = new; - } + op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT); else op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT); diff --git a/gcc/expr.h b/gcc/expr.h index 0e8f875113b..4808dc342c0 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -1147,19 +1147,30 @@ extern rtx memory_address_noforce PARAMS ((enum machine_mode, rtx)); /* 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.) */ -extern rtx change_address PARAMS ((rtx, enum machine_mode, rtx)); + NULL for ADDR means don't change the address.) + VALIDATE is nonzero if the returned memory location is required to be + valid. */ +extern rtx change_address_1 PARAMS ((rtx, enum machine_mode, rtx, int)); + +#define change_address(MEMREF, MODE, ADDR) \ + change_address_1 (MEMREF, MODE, ADDR, 1) /* Return a memory reference like MEMREF, but with its mode changed to MODE and its address offset by OFFSET bytes. */ extern rtx adjust_address PARAMS ((rtx, enum machine_mode, HOST_WIDE_INT)); +/* Likewise, but the reference is not required to be valid. */ +extern rtx adjust_address_nv PARAMS ((rtx, enum machine_mode, HOST_WIDE_INT)); + /* 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. */ extern rtx replace_equiv_address PARAMS ((rtx, rtx)); +/* Likewise, but the reference is not required to be valid. */ +extern rtx replace_equiv_address_nv PARAMS ((rtx, rtx)); + /* Return a memory reference like MEMREF, but which is known to have a valid address. */ extern rtx validize_mem PARAMS ((rtx)); diff --git a/gcc/final.c b/gcc/final.c index 4efbfcbef23..f257ea94095 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -3093,7 +3093,7 @@ alter_subreg (x) } else if (GET_CODE (y) == MEM) { - register int offset = SUBREG_BYTE (x); + HOST_WIDE_INT offset = SUBREG_BYTE (x); /* Catch these instead of generating incorrect code. */ if ((offset % GET_MODE_SIZE (GET_MODE (x))) != 0) diff --git a/gcc/function.c b/gcc/function.c index 4e0c4f8c265..4019bb69a17 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2094,9 +2094,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements) pos %= GET_MODE_BITSIZE (wanted_mode); - newmem = gen_rtx_MEM (wanted_mode, - plus_constant (XEXP (tem, 0), offset)); - MEM_COPY_ATTRIBUTES (newmem, tem); + newmem = adjust_address_nv (tem, wanted_mode, offset); /* Make the change and see if the insn remains valid. */ INSN_CODE (insn) = -1; @@ -2284,10 +2282,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements) pos %= GET_MODE_BITSIZE (wanted_mode); - newmem = gen_rtx_MEM (wanted_mode, - plus_constant (XEXP (tem, 0), - offset)); - MEM_COPY_ATTRIBUTES (newmem, tem); + newmem = adjust_address_nv (tem, wanted_mode, offset); /* Make the change and see if the insn remains valid. */ INSN_CODE (insn) = -1; @@ -3027,14 +3022,9 @@ purge_addressof_1 (loc, insn, force, store, ht) else if (code == MEM && GET_CODE (XEXP (x, 0)) == ADDRESSOF && ! force) { rtx sub = XEXP (XEXP (x, 0), 0); - rtx sub2; if (GET_CODE (sub) == MEM) - { - sub2 = gen_rtx_MEM (GET_MODE (x), copy_rtx (XEXP (sub, 0))); - MEM_COPY_ATTRIBUTES (sub2, sub); - sub = sub2; - } + sub = adjust_address_nv (sub, GET_MODE (x), 0); else if (GET_CODE (sub) == REG && (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode)) ; diff --git a/gcc/optabs.c b/gcc/optabs.c index a3e2682a658..16e1b08d87c 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -3846,16 +3846,14 @@ gen_move_insn (x, y) x = gen_lowpart_common (tmode, x1); if (x == 0 && GET_CODE (x1) == MEM) { - x = gen_rtx_MEM (tmode, XEXP (x1, 0)); - MEM_COPY_ATTRIBUTES (x, x1); + x = adjust_address_nv (x1, tmode, 0); copy_replacements (x1, x); } y = gen_lowpart_common (tmode, y1); if (y == 0 && GET_CODE (y1) == MEM) { - y = gen_rtx_MEM (tmode, XEXP (y1, 0)); - MEM_COPY_ATTRIBUTES (y, y1); + y = adjust_address_nv (y1, tmode, 0); copy_replacements (y1, y); } } diff --git a/gcc/recog.c b/gcc/recog.c index e3472a53aea..01bc1f3a373 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -29,6 +29,7 @@ Boston, MA 02111-1307, USA. */ #include "hard-reg-set.h" #include "recog.h" #include "regs.h" +#include "expr.h" #include "function.h" #include "flags.h" #include "real.h" @@ -597,10 +598,7 @@ validate_replace_rtx_1 (loc, from, to, object) pos %= GET_MODE_BITSIZE (wanted_mode); - newmem = gen_rtx_MEM (wanted_mode, - plus_constant (XEXP (XEXP (x, 0), 0), - offset)); - MEM_COPY_ATTRIBUTES (newmem, XEXP (x, 0)); + newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset); validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1); validate_change (object, &XEXP (x, 0), newmem, 1); diff --git a/gcc/regmove.c b/gcc/regmove.c index 5d3f18eba84..faff2e4589a 100644 --- a/gcc/regmove.c +++ b/gcc/regmove.c @@ -2260,14 +2260,11 @@ try_apply_stack_adjustment (insn, memlist, new_adjust, delta) validate_change (insn, &XEXP (SET_SRC (set), 1), GEN_INT (new_adjust), 1); for (ml = memlist; ml ; ml = ml->next) - { - HOST_WIDE_INT c = ml->sp_offset - delta; - rtx new = gen_rtx_MEM (GET_MODE (*ml->mem), - plus_constant (stack_pointer_rtx, c)); - - MEM_COPY_ATTRIBUTES (new, *ml->mem); - validate_change (ml->insn, ml->mem, new, 1); - } + validate_change + (ml->insn, ml->mem, + replace_equiv_address_nv (*ml->mem, + plus_constant (stack_pointer_rtx, + ml->sp_offset - delta)), 1); if (apply_change_group ()) { diff --git a/gcc/reload.c b/gcc/reload.c index a05c52a833a..adafd1a477e 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -893,25 +893,18 @@ push_reload (in, out, inloc, outloc, class, /* If we have a read-write operand with an address side-effect, change either IN or OUT so the side-effect happens only once. */ if (in != 0 && out != 0 && GET_CODE (in) == MEM && rtx_equal_p (in, out)) - { - if (GET_CODE (XEXP (in, 0)) == POST_INC - || GET_CODE (XEXP (in, 0)) == POST_DEC - || GET_CODE (XEXP (in, 0)) == POST_MODIFY) - { - rtx new = gen_rtx_MEM (GET_MODE (in), XEXP (XEXP (in, 0), 0)); + switch (GET_CODE (XEXP (in, 0))) + { + case POST_INC: case POST_DEC: case POST_MODIFY: + in = replace_equiv_address_nv (in, XEXP (XEXP (in, 0), 0)); + break; - MEM_COPY_ATTRIBUTES (new, in); - in = new; - } - if (GET_CODE (XEXP (in, 0)) == PRE_INC - || GET_CODE (XEXP (in, 0)) == PRE_DEC - || GET_CODE (XEXP (in, 0)) == PRE_MODIFY) - { - rtx new = gen_rtx_MEM (GET_MODE (out), XEXP (XEXP (out, 0), 0)); + case PRE_INC: case PRE_DEC: case PRE_MODIFY: + out = replace_equiv_address_nv (out, XEXP (XEXP (out, 0), 0)); + break; - MEM_COPY_ATTRIBUTES (new, out); - out = new; - } + default: + break; } /* If we are reloading a (SUBREG constant ...), really reload just the @@ -4484,9 +4477,8 @@ make_memloc (ad, regno) if (rtx_varies_p (tem, 0)) tem = copy_rtx (tem); - tem = gen_rtx_MEM (GET_MODE (ad), tem); - MEM_COPY_ATTRIBUTES (tem, reg_equiv_memory_loc[regno]); - return tem; + tem = replace_equiv_address_nv (reg_equiv_memory_loc[regno], tem); + return adjust_address_nv (tem, GET_MODE (ad), 0); } /* Record all reloads needed for handling memory address AD diff --git a/gcc/reload1.c b/gcc/reload1.c index 7a587a72111..78851c0a147 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -2052,13 +2052,7 @@ alter_reg (i, from_reg) /* If we have any adjustment to make, or if the stack slot is the wrong mode, make a new stack slot. */ if (adjust != 0 || GET_MODE (x) != GET_MODE (regno_reg_rtx[i])) - { - rtx new = gen_rtx_MEM (GET_MODE (regno_reg_rtx[i]), - plus_constant (XEXP (x, 0), adjust)); - - MEM_COPY_ATTRIBUTES (new, x); - x = new; - } + x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust); /* Save the stack slot for later. */ reg_equiv_memory_loc[i] = x; @@ -2572,15 +2566,10 @@ eliminate_regs (x, mem_mode, insn) /* Our only special processing is to pass the mode of the MEM to our recursive call and copy the flags. While we are here, handle this case more efficiently. */ - new = eliminate_regs (XEXP (x, 0), GET_MODE (x), insn); - if (new != XEXP (x, 0)) - { - new = gen_rtx_MEM (GET_MODE (x), new); - MEM_COPY_ATTRIBUTES (new, x); - return new; - } - else - return x; + return + replace_equiv_address_nv (x, + eliminate_regs (XEXP (x, 0), + GET_MODE (x), insn)); case USE: /* Handle insn_list USE that a call to a pure function may generate. */ diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 28bfad844c6..3cdc3dc546d 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -265,22 +265,10 @@ simplify_replace_rtx (x, old, new) default: if (GET_CODE (x) == MEM) - { - /* We can't use change_address here, since it verifies memory address - for corectness. We don't want such check, since we may handle - addresses previously incorect (such as ones in push instructions) - and it is caller's work to verify whether resulting insn match. */ - rtx addr = simplify_replace_rtx (XEXP (x, 0), old, new); - rtx mem; - if (XEXP (x, 0) != addr) - { - mem = gen_rtx_MEM (GET_MODE (x), addr); - MEM_COPY_ATTRIBUTES (mem, x); - } - else - mem = x; - return mem; - } + return + replace_equiv_address_nv (x, + simplify_replace_rtx (XEXP (x, 0), + old, new)); return x; } @@ -2415,13 +2403,7 @@ simplify_subreg (outermode, op, innermode, byte) || (mov_optab->handlers[(int) innermode].insn_code == CODE_FOR_nothing)) && GET_MODE_SIZE (outermode) <= GET_MODE_SIZE (GET_MODE (op))) - { - rtx new; - - new = gen_rtx_MEM (outermode, plus_constant (XEXP (op, 0), byte)); - MEM_COPY_ATTRIBUTES (new, op); - return new; - } + return adjust_address_nv (op, outermode, byte); /* Handle complex values represented as CONCAT of real and imaginary part. */ diff --git a/gcc/stmt.c b/gcc/stmt.c index 48b3a87cc66..ea736473ee5 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -4112,11 +4112,7 @@ expand_anon_union_decl (decl, cleanup, decl_elts) if (mode == GET_MODE (x)) SET_DECL_RTL (decl_elt, x); else - { - SET_DECL_RTL (decl_elt, - gen_rtx_MEM (mode, copy_rtx (XEXP (x, 0)))); - MEM_COPY_ATTRIBUTES (DECL_RTL (decl_elt), x); - } + SET_DECL_RTL (decl_elt, adjust_address_nv (x, mode, 0)); } else if (GET_CODE (x) == REG) { -- 2.30.2