<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">I removed unions from mainline in r112356.<div><br></div><div>-Chris</div><div><br><div><div>On Jul 20, 2010, at 2:46 PM, Talin wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">On Tue, Jul 20, 2010 at 8:34 AM, Chris Lattner <span dir="ltr"><<a href="mailto:clattner@apple.com">clattner@apple.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im"><br>
On Jul 20, 2010, at 1:36 AM, Anton Korobeynikov wrote:<br>
<br>
>> used to make the code manipulating the union type "well typed". This<br>
>> approach seems work very well, is there really a need to keep union type in<br>
>> LLVM?<br>
> I think in its current state the unions should be removed from LLVM IR<br>
> in next release. It's pretty much unfinished and noone is willing to<br>
> work on them.<br>
<br>
</div>I agree.<br>
<font color="#888888"><br></font></blockquote><div>Unfortunately I wasn't able to take the union stuff much farther than I did. Partly that was because my LLVM-related work has been on hiatus for the last 4 months or so due to various issues going on in my personal life. But it was also partly because I had reached the limit of my knowledge in this area, I wasn't able to delve deeply enough into the code generation side of LLVM to really understand what needed to be done to support unions.</div>

<div><br></div><div>As far as converting a union into a C struct that is large enough to hold all possible types of the union, there are two minor problems associated with this approach:</div><div><br></div><div>1) For frontends that generate target-agnostic code, it is difficult to calculate how large this struct should be. (Which is larger, 3 int32s or two pointers? You don't know unless your frontend knows the size of a pointer.) In my case, I finally decided to abandon my goal of making my frontend completely target-neutral. While it's relatively easy to write a frontend that is 99% target-neutral with LLVM, that last 1% cannot be eliminated.</div>

<div><br></div><div>2) Extracting the values from the union require pointer casting, which means that the union cannot be an SSA value - it has to have an address. This probably isn't a big issue in languages like C++ which use unions infrequently, but other languages which use algebraic type systems might suffer a loss of performance due to the need to store union types in memory.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font color="#888888">
-Chris</font></blockquote></div><br>-- <br>-- Talin<br>
</blockquote></div><br></div></body></html>