[LLVMdev] Proposal: intp type

Chris Lattner clattner at apple.com
Thu Nov 12 20:48:06 PST 2009


On Nov 12, 2009, at 7:35 PM, Talin wrote:
> On Thu, Nov 12, 2009 at 5:58 PM, Chris Lattner <clattner at apple.com>  
> wrote:
>
> There is also the issue of how constants should be represented.
>
> For all current processors that I know of, an intptr will be either  
> 32 or 64 bits. However, there may be some future processor which  
> supports 128-bit pointers (although a system containing that much  
> RAM or even virtual address space is hard to imagine.)

8, 16, and 24-bit address spaces are also popular.

> If we assume that i64 is the upper limit, then intptr constants can  
> be converted to i64 until needed.
>
> Some constant folding can occur if the folding wouldn't change the  
> final result. Specifically, for any function f(x, y) where (i32)f(x,  
> y) is the same as (i32)f((i32)x, (i32)y), it's safe to apply that  
> function before the final size of the integer is chosen. Thus,  
> adding two numbers (ignoring overflow), or shifting to the left  
> should be safe to fold.
>
> That being said, I am perfectly fine with simply disabling folding,  
> and leaving the partial folding as a future optimization.

How should immediates be formed?  Is it valid for a ConstantInt to  
have intptr type?  How wide would the contained APInt be?  I think it  
would be safe to represent all constants as (signed_int_to_intptr  
(constantint 42)) or something.

>
> There is also the question of whether intptrs should be allowed as  
> *members* of vectors. I have no opinion on this, except to say that  
> it probably only makes sense in situations where you can also have  
> vectors of pointers.

Vectors of pointers are not allowed.  I think disallowing intptr in  
vectors makes perfect sense.
> Almost *all* constant folding would have to be deferred, which means  
> you'd get big chains of constant exprs.  This isn't a problem per- 
> say, but something to be aware of.
>
> I don't like reusing existing sext/trunc/zext/inttoptr/ptrtoint  
> casts for intptr.  I think we should introduce new operations  
> (hopefully with better names):
>
> ptr to intptr
> intptr to ptr
> intptr to signed int
> signed int to intptr
> intptr to unsigned int
> unsigned int to intptr
>
> Does that seem reasonable?
>
> Sure. Another option is to do away with sext/trunc/etc. and just  
> have two cast operations for ints: sicast and uicast. sicast  
> converts any int size to any other (with sign extension if the  
> destination type is bigger), and uicast is the same but with zero  
> extension.

sext/zext/trunc are very nice for the optimizer, we should keep them.   
It means that the optimizer doesn't have to check that the input to a  
sext is bigger or smaller than the result, for example.  Code that  
cares (e.g. instcombine) really likes this.

-Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20091112/d11bdd0f/attachment.html>


More information about the llvm-dev mailing list