On Wed, May 23, 2012 at 06:27:21AM -0300, Alexandre Oliva wrote:
> +static int
> +drop_overlapping_mem_locs (void **slot, void *data)
> +{
> + struct overlapping_mems *coms = (struct overlapping_mems *)data;
> + dataflow_set *set = coms->set;
> + rtx mloc = coms->loc;
> + variable var = (variable) *slot;
> +
> + if (var->onepart == ONEPART_VALUE)
> + {
> + location_chain loc, *locp;
> + bool changed = false;
> + rtx cur_loc;
> +
> + gcc_assert (var->n_var_parts == 1);
> +
> + if (shared_var_p (var, set->vars))
> + {
> + for (loc = var->var_part[0].loc_chain; loc; loc = loc->next)
> + if (GET_CODE (loc->loc) == MEM
> + && !nonoverlapping_memrefs_p (loc->loc, mloc, false))
Isn't nonoverlapping_memrefs_p predicate too conservative?
cselib.c uses canon_true_dependence to decide what should be invalidated.
Jakub