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

Susan Horwitz horwitz at cs.wisc.edu
Sun Nov 4 14:08:43 PST 2012


My tst.bc is attached.  I had to use ssh to copy it from my office 
machine to my home laptop.  In case that corrupts it, I also put a copy 
here:
     http://pages.cs.wisc.edu/~horwitz/LANG/tst.bc

I created the file like this:

clang -emit-llvm -O0 -c tst.c -o tst.bc
opt -mem2reg tst.bc > tst.mem2reg
mv tst.mem2reg tst.bc


Susan

On 11/4/2012 3:27 PM, Lang Hames wrote:
> Hi Susan,
>
> I tested the version of Gcra.cpp that I sent you on x86-64 systems 
> running MacOS 10.8 and Ubuntu 12.04 (Linux 3.2.0).
>
> Could you send me the bitcode file you're compiling? Different 
> bitcodes (due to different clang versions or applied optimizations) 
> could account for the different results we're seeing. For reference 
> I've attached the *.ll file that I have tested with, which was 
> compiled from your tst.c file with:
>
> clang -O0 -emit-llvm -S -o tst.ll tst.c
>
> My clang version was built from a recent checkout from subversion.
>
> It's unlikely that there is any fundamental problem with the register 
> allocation APIs or the code generator that would prevent you from 
> building a working allocator. The APIs certainly could have changed in 
> a way that would break existing allocators though.
>
> - Lang.
>
>
> On Sat, Nov 3, 2012 at 4:34 PM, Susan Horwitz <horwitz at cs.wisc.edu 
> <mailto:horwitz at cs.wisc.edu>> wrote:
>
>     Lang -
>
>     Your version does NOT work for me (i.e., I still get an error from
>     the assembler when I run your code on my tst.c) unless I force
>     compilation and assembly for a 32-bit X86 machine:
>
>       llc -march=x86 -regalloc=gc tst.bc
>       gcc -m32 tst.s
>
>     My machine is a 64-bit machine.  Maybe you are working with a
>     different architecture and that's why it worked for you?
>
>     I would be happy if the above worked in general, but when I try
>     other C code (with my "real" register allocator, not the naive one
>     I sent you) I get assembly that includes
>
>         %r8d
>
>     which seems to be invalid for a 32-bit machine.  Sigh. It looks to
>     me like there's a problem with the LLVM-3.1 API for register
>     allocation and/or the code-generation phase.  What do you think?
>
>     Susan
>
>
>     On 11/1/2012 5:28 PM, Lang Hames wrote:
>>     Hi Susan,
>>
>>     Without debugging symbols I can't make much out of that stack
>>     trace I'm afraid.
>>
>>     I've attached my modified version of Gcra.cpp. I built llvm 3.1
>>     by dropping this file into lib/CodeGen, and adding references to
>>     createGcra to include/lib/CodeGen/Passes.h and
>>     include/lib/CodeGen/LinkAllCodeGenComponents.h. (If you search
>>     for createRegAllocPBQP you'll see where to add the declarations).
>>
>>     With that setup, running your allocator on the tst.c file you
>>     attached previously yielded a sane assembly file.
>>
>>     Cheers,
>>     Lang.
>>
>>     On Thu, Nov 1, 2012 at 3:13 PM, Susan Horwitz
>>     <horwitz at cs.wisc.edu <mailto:horwitz at cs.wisc.edu>> wrote:
>>
>>         I still get a coredump:
>>
>>         0 libLLVM-3.1.so <http://libLLVM-3.1.so>  0x00007f0158a4e67f
>>         1 libLLVM-3.1.so <http://libLLVM-3.1.so>  0x00007f0158a500ca
>>         2  libpthread.so.0 0x0000003a86c0f500
>>         3 libLLVM-3.1.so <http://libLLVM-3.1.so>  0x00007f01583c346c
>>         4 libLLVM-3.1.so <http://libLLVM-3.1.so>  0x00007f0158546349
>>         llvm::FPPassManager::runOnFunction(llvm::Function&) + 521
>>         5 libLLVM-3.1.so <http://libLLVM-3.1.so>  0x00007f01585463e3
>>         llvm::FPPassManager::runOnModule(llvm::Module&) + 51
>>         6 libLLVM-3.1.so <http://libLLVM-3.1.so>  0x00007f0158545fae
>>         llvm::MPPassManager::runOnModule(llvm::Module&) + 462
>>         7 libLLVM-3.1.so <http://libLLVM-3.1.so>  0x00007f01585460bd
>>         llvm::PassManagerImpl::run(llvm::Module&) + 125
>>         8  llc             0x000000000040b012 main + 5218
>>         9  libc.so.6       0x0000003a8601ecdd __libc_start_main + 253
>>         10 llc             0x0000000000407d79
>>         Stack dump:
>>         0.      Program arguments: llc -load Debug/lib/P4.so
>>         -regalloc=gc tst.bc
>>         1.      Running pass 'Function Pass Manager' on module 'tst.bc'.
>>         2.      Running pass 'Machine Loop Invariant Code Motion' on
>>         function '@main'
>>         make: *** [tst.reg] Segmentation fault (core dumped)
>>
>>
>>
>>         On 11/01/2012 04:59 PM, Lang Hames wrote:
>>
>>             Hi Susan,
>>
>>             Sorry - I had missed that you're using llvm-3.1, rather
>>             than the
>>             development branch. We encourage people to live on
>>             top-of-tree - it's
>>             well tested, easier for active developers to offer help
>>             with, and
>>             keeping up with incremental changes is often easier than
>>             porting between
>>             stable versions.
>>
>>             It also sounds like you were building a Release version
>>             of LLVM. That
>>             will not have any asserts enabled (though it will have
>>             some other
>>             diagnostics). You will probably want to work with a
>>             Debug+Asserts
>>             version (<src>/configure --disable-optimized
>>             --enable-assertions) while
>>             you're developing your allocator and watch for any
>>             asserts that trigger.
>>
>>             In your case the Assertion that is triggering in PEI
>>             indicates that the
>>             MachineRegisterInfo object still contained some virtregs post
>>             register-allocation. You need to call
>>             MRI->clearVirtRegs() at the end of
>>             your allocator.
>>
>>             Hope this helps!
>>
>>             Cheers,
>>             Lang.
>>
>>             On Thu, Nov 1, 2012 at 2:41 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:
>>
>>                 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>
>>             <mailto:horwitz at cs.wisc.edu <mailto:horwitz at cs.wisc.edu>>
>>                     <mailto:horwitz at cs.wisc.edu
>>             <mailto:horwitz at cs.wisc.edu> <mailto: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>>
>>                     <mailto:horwitz at cs.wisc.edu
>>             <mailto:horwitz at cs.wisc.edu> <mailto:horwitz at cs.wisc.edu
>>             <mailto:horwitz at cs.wisc.edu>>>
>>                     <mailto:horwitz at cs.wisc.edu
>>             <mailto:horwitz at cs.wisc.edu> <mailto:horwitz at cs.wisc.edu
>>             <mailto:horwitz at cs.wisc.edu>>
>>                     <mailto: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>>
>>                     <mailto:LLVMdev at cs.uiuc.edu
>>             <mailto:LLVMdev at cs.uiuc.edu> <mailto:LLVMdev at cs.uiuc.edu
>>             <mailto:LLVMdev at cs.uiuc.edu>>>
>>                     <mailto:LLVMdev at cs.uiuc.edu
>>             <mailto:LLVMdev at cs.uiuc.edu> <mailto:LLVMdev at cs.uiuc.edu
>>             <mailto:LLVMdev at cs.uiuc.edu>>
>>                     <mailto: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
>>                     <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>>
>>
>>
>>
>>
>>
>>
>>
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121104/96898448/attachment.html>
-------------- next part --------------
BCÀÞ!
  Ì        ?#?AÈI29??
%
?b?EB?
B¤28I
2D$H
?!#ÄR?
!r$ÈHb¨ ¨@Æð   I  	   
?ÿÿÿÿÀA?F ? ?? ? ?Äÿÿÿÿ`  ?      2"H	 d??"¤??"ã?¡?L??
?¤LHs`??Â
??H	 ? s 0G¥¤À"V?ÈM    0|À;ø; ?6¨wXwx?{p?6`?tp?zÀ?68w¨?
1Qm z`t v@z`tÐéz?z?m?x x xÐév q`zvÐé0r s z0rÐé`t v@z`tÐæ0r s z0rÐæ`t v@z`tÐö`t v@z`tÐör?zr?zr?mp p v@m0p v@z`tÐæ?p q x q xÐî?zv s z`tгr?:dH #DD?
?É  @°#)?#	  ?(     0Di?    ?!Ê     d?     2
?
L??	&GÆC
c	
ED?    y  
   3?
Äá
f=?C8?Ã?B?yxs?q
æ íô?3
B
ÂÁ
Ρ
  q      1 ÒøÆâÀòQ`6?-KÅø
Áæ?4Âû?ð>¢ãF`<ÒL?	
?4@øÒ  a   !   E,      F J ??Ö ©? 4?QÀ
¶     3?
÷¤
1@ `?
&Yf	??
à ®a¸!RÐ`?A ¤???7<ÇDÔ1( ?hªY?Á"³A
á@      1 >m?±8°ü@            


More information about the llvm-dev mailing list