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" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000"><div class="im">
    <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 class="HOEnZb"><font color="#888888"><br>
    <br>
    Susan</font></span><div class="im"><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>