On Thu, Mar 21, 2019 at 10:11:00AM +0100, Richard Biener wrote:
> On Thu, 21 Mar 2019, Jakub Jelinek wrote:
> 
> > On Thu, Mar 21, 2019 at 09:35:07AM +0100, Richard Biener wrote:
> > > LGTM - any reason you only sometimes conditionalize add_tree_to_fld_list
> > > on the fld->pset.add () result?  IMHO consistency should win over
> > > micro-optimizing the case you know the type will not be in the set.
> > 
> > Yeah, it was a optimization for the most common case, when
> > find_decls_types_r calls add_tree_to_fld_list (t, fld); for DECL_P as well
> > as TYPE_P, because in that case the fld->pset.add check has been done
> > already by walk_tree.  If we have hundreds thousands of elts in the
> > hash_set, it could be more than a microoptimization, but if you think
> > strongly that it should be all thrown away and add_tree_to_fld_list should
> > start with if (fld->pset.add (t)) return; then I can do that too.
> 
> Yes, I think that would be better.

Actually sorry, that is not going to work, because in the two
find_decls_types_r cases it is already set in the pset by walk_tree and thus
fld->pset.add (t) will return true because it is the second addition.
And just doing fld->pset.add (t) and not testing the result is undesirable
too for the other cases; in the patch there was some set of cases where I
was sure that the type isn't already in the pset (e.g. immediately after
build_variant_type_copy or build_distinct_type_copy), but in several other
cases it is unclear if it is already in or not and I think we don't want to
add it again in those cases.

Would you prefer to have say add_tree_to_fld_list that does what it does now
and has just 2 callers in find_decls_types_r and a new
maybe_add_tree_to_fld_list that would do
  if (!fld->pset.add (t))
    add_tree_to_fld_list (t, fld);
and change all the other add_tree_to_fld_list callers?

        Jakub

Reply via email to