<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 2/6/15 7:26 PM, Sean Silva wrote:<br>
</div>
<blockquote
cite="mid:CAHnXoakBbQa__eEt9LpWQXYDV37+PKwRDDGq=6f4sF-qQZYtDQ@mail.gmail.com"
type="cite">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Fri, Feb 6, 2015 at 3:38 PM, David
Blaikie <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr">It's an idea been thrown around in a few
different threads (including Rafael's recent <a
moz-do-not-send="true"
href="http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20141201/247285.html"
target="_blank">http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20141201/247285.html</a>
and Chandler's <a moz-do-not-send="true"
href="http://llvm.org/viewvc/llvm-project?rev=226781&view=rev"
target="_blank">http://llvm.org/viewvc/llvm-project?rev=226781&view=rev</a>
) 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.<br>
<br>
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.<br>
<br>
So the general idea is that all pointers would just be
called "ptr" (pointer? void*?).<br>
<br>
Is this something everyone feels is the right direction?
Any reason why it wouldn't be?<br>
<br>
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.<br>
<br>
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?<br>
<br>
Other ideas/thoughts?</div>
</blockquote>
<div><br>
</div>
<div>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?</div>
<div><br>
</div>
<div>-- Sean Silva</div>
<br>
</div>
</div>
</div>
</blockquote>
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.<br>
</body>
</html>