[LLVMdev] Proposal: intp type
Talin
viridia at gmail.com
Thu Nov 12 11:29:50 PST 2009
On Wed, Nov 11, 2009 at 11:11 AM, Chris Lattner <clattner at apple.com> wrote:
> On Nov 10, 2009, at 4:10 PM, Talin wrote:
> > I realize that most users of LLVM aren't affected by this, because most
> frontends aren't target-neutral, and thus know in advance how big a pointer
> is. At least, that's my impression.
>
> I believe that.
>
> > There's only a tiny handful of fairly esoteric cases which require
> selecting a target before you generate IR. Unfortunately, the "pointer the
> same size as an int" is one of these rare cases - it is something that is
> very painful to try and work around. (A similar esoteric use case is: "which
> of the following two types is larger, 3 x int32 or 2 x {}*? -- i.e. the
> union problem.)
>
> With this explanation, the idea of adding a union type seems a lot more
> compelling to me. For the record, I'm not opposed to an intptr_t type or a
> union type, but the semantics have to be clean and well specified.
>
> -Chris
Well, as far as intp goes (or iptr if you prefer - the naming convention in
LLVM is i<size>), here's what I would expect:
- General rule #1: If an instruction accepts both i32 and i64, then it
should accept iptr as well. If it only accepts i32, then it can continue to
only accept i32.
- General rule #2: It should support operations that are commonly used
with size_t and ptrdiff_t.
- Operations that should work with iptr:
- Basic math: add, subtract, multiply, divide, mod.
- Bitwise binary operators: shl, ashr, lshr, and, or, xor, etc.
- Comparison operations.
- alloca - currently doesn't work with i64, should it?
- GEP - rules are the same as for using i64 indices.
- memcpy intrinsics
- bit manipulation intrinsics
- overflow arithmetic intrinsics - would be nice
- atomic intrinsics - would be very nice (I assume that atomic iptr
works on all platforms that support atomics: That is, on 32-bit platforms
where iptr == i32 I expect atomic i32 to work; on 64-bit platforms where
iptr == i64 I expect atomic i64 to work).
- Operations that don't need to work with iptr - i.e. I don't mind having
to convert to some other int type first:
- switch
- extractelement / insertelement / shufflevector
- extractvalue / insertvalue - not sure about these.
- code generator intrinsics (frameaddress, etc.)
- Converting to pointer types: inttoptr and ptrtoint should be no-ops,
effectively.
- Converting to other integer types: The issue here is that with other
integer conversions in LLVM, you are required to know whether or not you are
converting to a larger or smaller size - whether to use an ext or a trunc
instruction. When converting to pointers, however, the choice of trunc or
ext is automatic. Ideally, conversion to iptr would work the same way as
conversion to a pointer type. There's also the issue of signed vs. unsigned
extension.
- Note that some constant-folding operations would need to be deferred
until the target size is established.
- Converting to FP types: Either don't support (i.e. require casting to
known-width integer first), or map to i32->FP or i64->FP after the size is
known.
--
-- Talin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20091112/ba266ae2/attachment.html>
More information about the llvm-dev
mailing list