[LLVMdev] [RFC] Proposal to make LLVM-IR endian agnostic
James Molloy
james.molloy at arm.com
Tue Oct 4 00:06:20 PDT 2011
Hi Micah,
I'm no core developer, but FWIW here are my thoughts:
I'm general I think the patch is too OpenCL oriented, and I have some
niggling qualms about other parts. Specifically (comments inline):
From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
Behalf Of Villmow, Micah
Sent: 03 October 2011 19:37
To: llvmdev at cs.uiuc.edu
Subject: [LLVMdev] [RFC] Proposal to make LLVM-IR endian agnostic
One of the projects I am working on with others is to make LLVM-IR endian
agnostic.
So, I am sending out this proposal for feedback to the LLVM community. I've
attached
pretty version of the proposal in PDF format and pasted a 80-column safe
text version
below.
I'm looking forward to comments and feedback.
----------------------------------------------------------------------------
---
PROBLEM QUESTION:
----------------------------------------------------------------------------
---
How does a vendor simplify the compiler stack across multiple target devices
by removing endianess from the IR representation?
This is not the question that your RFC answers. Your RFC answers a superset
of just "represent endianness".
----------------------------------------------------------------------------
---
DEFINITIONS:
----------------------------------------------------------------------------
---
Global Memory - Memory that is visible to all threads in a process/program,
e.g. video ram. This includes all read-only, write-only and read-write
memories
on the system that are visible to all threads.
What has this got to do with endianness?
----------------------------------------------------------------------------
---
INTRINSICS:
----------------------------------------------------------------------------
---
This proposal introduces new sets of intrinsics, two load intrinsics and two
store intrinsics. The sets are as follows:
declare <type> @llvm.portable.load.e.<type>(<type>* ptr, , i32 alignment,
i1 host, i1 atomic, i1 volatile, i1 nontemporal, i1 singlethread)
// little endian load
declare <type> @llvm.portable.load.E.<type>(<type>* ptr, i32 alignment,
i1 host, i1 atomic, i1 volatile, i1 nontemporal, i1 singlethread)
// big endian load
declare void @llvm.portable.store.e.<type>(<type> data, <type>* ptr,
i32 alignment, i1 host, i1 atomic, i1 volatilei1 nontemporal,
i1 singlethread) // little endian store
declare void @llvm.portable.store.E.<type>(<type> data, <type>* ptr,
i32 alignment, i1 host, i1 atomic, i1 volatile, i1 nontemporal,
i1 singlethread) // big endian store
. I don't like the 'e'/'E' representation. If there were only little
or big endian loads throughout an IR file, it wouldn't be obvious to me what
the 'e'/'E' meant. It's only seeing the two in tandem where it jumps out at
me. I'd prefer the standard 'le'/'be'.
. You've put the OpenCL concept of "host" and "device" in a
supposedly target-agnostic IR. Why should there be only one device? More
importantly, why is host/device an attribute of the load or store as opposed
to the pointer to load/store to? Does it semantically make sense to have
both a host load and a device load of the same memory location in the same
module?
----------------------------------------------------------------------------
---
POINTER ATTRIBUTES:
----------------------------------------------------------------------------
---
In OpenCL, a pointer can have attributes attached, and this information
needs
to be encoded. In LLVM, the method of encoding extra information is via
metadata nodes and this is used so that the intrinsic do not need to be
modified to add extra information. One example of this is the endian(host)
attribute that can be attached to a pointer argument(see 6.10.3 of OpenCL
1.1 spec). This information can be encoded in a metadata node which is
attached
to the intrinsic. An example encoding of this information is as follows:
!0 = metadata !{
i32, ;; Tag = <OpenCL version number> using the official OpenCL version
macro
i1,;;Boolean value to specify that load is from host on true, device on
false
metadata ;; List of attributes for this intrinsic instruction
}
Does this subsection add anything extra to the RFC? It talks about a format
for metadata, but doesn't appear to really add any suggestions or
requirements for changing LLVM IR.
If your intention was just to make the IR endian-agnostic, I don't see why
you wouldn't just propose an extra attribute on the load/store instructions
(load be %0, load le %0) instead of recreating all loads and stores in a new
form and having to make all passes interact with them.
My general summary is that I think your suggestions take a "somewhat
language-agnostic and somewhat target-agnostic" IR and turn it into a
"somewhat language-dependent and more target-agnostic" IR, by embedding
OpenCL specifics. I'm not sure I think that's the best way to go.
Cheers,
James
Thanks,
Micah Villmow
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111004/5965e872/attachment.html>
More information about the llvm-dev
mailing list