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