[LLVMdev] Proposal: intp type
Jim Grosbach
grosbach at apple.com
Fri Nov 13 10:20:54 PST 2009
On Nov 12, 2009, at 11:29 PM, John McCall wrote:
> Chris Lattner wrote:
>> 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.
>
> To be really pedantic, a single platform may have multiple pointer
> widths; I assume intptr would correspond to the width of a generic
> pointer, but non-generic address spaces are not constrained in any
> direction by the size of the generic address space. Of course, non-
> generic address spaces have no place in portable bitcode anyway, but
> I wanted to insert a note of pedantry into the conversation. :)
>
That's not all that uncommon a situation in the embedded world.
Definitely something to keep in mind.
-Jim
>>> 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.
>
> We could just say that code has undefined behavior or is invalid if
> the 'sext', 'zext', or 'trunc' is inappropriate for the actual size
> of intptr. I think this is reasonable; if the frontend emits a
> zext intptr to i32, and the pointer side is i64, that *should* be
> invalid. This way the optimizer gets to keep its assumptions and it
> becomes the client's responsibility to ensure that its "target-
> neutral" bitcode really is neutral for the range of platforms it
> actually cares about. Portable code can't be truncating arbitrary
> pointers to some smaller type anyway; if the client just wants to
> munge the bottom bits, it can zext and trunc to and from i8/i12/
> whatever.
>
> John.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list