[LLVMdev] Moving towards a singular pointer type

Herbie Robinson HerbieRobinson at verizon.net
Sat Feb 7 16:26:22 PST 2015


On 2/6/15 7:26 PM, Sean Silva wrote:
>
>
> On Fri, Feb 6, 2015 at 3:38 PM, David Blaikie <dblaikie at gmail.com 
> <mailto:dblaikie at gmail.com>> wrote:
>
>     It's an idea been thrown around in a few different threads
>     (including Rafael's recent
>     http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20141201/247285.html
>     and Chandler's
>     http://llvm.org/viewvc/llvm-project?rev=226781&view=rev ) so I'm
>     putting up my hand to volunteer to do the work & interested in
>     getting a bit more feedback, thoughts on best approaches, timing, etc.
>
>     For some more detail: pointer types (i32*, %foo*, etc) complicate
>     IR canonicalization. store + load should be the same instructions
>     given the same number of bytes stored to memory, but instead we
>     can have store float, store int, etc, etc. Another point Chandler
>     made was that the bitcasts involved when a pointer isn't of the
>     right type results in extra IR instructions we don't really need.
>
>     So the general idea is that all pointers would just be called
>     "ptr" (pointer? void*?).
>
>     Is this something everyone feels is the right direction? Any
>     reason why it wouldn't be?
>
>     Beyond that, I'm trying to think about how to do this & I haven't
>     hit on a terribly convincing way to do this incrementally. I could
>     introduce the alternative form of "store" that provides the magic
>     pointer type, then set about adding overloads (is that possible?)
>     of any instruction consuming a pointer type, writing the usual
>     LLVM regression tests as I go. Eventually, once this looks like
>     it's functioning, I could start porting IRbuilder and Clang over
>     to the new store operations & other sources of pointers. Then
>     remove the old stuff.
>
>     Are IR instructions overloadable like this? If not, would it be
>     worthwhile to introduce separate names for the typeless-pointer
>     forms (gep_ptr, store_ptr, etc) as a temporary means to have both
>     sets of semantics then rename them all back once the old ones are
>     removed?
>
>     Other ideas/thoughts?
>
>
> I'm wondering how geps will work when the pointer type doesn't encode 
> the stride that each index must take. Maybe it would have to be 
> (strawman syntax) gep<%T> off of a typeless base pointer?
>
> -- Sean Silva
>
Or the offsets to gep could all be in bytes and you could introduce two 
new types of constants:  FieldOffset (type, field) and 
ArrayStride(element type) -- The ArrayStride constant would be used with 
multiply (and would probably have other uses).  I've seen this work well 
in other compilers and to be truthful GEP is a little weird for source 
languages that allow expression extents for aggregates.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150207/9cdaedeb/attachment.html>


More information about the llvm-dev mailing list