Hi Susan,<div><br></div><div>There is some high level documentation about the target independent code generator <a href="http://llvm.org/docs/CodeGenerator.html#register-allocator">here</a>, but it doesn't contain the specifics needed to build an allocator from scratch (e.g, it doesn't describe the issue you just encountered). In my experience the best option has been to just read the existing allocators and see how they work.</div>
<div><br></div><div>If your allocator project yields any documentation on building an LLVM register allocator, patches to our documentation are always welcome. Otherwise, I'll try to find time to distill the lessons from this thread and add them to the target independent code generator document. </div>
<div><br></div><div>Cheers,</div><div>Lang.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Dec 3, 2012 at 7:11 AM, Susan Horwitz <span dir="ltr"><<a href="mailto:horwitz@cs.wisc.edu" target="_blank">horwitz@cs.wisc.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Aha, yes, this is definitely helpful!<br>
      <br>
      Is there documentation on all this somewhere?  I still have errors
      for some large test inputs, and it would be nice if I didn't have
      to keep bugging you for information.<br>
      <br>
      Thanks!<span class="HOEnZb"><font color="#888888"><br>
      <br>
      Susan</font></span><div><div class="h5"><br>
      <br>
      On 12/2/2012 10:55 PM, Lang Hames wrote:<br>
    </div></div></div><div><div class="h5">
    <blockquote type="cite">
      
      Hi Susan,
      <div><br>
      </div>
      <div>Thanks for the clarification, and the test case. I think I
        know what the problem is now. Saving and restoring RBP is the
        job of the PEI (PrologEpilogInsertion) pass, which runs after
        register allocation. To determine which callee-saved physregs
        actually need to be saved it checks
        MachineRegisterInfo::isPhysRegOrOverlapUsed(unsigned reg). Your
        register allocator needs to notify MachineRegisterInfo about the
        physical registers that have been assigned by calling
        MachineRegisterInfo::setPhysRegUsed(unsigned reg).</div>
      <div><br>
      </div>
      <div>You only need to call setPhysRegUsed for the physregs that
        you actually use. You do not need to specify the aliasing
        registers.</div>
      <div><br>
      </div>
      <div>Hope this helps!</div>
      <div><br>
      </div>
      <div>Regards,</div>
      <div>Lang.</div>
      <div class="gmail_extra"><br>
        <br>
        <div class="gmail_quote">On Sat, Dec 1, 2012 at 9:31 AM, Susan
          Horwitz <span dir="ltr"><<a href="mailto:horwitz@cs.wisc.edu" target="_blank">horwitz@cs.wisc.edu</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote">
            <div>
              <div>
                <div>On 11/30/2012 6:36 PM, Lang Hames wrote:<br>
                </div>
                <blockquote type="cite"> <br>
                  <div><br>
                  </div>
                  <div>RBP is used as the frame pointer on x86 (hence
                    its automatic appearance in your code), and
                    shouldn't be allocated to any vreg in function bar.
                    Loading/saving RBP should be managed by the stack
                    frame setup/teardown code.</div>
                </blockquote>
                <blockquote type="cite">
                  <div>If it doesn't already, your allocator should
                    filter out reserved registers (See
                    MachineRegisterInfo::isReserved(unsigned preg)) when
                    assigning physregs.</div>
                </blockquote>
                <br>
              </div>
              I AM filtering out reserved registers. <br>
              <br>
              I am not allocating RBP in function bar, I am allocating
              EBP, because it is NOT in the list of reserved registers
              for function bar.<br>
              <br>
              Neither register RBP nor register EBP is saved/restored
              across the call from foo to bar, either by the code for
              the call or the code for entry to bar.<br>
              <br>
              The input C file that is causing this problem is flex.c
              (attached).  The calling function is "yyparse" and the
              called function is "scinstal".<br>
              <br>
              Here are the reserved registers for yyparse: { 7 44 54 106
              111 114 118 }<br>
              <br>
              Here are the reserved registers for scinstal: { 54 111 114
              }<br>
              <br>
              Register EBP is preg 44, which is NOT in the reserved list
              for scinstal (nor is it an alias of any of those reserved
              registers; the aliases are  { <a href="tel:50%2064%20117%20118" value="+15064117118" target="_blank">50 64 117 118</a> }).  I don;t know
              which preg corresponds to RBP.<br>
              <br>
              You say that RBP should be saved/restored across the
              call.  I tried to generate that code, but, as I said in my
              previous mail,  I don't know how to get the appropriate
              TargetRegisterClass (needed to call
              CreateSpillStackObject).   Should I instead be generating
              code to save register EBP at the start of scinstal,
              restoring it at the end of that function?<span><br>
                <br>
                Susan</span>
              <div><br>
                <br>
                <blockquote type="cite">
                  <div><br>
                  </div>
                  <div><span>ArrayRef<MCPhysReg> pregs =
                      TRC->getRawAllocationOrder(&MF);</span></div>
                  <div><span>for (int i = 0; i < pregs.size(); ++i) {</span></div>
                  <div><span>  if (MRI->isReserved(pregs[i]))</span></div>
                  <div><span>    continue;</span></div>
                  <div><span>  // use preg...</span></div>
                  <div><span>}</span></div>
                  <div><br>
                  </div>
                  <div>You could also use the AllocationOrder class to
                    simplify the task of finding valid pregs, though it
                    does require you to use VirtRegMap. </div>
                  <div><br>
                  </div>
                  <div>If you are already checking the reserved regs
                    then I've misdiagnosed the problem. I'd be happy to
                    dig further if you can point me to a copy of your
                    allocator and a test case.</div>
                  <div><br>
                  </div>
                  <div>Cheers,</div>
                  <div>Lang.</div>
                  <div class="gmail_extra"><br>
                    <br>
                    <div class="gmail_quote">On Thu, Nov 29, 2012 at
                      3:49 PM, Susan Horwitz <span dir="ltr"><<a href="mailto:horwitz@cs.wisc.edu" target="_blank">horwitz@cs.wisc.edu</a>></span>
                      wrote:<br>
                      <blockquote class="gmail_quote">I have a new
                        problem: Register RBP is used in a function foo.
                         (I am not allocating RBP to any virtual
                        register, the instances of RBP in function foo
                        are in the machine code when my register
                        allocator starts.)<br>
                        <br>
                        Function foo calls function bar.  Register RBP
                        is not saved across the call, though it is live
                        after the call.  Function bar includes a virtual
                        register.  The code that I'm using to find the
                        registers available to be allocated to that
                        virtual register includes EBP in that
                        available-preg set.  This is a disaster, since
                        writing into EBP clobbers RBP.<br>
                        <br>
                        I tried to add code to save all live physical
                        registers across calls, but I don't know how to
                        get the appropriate TargetRegisterClass (needed
                        to call CreateSpillStackObject).<br>
                        <br>
                        Is there a different way to save/restore RBP
                        across calls?  Or a way to get its
                        TargetRegisterClass?<span><br>
                          <br>
                          Susan<br>
                        </span></blockquote>
                    </div>
                    <br>
                  </div>
                </blockquote>
                <br>
              </div>
            </div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br></div>