Mike Stump <[EMAIL PROTECTED]> writes:
> On Nov 8, 2006, at 7:14 AM, Ian Lance Taylor wrote:
> > The way to canonicalize them is to have all equivalent types point to
> > a single canonical type for the equivalence set. The comparison is
> > one memory dereference and one pointer comparison, not the current
> > procedure of checking for structural equivalence.
>
> Once not equal addresses might mean equal types, you have to do a
> structure walk to compare types, and you're right back were we
> started. The only way to save yourself, is to be able to say,
> different addresses, _must_ be different types.
I have no idea what you mean by this.
I meant something very simple: for every type, there is a
TYPE_CANONICAL field. This is how you tell whether two types are
equivalent:
TYPE_CANONICAL (a) == TYPE_CANONICAL (b)
That is what I mean when I saw one memory dereference and one pointer
comparison.
> An example, are these two types the same:
>
> ********************A
> ********************B
>
> given that A and B are the same type. Your way, you need to walk two
> trees, hitting memory 40 times.
No. When you create *A, you also create * (TYPE_CANONICAL (A)) (this
may be the same as *A, of course). You set TYPE_CANONICAL (*A) to
that type. And the same for *B. Since TYPE_CANONICAL (A) ==
TYPE_CANONICAL (B) by assumption, you make sure that TYPE_CANONICAL
(*A) == TYPE_CANONICAL (*B).
Ian