> > 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 > >