[llvm-commits] RFC: initial union syntax support

me22 me22.ca at gmail.com
Thu May 14 08:47:34 PDT 2009

On Thu, May 14, 2009 at 07:58, Andrew Lenharth <andrewl at lenharth.org> wrote:
> I agree.  Reordering the elements on creation would make this a pain
> to deal with.  Since it is a struct, GEPs are sane (constant index) so
> it would be a simple matter for a pass to prune redundant fields and
> rewrite GEPs.  But that should happen after the front end is done.
> The alternative is the create a whole bunch of new machinery so you
> can ask for the index of the field holding type T.
> The whole point of this exercise is to remove bitcasts.  In fact,
> though I am not suggesting it, you could do away with bitcasts
> completely given unions.

What's the semantic difference that using a GEP into a union will give
you over a bitcast?

Would it not be better to simply def a bitcast between a type and a
union with a corresponding type as safe(r)?  That way re-ordering and
uniquing wouldn't change the code.

My understanding is that this is perfectly acceptable in C:

    struct a { int i; };
    struct b { int i; int j; };
    struct a *foo(struct b *p){ return (struct a*)p; }

And in a sense, bitcasting from union to union member is the same kind
of bitcasting-to-a-prefix.

Just musing,
~ Scott

More information about the llvm-commits mailing list