[LLVMdev] Suggestion: Support union types in IR

Chris Lattner clattner at apple.com
Fri May 8 10:25:47 PDT 2009


On May 5, 2009, at 9:55 PM, Talin wrote:
>>> (So
>>> that the frontend doesn't need to know how big a pointer is and can
>>> generate the same IR that works on both 32-bit and 64-bit  
>>> platforms.)
>>>
>>
>> Why not just use a pointer, such as i8*?
>>
> Suppose I have an STL-like container that has a 'begin' and 'end'
> pointer. Now I want to find the size() of the container. Since you
> cannot subtract pointers in LLVM IR, you have to cast them to an  
> integer
> type first. But what integer type do you cast them to? I suppose you
> could simply always cast them to i64, and hope that the backend will
> generate efficient code for the subtraction, but I have no way of
> knowing this.

What do you intend to do with this size?  At some point you have to do  
an operation that depends on the size.  The problem with adding an  
intptr_t is that at some point you have to convert it to another  
datatype, and you don't know whether it will be a zext/trunc/bitcast  
etc.

> Now, I'm going to anticipate what I think will be your next argument,
> which is that at some point I must know the size of the result since I
> am assigning the result of size() to some interger variable  
> eventually.

yes :)

> Which is true, however, if the size of that eventual variable is  
> smaller
> than a pointer, then I want to check it for overflow before I do the
> assignment. I don't want to just do a blind bitcast and have the top
> bits be lopped off.

But you don't know if it will be smaller or larger.

-Chris




More information about the llvm-dev mailing list