<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>