> 
> Hello.
> 
> Yeah, you are right. But even Richard advised me to put it to a single place. 
> Maybe we are a bit
> more strict than it would be necessary. But I hope that's fine ;)

OK, lets do extra checking now and play with this incrementally.
> 
> Good point. Do you mean cases like, foo (alias_foo) and bar (alias_bar). If 
> we prove that foo equals to bar, can we also merge aliases?
> I am curious if such comparison can really save something? Are there any 
> interesting cases?

What probably matters is that you recognize the equivalence to know that uses 
of alias_foo can be merged with uses alias_bar.
Similarly for thunks.  Again something to do incrementally I guess.

Honza
> 
> Martin
> 
> 
> >> +    case INTEGER_CST:
> >> +      {
> >> +  ret = types_are_compatible_p (TREE_TYPE (t1), TREE_TYPE (t2))
> >> +        && wi::to_offset  (t1) == wi::to_offset  (t2);
> > 
> >   tree_int_cst_equal
> > 
> >> +    case FIELD_DECL:
> >> +      {
> >> +  tree fctx1 = DECL_FCONTEXT (t1);
> >> +  tree fctx2 = DECL_FCONTEXT (t2);
> > 
> > DECL_FCONTEXT has no semantic meaning; so you can skip comparing it.
> >> +
> >> +  tree offset1 = DECL_FIELD_OFFSET (t1);
> >> +  tree offset2 = DECL_FIELD_OFFSET (t2);
> >> +
> >> +  tree bit_offset1 = DECL_FIELD_BIT_OFFSET (t1);
> >> +  tree bit_offset2 = DECL_FIELD_BIT_OFFSET (t2);
> >> +
> >> +  ret = compare_operand (fctx1, fctx2)
> >> +        && compare_operand (offset1, offset2)
> >> +        && compare_operand (bit_offset1, bit_offset2);
> > 
> > You probably want to compare type here?
> >> +    case CONSTRUCTOR:
> >> +      {
> >> +  unsigned len1 = vec_safe_length (CONSTRUCTOR_ELTS (t1));
> >> +  unsigned len2 = vec_safe_length (CONSTRUCTOR_ELTS (t2));
> >> +
> >> +  if (len1 != len2)
> >> +    return false;
> >> +
> >> +  for (unsigned i = 0; i < len1; i++)
> >> +    if (!sem_variable::equals (CONSTRUCTOR_ELT (t1, i)->value,
> >> +                               CONSTRUCTOR_ELT (t2, i)->value))
> >> +      return false;
> > 
> > You want to compare ->index, too.
> >> +    case INTEGER_CST:
> >> +      return func_checker::types_are_compatible_p (TREE_TYPE (t1), 
> >> TREE_TYPE (t2),
> >> +       true)
> >> +       && wi::to_offset (t1) == wi::to_offset (t2);
> > again ;)
> > 
> > This is where I stopped for now.  Generally the patch seems OK to me with 
> > few of these
> > details fixed.
> > 
> > Honza
> > 

Reply via email to