On 08 Aug 2007 17:36:43 -0700, Ian Lance Taylor <[EMAIL PROTECTED]> wrote:
> Michael Matz <[EMAIL PROTECTED]> writes:
>
> > If you were to implement something like virtual functions into the middle
> > end, it should be expressed in a fairly low level way IMHO.  E.g. a
> > virtual table simply being a vector of pointers to function decls (which
> > we can express already just fine).  That way they could also be written
> > out for LTO and read back in, and the question what function decl is
> > connected to what slot can also be answered trivially.  Then definite
> > class type merely has the characteristic that they can point to such a
> > function table, whereas indefinite class types (i.e. those whose runtime
> > type can be any derived one) can not.  E.g. I wouldn't try to model the
> > inheritance relationship.
>
> There is some advantage to knowing class heirarchy relationships in
> LTO.  Some C++ programs implement different virtual subclasses in
> different files.  LTO can put those together.  When the compiler can
> then determine that a variable definitely has a particular subclass,
> it can devirtualize the virtual calls, turning an indirect function
> call into a direct function calls, also exposing inlining
> opportunities.
>
> I don't know how important an optimization this is, but it seems like
> a real one, and one which is only available if the LTO middle-end
> knows something about class relationships.

I believe we do want to have this info in the middle end, but i don't
necessarily believe what Ollie's current approach is the best one.

It looks like all the code is still C++ specific, and it's semantics
are only defined by how they get generated in cp/*

I'd rather see us go the route of deciding what the semantics *should
be*, which of these tree codes are *actually necessary*, then make
cp/* gimplify it to what we've got.  The semantics should also be
completely documented independently of the C++ FE (even if we were
decide to give the middle end codes the exact same semantics as C++)

For example, I see no reason for PTRMEM_PLUS_EXPR.

To put it concretely, i think the proposal has gone backwards, and
worked from "we have an implementation of something in the C++ FE,
let's move it to the middle end" instead of "we have a design for
something we want to do in the middle end, let's make the C++
FE/gimplifier do it".

It's not at all clear to me from the current proposal where/when/how
these tree codes occur in the normal GIMPLE datastream, how I would
handle them in points-to analysis, etc.

Note that to directly adress your point, the middle end *already does*
have a notion of class relationships.  The BINFO_* (base class
information) is already common to the middle-end.  This is how the
ipa-cha stuff that was submitted a while ago knows how to find base
classes.

Besides type-based devirt, you will also get a lot out of points-to
based devirt, because it can do without the whole program, whereas
type-based devirt cannot.

--Dan

Reply via email to