From 01e3bc6eba1db5273bcb911bff1fccd61b5d0ec3 Mon Sep 17 00:00:00 2001 From: rsandifo Date: Wed, 1 Nov 2017 13:56:09 +0000 Subject: [PATCH] Turn var-tracking.c:INT_MEM_OFFSET into a function This avoids the double evaluation mentioned in the comments and simplifies the change to make MEM_OFFSET variable. 2017-11-01 Richard Sandiford Alan Hayward David Sherwood gcc/ * var-tracking.c (INT_MEM_OFFSET): Replace with... (int_mem_offset): ...this new function. (var_mem_set, var_mem_delete_and_set, var_mem_delete) (find_mem_expr_in_1pdv, dataflow_set_preserve_mem_locs) (same_variable_part_p, use_type, add_stores, vt_get_decl_and_offset): Update accordingly. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254309 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 11 +++++++++++ gcc/var-tracking.c | 31 +++++++++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d997cac3b20..45388262ce6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,17 @@ Alan Hayward David Sherwood + * var-tracking.c (INT_MEM_OFFSET): Replace with... + (int_mem_offset): ...this new function. + (var_mem_set, var_mem_delete_and_set, var_mem_delete) + (find_mem_expr_in_1pdv, dataflow_set_preserve_mem_locs) + (same_variable_part_p, use_type, add_stores, vt_get_decl_and_offset): + Update accordingly. + +2017-11-01 Richard Sandiford + Alan Hayward + David Sherwood + * lower-subreg.c (interesting_mode_p): New function. (compute_costs, find_decomposable_subregs, decompose_register) (simplify_subreg_concatn, can_decompose_p, resolve_simple_move) diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 51e519a743f..16327bd43f3 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -390,8 +390,15 @@ struct variable /* Pointer to the BB's information specific to variable tracking pass. */ #define VTI(BB) ((variable_tracking_info *) (BB)->aux) -/* Macro to access MEM_OFFSET as an HOST_WIDE_INT. Evaluates MEM twice. */ -#define INT_MEM_OFFSET(mem) (MEM_OFFSET_KNOWN_P (mem) ? MEM_OFFSET (mem) : 0) +/* Return MEM_OFFSET (MEM) as a HOST_WIDE_INT, or 0 if we can't. */ + +static inline HOST_WIDE_INT +int_mem_offset (const_rtx mem) +{ + if (MEM_OFFSET_KNOWN_P (mem)) + return MEM_OFFSET (mem); + return 0; +} #if CHECKING_P && (GCC_VERSION >= 2007) @@ -2336,7 +2343,7 @@ var_mem_set (dataflow_set *set, rtx loc, enum var_init_status initialized, rtx set_src) { tree decl = MEM_EXPR (loc); - HOST_WIDE_INT offset = INT_MEM_OFFSET (loc); + HOST_WIDE_INT offset = int_mem_offset (loc); var_mem_decl_set (set, loc, initialized, dv_from_decl (decl), offset, set_src, INSERT); @@ -2354,7 +2361,7 @@ var_mem_delete_and_set (dataflow_set *set, rtx loc, bool modify, enum var_init_status initialized, rtx set_src) { tree decl = MEM_EXPR (loc); - HOST_WIDE_INT offset = INT_MEM_OFFSET (loc); + HOST_WIDE_INT offset = int_mem_offset (loc); clobber_overlapping_mems (set, loc); decl = var_debug_decl (decl); @@ -2375,7 +2382,7 @@ static void var_mem_delete (dataflow_set *set, rtx loc, bool clobber) { tree decl = MEM_EXPR (loc); - HOST_WIDE_INT offset = INT_MEM_OFFSET (loc); + HOST_WIDE_INT offset = int_mem_offset (loc); clobber_overlapping_mems (set, loc); decl = var_debug_decl (decl); @@ -4618,7 +4625,7 @@ find_mem_expr_in_1pdv (tree expr, rtx val, variable_table_type *vars) for (node = var->var_part[0].loc_chain; node; node = node->next) if (MEM_P (node->loc) && MEM_EXPR (node->loc) == expr - && INT_MEM_OFFSET (node->loc) == 0) + && int_mem_offset (node->loc) == 0) { where = node; break; @@ -4683,7 +4690,7 @@ dataflow_set_preserve_mem_locs (variable **slot, dataflow_set *set) /* We want to remove dying MEMs that don't refer to DECL. */ if (GET_CODE (loc->loc) == MEM && (MEM_EXPR (loc->loc) != decl - || INT_MEM_OFFSET (loc->loc) != 0) + || int_mem_offset (loc->loc) != 0) && mem_dies_at_call (loc->loc)) break; /* We want to move here MEMs that do refer to DECL. */ @@ -4727,7 +4734,7 @@ dataflow_set_preserve_mem_locs (variable **slot, dataflow_set *set) if (GET_CODE (loc->loc) != MEM || (MEM_EXPR (loc->loc) == decl - && INT_MEM_OFFSET (loc->loc) == 0) + && int_mem_offset (loc->loc) == 0) || !mem_dies_at_call (loc->loc)) { if (old_loc != loc->loc && emit_notes) @@ -5254,7 +5261,7 @@ same_variable_part_p (rtx loc, tree expr, HOST_WIDE_INT offset) else if (MEM_P (loc)) { expr2 = MEM_EXPR (loc); - offset2 = INT_MEM_OFFSET (loc); + offset2 = int_mem_offset (loc); } else return false; @@ -5522,7 +5529,7 @@ use_type (rtx loc, struct count_use_info *cui, machine_mode *modep) return MO_CLOBBER; else if (target_for_debug_bind (var_debug_decl (expr))) return MO_CLOBBER; - else if (track_loc_p (loc, expr, INT_MEM_OFFSET (loc), + else if (track_loc_p (loc, expr, int_mem_offset (loc), false, modep, NULL) /* Multi-part variables shouldn't refer to one-part variable names such as VALUEs (never happens) or @@ -6017,7 +6024,7 @@ add_stores (rtx loc, const_rtx expr, void *cuip) rtx xexpr = gen_rtx_SET (loc, src); if (same_variable_part_p (SET_SRC (xexpr), MEM_EXPR (loc), - INT_MEM_OFFSET (loc))) + int_mem_offset (loc))) mo.type = MO_COPY; else mo.type = MO_SET; @@ -9579,7 +9586,7 @@ vt_get_decl_and_offset (rtx rtl, tree *declp, HOST_WIDE_INT *offsetp) if (MEM_ATTRS (rtl)) { *declp = MEM_EXPR (rtl); - *offsetp = INT_MEM_OFFSET (rtl); + *offsetp = int_mem_offset (rtl); return true; } } -- 2.11.4.GIT