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

Reply via email to