diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2011-02-03 06:04:04 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2011-02-03 06:04:04 +0000 |
commit | 4deef538ecda16acd4c0ae3d3ed71c591603ce73 (patch) | |
tree | 1064817b077534a9d4c8d69e161ab2fcd975a017 /gcc/var-tracking.c | |
parent | 1551d44aba2deeb55393396502ca091e41bcfee3 (diff) | |
download | gcc-4deef538ecda16acd4c0ae3d3ed71c591603ce73.zip gcc-4deef538ecda16acd4c0ae3d3ed71c591603ce73.tar.gz gcc-4deef538ecda16acd4c0ae3d3ed71c591603ce73.tar.bz2 |
re PR debug/43092 (Wrong debuginfo with VTA and -fomit-frame-pointer/-mno-accumulate-outgoing-args)
PR debug/43092
PR rtl-optimization/43494
* rtl.h (for_each_inc_dec_fn): New type.
(for_each_inc_dec): Declare.
* rtlanal.c (struct for_each_inc_dec_ops): New type.
(for_each_inc_dec_find_inc_dec): New fn.
(for_each_inc_dec_find_mem): New fn.
(for_each_inc_dec): New fn.
* dse.c (struct insn_size): Remove.
(replace_inc_dec, replace_inc_dec_mem): Remove.
(emit_inc_dec_insn_before): New fn.
(check_for_inc_dec): Use it, along with for_each_inc_dec.
(canon_address): Pass mem modes to cselib_lookup.
* cselib.h (cselib_lookup): Add memmode argument. Adjust callers.
(cselib_lookup_from_insn): Likewise.
(cselib_subst_to_values): Likewise.
* cselib.c (find_slot_memmode): New var.
(cselib_find_slot): New fn. Use it instead of
htab_find_slot_with_hash everywhere.
(entry_and_rtx_equal_p): Use find_slot_memmode.
(autoinc_split): New fn.
(rtx_equal_for_cselib_p): Rename and implement in terms of...
(rtx_equal_for_cselib_1): ... this. Take memmode, pass it on.
Deal with autoinc. Special-case recursion into MEMs.
(cselib_hash_rtx): Likewise.
(cselib_lookup_mem): Infer pmode from address mode. Distinguish
address and MEM modes.
(cselib_subst_to_values): Add memmode, pass it on.
Deal with autoinc.
(cselib_lookup): Add memmode argument, pass it on.
(cselib_lookup_from_insn): Add memmode.
(cselib_invalidate_rtx): Discard obsolete push_operand handling.
(struct cselib_record_autoinc_data): New.
(cselib_record_autoinc_cb): New fn.
(cselib_record_sets): Use it, along with for_each_inc_dec. Pass MEM
mode to cselib_lookup. Reset autoinced REGs here instead of...
(cselib_process_insn): ... here.
* var-tracking.c (replace_expr_with_values, use_type): Pass MEM mode
to cselib_lookup.
(add_uses): Likewise, also to cselib_subst_to_values.
(add_stores): Likewise.
* sched-deps.c (add_insn_mem_dependence): Pass mode to
cselib_subst_to_values.
(sched_analyze_1, sched_analyze_2): Likewise. Adjusted.
* gcse.c (do_local_cprop): Adjusted.
* postreload.c (reload_cse_simplify_set): Adjusted.
(reload_cse_simplify_operands): Adjusted.
* sel-sched-dump (debug_mem_addr_value): Pass mode.
From-SVN: r169782
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index e0477d4..7543a5a 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -737,7 +737,7 @@ use_narrower_mode_test (rtx *loc, void *data) switch (GET_CODE (*loc)) { case REG: - if (cselib_lookup (*loc, GET_MODE (SUBREG_REG (subreg)), 0)) + if (cselib_lookup (*loc, GET_MODE (SUBREG_REG (subreg)), 0, VOIDmode)) return 1; return -1; case PLUS: @@ -3954,8 +3954,10 @@ variable_post_merge_new_vals (void **slot, void *info) subsequent rounds. */ cselib_val *v; gcc_assert (!cselib_lookup (node->loc, - GET_MODE (node->loc), 0)); - v = cselib_lookup (node->loc, GET_MODE (node->loc), 1); + GET_MODE (node->loc), 0, + VOIDmode)); + v = cselib_lookup (node->loc, GET_MODE (node->loc), 1, + VOIDmode); cselib_preserve_value (v); cselib_invalidate_rtx (node->loc); cval = v->val_rtx; @@ -4793,7 +4795,7 @@ find_use_val (rtx x, enum machine_mode mode, struct count_use_info *cui) return cui->sets[i].src_elt; } else - return cselib_lookup (x, mode, 0); + return cselib_lookup (x, mode, 0, VOIDmode); } return NULL; @@ -4822,14 +4824,15 @@ replace_expr_with_values (rtx loc) else if (MEM_P (loc)) { cselib_val *addr = cselib_lookup (XEXP (loc, 0), - get_address_mode (loc), 0); + get_address_mode (loc), 0, + GET_MODE (loc)); if (addr) return replace_equiv_address_nv (loc, addr->val_rtx); else return NULL; } else - return cselib_subst_to_values (loc); + return cselib_subst_to_values (loc, VOIDmode); } /* Determine what kind of micro operation to choose for a USE. Return @@ -4849,7 +4852,8 @@ use_type (rtx loc, struct count_use_info *cui, enum machine_mode *modep) rtx ploc = PAT_VAR_LOCATION_LOC (loc); if (! VAR_LOC_UNKNOWN_P (ploc)) { - cselib_val *val = cselib_lookup (ploc, GET_MODE (loc), 1); + cselib_val *val = cselib_lookup (ploc, GET_MODE (loc), 1, + VOIDmode); /* ??? flag_float_store and volatile mems are never given values, but we could in theory use them for @@ -4871,7 +4875,8 @@ use_type (rtx loc, struct count_use_info *cui, enum machine_mode *modep) if (REG_P (loc) || (find_use_val (loc, GET_MODE (loc), cui) && cselib_lookup (XEXP (loc, 0), - get_address_mode (loc), 0))) + get_address_mode (loc), 0, + GET_MODE (loc)))) return MO_VAL_SET; } else @@ -5033,13 +5038,15 @@ add_uses (rtx *ploc, void *data) rtx mloc = vloc; enum machine_mode address_mode = get_address_mode (mloc); cselib_val *val - = cselib_lookup (XEXP (mloc, 0), address_mode, 0); + = cselib_lookup (XEXP (mloc, 0), address_mode, 0, + GET_MODE (mloc)); if (val && !cselib_preserved_value_p (val)) { micro_operation moa; preserve_value (val); - mloc = cselib_subst_to_values (XEXP (mloc, 0)); + mloc = cselib_subst_to_values (XEXP (mloc, 0), + GET_MODE (mloc)); moa.type = MO_VAL_USE; moa.insn = cui->insn; moa.u.loc = gen_rtx_CONCAT (address_mode, @@ -5109,13 +5116,15 @@ add_uses (rtx *ploc, void *data) rtx mloc = oloc; enum machine_mode address_mode = get_address_mode (mloc); cselib_val *val - = cselib_lookup (XEXP (mloc, 0), address_mode, 0); + = cselib_lookup (XEXP (mloc, 0), address_mode, 0, + GET_MODE (mloc)); if (val && !cselib_preserved_value_p (val)) { micro_operation moa; preserve_value (val); - mloc = cselib_subst_to_values (XEXP (mloc, 0)); + mloc = cselib_subst_to_values (XEXP (mloc, 0), + GET_MODE (mloc)); moa.type = MO_VAL_USE; moa.insn = cui->insn; moa.u.loc = gen_rtx_CONCAT (address_mode, @@ -5225,7 +5234,7 @@ reverse_op (rtx val, const_rtx expr) if (!SCALAR_INT_MODE_P (GET_MODE (src)) || XEXP (src, 0) == cfa_base_rtx) return NULL_RTX; - v = cselib_lookup (XEXP (src, 0), GET_MODE (XEXP (src, 0)), 0); + v = cselib_lookup (XEXP (src, 0), GET_MODE (XEXP (src, 0)), 0, VOIDmode); if (!v || !cselib_preserved_value_p (v)) return NULL_RTX; @@ -5346,13 +5355,15 @@ add_stores (rtx loc, const_rtx expr, void *cuip) rtx mloc = loc; enum machine_mode address_mode = get_address_mode (mloc); cselib_val *val = cselib_lookup (XEXP (mloc, 0), - address_mode, 0); + address_mode, 0, + GET_MODE (mloc)); if (val && !cselib_preserved_value_p (val)) { preserve_value (val); mo.type = MO_VAL_USE; - mloc = cselib_subst_to_values (XEXP (mloc, 0)); + mloc = cselib_subst_to_values (XEXP (mloc, 0), + GET_MODE (mloc)); mo.u.loc = gen_rtx_CONCAT (address_mode, val->val_rtx, mloc); mo.insn = cui->insn; if (dump_file && (dump_flags & TDF_DETAILS)) @@ -5411,7 +5422,7 @@ add_stores (rtx loc, const_rtx expr, void *cuip) if (GET_CODE (PATTERN (cui->insn)) == COND_EXEC) { - cselib_val *oval = cselib_lookup (oloc, GET_MODE (oloc), 0); + cselib_val *oval = cselib_lookup (oloc, GET_MODE (oloc), 0, VOIDmode); gcc_assert (oval != v); gcc_assert (REG_P (oloc) || MEM_P (oloc)); @@ -8077,7 +8088,8 @@ vt_add_function_parameter (tree parm) if (offset) return; - val = cselib_lookup (var_lowpart (mode, incoming), mode, true); + val = cselib_lookup (var_lowpart (mode, incoming), mode, true, + VOIDmode); /* ??? Float-typed values in memory are not handled by cselib. */ @@ -8197,7 +8209,7 @@ vt_init_cfa_base (void) frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx); val = cselib_lookup_from_insn (cfa_base_rtx, GET_MODE (cfa_base_rtx), 1, - get_insns ()); + VOIDmode, get_insns ()); preserve_value (val); cselib_preserve_cfa_base_value (val, REGNO (cfa_base_rtx)); var_reg_decl_set (&VTI (ENTRY_BLOCK_PTR)->out, cfa_base_rtx, |