[LLVMdev] problem trying to write an LLVM register-allocation pass

Susan Horwitz horwitz at cs.wisc.edu
Thu Nov 1 14:41:51 PDT 2012


Hi again Lang,

I decided to try the approach you proposed to see whether it makes the 
assembly-code problem go away.  Again, I tried a very simple register 
allocator (attached) that just calls vrm.assignVirt2Phys for every vreg 
in each function, mapping the vreg to the first preg in the register 
class.  I tried two versions: one maps *every* vreg, and the other only 
maps those for which MRI->reg_empty(vreg) returns false.  In both cases 
I get a core dump somewhere after my reg-allocation pass has run (when I 
use the "tst.c" file that I sent last time as input).

Note also that there is no VirtRegMap.h in the "include" directory of my 
installed llvm-3.1.  I had to copy that file from the source directory. 
  That seems suspicious.

Any thoughts?

Thanks!

Susan

On 10/31/2012 07:51 PM, Lang Hames wrote:
> Hi Susan,
>
> I'm having trouble reproducing that error on my end, but I think the
> problem is probably that you're not using the VirtRegRewriter
> infrastructure. What your allocator needs to do is populate the virtual
> register mapping (VirtRegMap pass) with your allocation, rather than
> rewriting the registers directly through MachineRegisterInfo.
>
> Have your allocator require and preserve the VirtRegMap pass, then in
> your runOnMachineFunction pass grab a reference to the pass with:
>
> VirtRegMap &vrm = getAnalysis<VirtRegMap>();
>
> You can then describe your register allocations with:
>
> vrm.assignVirt2Phys(<virtreg>, <physreg>)
>
> The VirtRegRewriter pass (in VirtRegMap.cpp) will run after your
> allocator and apply the mapping that you described in the VirtRegMap.
>
> I hope this helps. Let me know if it doesn't fix your issue.
>
> Cheers,
> Lang.
>
> On Wed, Oct 31, 2012 at 3:54 PM, Susan Horwitz <horwitz at cs.wisc.edu
> <mailto:horwitz at cs.wisc.edu>> wrote:
>
>     Thanks Lang!
>
>     Here's another question: I'm trying to process this input:
>
>     int main() {
>        return 0;
>     }
>
>     but I'm getting an error
>       Assertion `!Fn.getRegInfo(). getNumVirtRegs() && "Regalloc must
>     assign all vregs"' failed.
>
>     At the start of runOnMachineFunction I call Fn.getRegInfo().
>     getNumVirtRegs();
>     and find that there is 1 virtual register.  However,
>       MRI->reg_empty(vreg)
>     tells me that it is not used or defined.  So my register-allocation
>     code never sees it, and thus can't allocate a preg for it.  I tried
>     using MRI->replaceRegWith(vreg, preg);
>     (where preg is available to vreg's register class) but that didn't
>     work.  When I look, the number of vregs in the function is still 1.
>
>     Can you help with this?
>
>     Thanks again!
>
>     Susan
>
>
>     On 10/31/2012 04:55 PM, Lang Hames wrote:
>
>         Hi Susan,
>
>         The meaning of "addRequired(X)" is that your pass needs X to be
>         run, and
>         for X to be preserved by all passes that run after X and before your
>         pass. The PHIElemination and TwoAddressInstruction passes do not
>         preserve each other, hence there's no way for the pass manager to
>         schedule them for you if you addRequire(...) them.
>
>         The trick is that CodeGen will schedule both of these passes to
>         be run
>         before _any_ register allocation pass (see Passes.cpp), so you
>         needn't
>         require them explicitly - you can just assume they have been
>         run. If you
>         just remove those lines from your getAnalysisUsage method your pass
>         should now run as you expect.
>
>         Cheers,
>         Lang.
>
>         On Wed, Oct 31, 2012 at 1:46 PM, Susan Horwitz
>         <horwitz at cs.wisc.edu <mailto:horwitz at cs.wisc.edu>
>         <mailto:horwitz at cs.wisc.edu <mailto:horwitz at cs.wisc.edu>>> wrote:
>
>              I'm trying to write a MachineFunctionPass to do register
>         allocation.
>                I have code that worked with an old version of LLVM.  It
>         does not
>              work with llvm-3.1. (or various other versions that I've
>         tried).
>
>              The first problem is that including this line:
>
>                AU.addRequiredID(__ TwoAddressInstructionPassID);
>
>
>              in method getAnalysisUsage causes a runtime error:
>
>              Unable to schedule 'Eliminate PHI nodes for register
>         allocation'
>              required by 'Unnamed pass: implement Pass::getPassName()'
>              Unable to schedule pass
>              UNREACHABLE executed at ...
>
>              I'm invoking the pass like this (given input file foo.c):
>
>              clang -emit-llvm -O0 -c foo.c -o foo.bc
>              opt -mem2reg foo.bc > foo.ssa
>              mv foo.ssa foo.bc
>              llc -load Debug/lib/P4.so -regalloc=gc foo.bc
>
>
>              I've attached my entire file (it's very short).  Any help
>         would be
>              much appreciated!
>
>              Susan Horwitz
>
>              ______________________________ _________________
>              LLVM Developers mailing list
>         LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>         <mailto:LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>>
>         http://llvm.cs.uiuc.edu
>         http://lists.cs.uiuc.edu/ mailman/listinfo/llvmdev
>         <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>
>
>
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: Gcra.cpp
Type: text/x-c++src
Size: 8001 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121101/8d008a71/attachment.cpp>


More information about the llvm-dev mailing list