mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-26 02:15:32 +08:00
PR debug/43051 PR debug/43092 * cselib.c (cselib_preserve_constants, cfa_base_preserved_val): New static variables. (preserve_only_constants): New function. (cselib_reset_table): If cfa_base_preserved_val is non-NULL, don't clear its REG_VALUES. If cselib_preserve_constants, don't empty the whole hash table, but preserve there VALUEs with constants, cfa_base_preserved_val and cfa_base_preserved_val plus constant. (cselib_preserve_cfa_base_value): New function. (cselib_invalidate_regno): Don't invalidate cfa_base_preserved_val. (cselib_init): Change argument to int bitfield. Set cselib_preserve_constants to whether CSELIB_PRESERVE_CONSTANTS is in it. (cselib_finish): Clear cselib_preserve_constants and cfa_base_preserved_val. * cselib.h (enum cselib_record_what): New enum. (cselib_init): Change argument to int. (cselib_preserve_cfa_base_value): New prototype. * postreload.c (reload_cse_regs_1): Adjust cselib_init caller. * dse.c (dse_step1): Likewise. * cfgcleanup.c (thread_jump): Likewise. * sched-deps.c (sched_analyze): Likewise. * gcse.c (local_cprop_pass): Likewise. * simplify-rtx.c (simplify_replace_fn_rtx): Add argument to callback. If FN is non-NULL, call the callback always and whenever it returns non-NULL just return that. Only do rtx_equal_p if FN is NULL. * rtl.h (simplify_replace_fn_rtx): Add argument to callback. * combine.c (propagate_for_debug_subst): Add old_rtx argument, compare from with old_rtx and if it isn't rtx_equal_p, return NULL. * Makefile.in (var-tracking.o): Depend on $(RECOG_H). * var-tracking.c: Include recog.h. (bb_stack_adjust_offset): Remove. (vt_stack_adjustments): Don't call it, instead just gather the adjustments using insn_stack_adjust_offset_pre_post on each bb insn. (adjust_stack_reference): Remove. (compute_cfa_pointer): New function. (hard_frame_pointer_adjustment, cfa_base_rtx): New static variables. (struct adjust_mem_data): New type. (adjust_mems, adjust_mem_uses, adjust_mem_stores, adjust_insn): New functions. (get_address_mode): New function. (replace_expr_with_values): Use it. (use_type): Don't do cselib_lookup for VAR_LOC_UNKNOWN_P. Use get_address_mode. For cfa_base_rtx return MO_CLOBBER. (adjust_sets): Remove. (add_uses): Don't add extra MO_VAL_USE for cfa_base_rtx plus constant. Use get_address_mode. (get_adjusted_src): Remove. (add_stores): Don't call it. Never reuse expr SET. Don't add extra MO_VAL_USE for cfa_base_rtx plus constant. Use get_address_mode. (add_with_sets): Don't call adjust_sets. (fp_setter, vt_init_cfa_base): New functions. (vt_initialize): Change return type to bool. Move most of pool etc. initialization to the beginning of the function from end. Pass CSELIB_RECORD_MEMORY | CSELIB_PRESERVE_CONSTANTS to cselib_init. If !frame_pointer_needed, call vt_stack_adjustment before mos vector is filled, call vt_init_cfa_base if argp/framep has been eliminated to sp. If frame_pointer_needed and argp/framep has been eliminated to hard frame pointer, set hard_frame_pointer_adjustment and call vt_init_cfa_base after encountering fp setter in the prologue. For MO_ADJUST, call log_op_type before pusing the op into mos vector, not afterwards. Call adjust_insn before cselib_process_insn/add_with_sets, call cancel_changes (0) afterwards. (variable_tracking_main_1): Adjust for vt_initialize calling vt_stack_adjustments and returning whether it succeeded or not. * gcc.dg/guality/pr43051-1.c: New test. From-SVN: r157476
104 lines
3.2 KiB
C
104 lines
3.2 KiB
C
/* Common subexpression elimination for GNU compiler.
|
|
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
|
|
1998, 1999, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
|
Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
/* Describe a value. */
|
|
typedef struct GTY(()) cselib_val_struct {
|
|
/* The hash value. */
|
|
unsigned int hash;
|
|
|
|
/* A unique id assigned to values. */
|
|
int uid;
|
|
|
|
/* A VALUE rtx that points back to this structure. */
|
|
rtx val_rtx;
|
|
|
|
/* All rtl expressions that hold this value at the current time during a
|
|
scan. */
|
|
struct elt_loc_list *locs;
|
|
|
|
/* If this value is used as an address, points to a list of values that
|
|
use it as an address in a MEM. */
|
|
struct elt_list *addr_list;
|
|
|
|
struct cselib_val_struct *next_containing_mem;
|
|
} cselib_val;
|
|
|
|
/* A list of rtl expressions that hold the same value. */
|
|
struct GTY(()) elt_loc_list {
|
|
/* Next element in the list. */
|
|
struct elt_loc_list *next;
|
|
/* An rtl expression that holds the value. */
|
|
rtx loc;
|
|
/* The insn that made the equivalence. */
|
|
rtx setting_insn;
|
|
};
|
|
|
|
/* A list of cselib_val structures. */
|
|
struct GTY(()) elt_list {
|
|
struct elt_list *next;
|
|
cselib_val *elt;
|
|
};
|
|
|
|
/* Describe a single set that is part of an insn. */
|
|
struct cselib_set
|
|
{
|
|
rtx src;
|
|
rtx dest;
|
|
cselib_val *src_elt;
|
|
cselib_val *dest_addr_elt;
|
|
};
|
|
|
|
enum cselib_record_what
|
|
{
|
|
CSELIB_RECORD_MEMORY = 1,
|
|
CSELIB_PRESERVE_CONSTANTS = 2
|
|
};
|
|
|
|
extern void (*cselib_discard_hook) (cselib_val *);
|
|
extern void (*cselib_record_sets_hook) (rtx insn, struct cselib_set *sets,
|
|
int n_sets);
|
|
|
|
extern cselib_val *cselib_lookup (rtx, enum machine_mode, int);
|
|
extern void cselib_init (int);
|
|
extern void cselib_clear_table (void);
|
|
extern void cselib_finish (void);
|
|
extern void cselib_process_insn (rtx);
|
|
extern enum machine_mode cselib_reg_set_mode (const_rtx);
|
|
extern int rtx_equal_for_cselib_p (rtx, rtx);
|
|
extern int references_value_p (const_rtx, int);
|
|
extern rtx cselib_expand_value_rtx (rtx, bitmap, int);
|
|
typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *);
|
|
extern rtx cselib_expand_value_rtx_cb (rtx, bitmap, int,
|
|
cselib_expand_callback, void *);
|
|
extern bool cselib_dummy_expand_value_rtx_cb (rtx, bitmap, int,
|
|
cselib_expand_callback, void *);
|
|
extern rtx cselib_subst_to_values (rtx);
|
|
extern void cselib_invalidate_rtx (rtx);
|
|
|
|
extern void cselib_reset_table (unsigned int);
|
|
extern unsigned int cselib_get_next_uid (void);
|
|
extern void cselib_preserve_value (cselib_val *);
|
|
extern bool cselib_preserved_value_p (cselib_val *);
|
|
extern void cselib_preserve_only_values (void);
|
|
extern void cselib_preserve_cfa_base_value (cselib_val *);
|
|
|
|
extern void dump_cselib_table (FILE *);
|