aboutsummaryrefslogtreecommitdiff
path: root/gcc/cselib.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cselib.c')
-rw-r--r--gcc/cselib.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/gcc/cselib.c b/gcc/cselib.c
index 507898e..256bd78 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -629,8 +629,8 @@ references_value_p (const_rtx x, int only_useless)
int i, j;
if (GET_CODE (x) == VALUE
- && (! only_useless ||
- (CSELIB_VAL_PTR (x)->locs == 0 && !PRESERVED_VALUE_P (x))))
+ && (! only_useless
+ || (CSELIB_VAL_PTR (x)->locs == 0 && !PRESERVED_VALUE_P (x))))
return 1;
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
@@ -646,6 +646,16 @@ references_value_p (const_rtx x, int only_useless)
return 0;
}
+/* Return true if V is a useless VALUE and can be discarded as such. */
+
+static bool
+cselib_useless_value_p (cselib_val *v)
+{
+ return (v->locs == 0
+ && !PRESERVED_VALUE_P (v->val_rtx)
+ && !SP_DERIVED_VALUE_P (v->val_rtx));
+}
+
/* For all locations found in X, delete locations that reference useless
values (i.e. values without any location). Called through
htab_traverse. */
@@ -666,7 +676,7 @@ discard_useless_locs (cselib_val **x, void *info ATTRIBUTE_UNUSED)
p = &(*p)->next;
}
- if (had_locs && v->locs == 0 && !PRESERVED_VALUE_P (v->val_rtx))
+ if (had_locs && cselib_useless_value_p (v))
{
if (setting_insn && DEBUG_INSN_P (setting_insn))
n_useless_debug_values++;
@@ -684,7 +694,7 @@ discard_useless_values (cselib_val **x, void *info ATTRIBUTE_UNUSED)
{
cselib_val *v = *x;
- if (v->locs == 0 && !PRESERVED_VALUE_P (v->val_rtx))
+ if (v->locs == 0 && cselib_useless_value_p (v))
{
if (cselib_discard_hook)
cselib_discard_hook (v);
@@ -2370,7 +2380,7 @@ cselib_invalidate_regno_val (unsigned int regno, struct elt_list **l)
}
}
- if (had_locs && v->locs == 0 && !PRESERVED_VALUE_P (v->val_rtx))
+ if (had_locs && cselib_useless_value_p (v))
{
if (setting_insn && DEBUG_INSN_P (setting_insn))
n_useless_debug_values++;
@@ -2515,7 +2525,7 @@ cselib_invalidate_mem (rtx mem_rtx)
unchain_one_elt_loc_list (p);
}
- if (had_locs && v->locs == 0 && !PRESERVED_VALUE_P (v->val_rtx))
+ if (had_locs && cselib_useless_value_p (v))
{
if (setting_insn && DEBUG_INSN_P (setting_insn))
n_useless_debug_values++;
@@ -2593,14 +2603,14 @@ cselib_record_set (rtx dest, cselib_val *src_elt, cselib_val *dest_addr_elt)
REG_VALUES (dreg)->elt = src_elt;
}
- if (src_elt->locs == 0 && !PRESERVED_VALUE_P (src_elt->val_rtx))
+ if (cselib_useless_value_p (src_elt))
n_useless_values--;
new_elt_loc_list (src_elt, dest);
}
else if (MEM_P (dest) && dest_addr_elt != 0
&& cselib_record_memory)
{
- if (src_elt->locs == 0 && !PRESERVED_VALUE_P (src_elt->val_rtx))
+ if (cselib_useless_value_p (src_elt))
n_useless_values--;
add_mem_for_addr (dest_addr_elt, src_elt, dest);
}