<br><br><div class="gmail_quote">On Mon, May 16, 2011 at 12:40 PM, Villmow, Micah <span dir="ltr"><<a href="mailto:Micah.Villmow@amd.com">Micah.Villmow@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Justin,</span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> We have the same issue with the AMDIL code generator. We tried #1, but there are passes after register allocator that don’t like virtual registers. #3 could be done by having the two spill functions [load|store]Reg[From|To]StackSlot keep track of the FrameIndex to register mapping internally, but again, more of a hack than a proper solution.</span></p>
</div></div></blockquote><div><br></div><div>After reading Jakob's comments, I think (3) may end up being the best in the long term.  I'll definitely post any results to the list!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">My solution was to just create a very large register file, 768 registers, that no sane kernel would ever reach and then do register allocation within that. A simple script that is run at compile time to generate the tables into a separate .td file and have that included in the necessary locations is all that is needed so it doesn’t bloat the code.</span></p>
</div></div></blockquote><div><br></div><div>That is essentially what happens now, the only difference being the register description file is generated during dev-time instead of compile-time.  I just feel there should be a more "scalable" approach.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Micah</span></p><div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt"><div><div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> <a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank">llvmdev-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:llvmdev-bounces@cs.uiuc.edu" target="_blank">llvmdev-bounces@cs.uiuc.edu</a>] <b>On Behalf Of </b>Justin Holewinski<br>
<b>Sent:</b> Monday, May 16, 2011 6:52 AM<br><b>To:</b> LLVM Developers Mailing List<br><b>Subject:</b> [LLVMdev] TargetRegisterInfo and "infinite" register files</span></p></div></div><div><div></div><div class="h5">
<p class="MsoNormal"> </p><p class="MsoNormal">Currently, the TableGen register info files for all of the back-ends define concrete registers and divide them into logical register classes.  I would like to get some input from the LLVM experts around here on how best to map this model to an architecture that does *not* have a concrete, pre-defined register file.  The architecture is PTX, which is more of an intermediate form than a final assembly language.  The format is essentially three-address code, with "virtual" registers instead of "physical" registers.  After PTX code generation, the PTX assembly is compiled to a device binary with a proprietary tool (ptxas) that does final register allocation (based on device and user constraints).  However, exploiting register re-use at the LLVM/PTX level has shown performance improvement over blindly using a new "physical" register for each def and letting ptxas figure out all of the register allocation details, so I would like to take advantage of the LLVM register allocation infrastructure if at all possible.</p>
<div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Generally stated, I would like to solve the register allocation problem as "allocate the minimum number of registers from an arbitrary set without spill code" instead of the more traditional "allocate the minimum number of registers from a fixed set."</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">The current implementation defines an arbitrary set of registers that the register allocator can use during code-gen.  This works, but is not scalable.  If the register allocator runs out of registers, spill code must be generated.  However, the "optimal" solution in this case would be to extend the register file.  A few alternatives I have come up with are:</p>
</div><div><ol start="1" type="1"><li class="MsoNormal">Bypass register allocation completely and just emit virtual registers,</li><li class="MsoNormal">Remove register definitions from the TableGen files and create them at run-time using the virtual register counts as an upper bound on the number of registers needed, or</li>
<li class="MsoNormal">Keep a small set of pre-defined physical registers, and craft spill code that really just puts a new register definition in the final PTX and copies to/from this register when spilling/restoring is needed</li>
</ol><div><p class="MsoNormal">I hesitate to use (1) or (3) as they rely too heavily on the final ptxas tool to perform reasonable register allocation, which may not lead to optimal code.  Option (2) seems promising, though I worry about the feasibility of the approach.  Specifically, I am not yet sure if generating TargetRegisterInfo and TargetRegisterClass instances on-the-fly will fit into the existing architecture.</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Any thoughts from the experts out there?  Specifically, I am interested in any non-trivial pros/cons for any of these approaches, or any new approaches I have not considered.</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Thanks!</p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><br clear="all"><br>-- </p><div><p class="MsoNormal">
Thanks,</p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Justin Holewinski</p></div><p class="MsoNormal"> </p></div></div></div></div></div></div></div></blockquote></div><br><br clear="all"><br>-- <br>
<br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div><br>