Dear LLVM guys, I am getting an error with my pass implementation, and I cannot figure it out. Basically, I've implemented part of a register allocation algorithm, but I am having problems to set the passes correctly. For instance, for this program below, the following error message is produced: .c ----------------------| .bc --------------------------------- | Live Outs: EAX | #include <stdio.h> | entry (0x8d4c6c0, LLVM BB @0x8d46970): | FNSTCW16m <fi#0>, 1, %NOREG, 0 int main() { | MOV8mi <fi#0>, 1, %NOREG, 1, 2 return 0; | FLDCW16m <fi#0>, 1, %NOREG, 0 } | %reg1024 = MOV32r0 | %EAX = MOV32rr %reg1024 | RET llc((anonymous namespace)::PrintStackTrace()+0x18)[0x88cfa30] llc((anonymous namespace)::SignalHandler(int)+0x107)[0x88cfcc1] /lib/tls/libc.so.6[0x239f48] llc(llvm::MachineFunctionPass::runOnFunction(llvm::Function&)+0x28)[0x8400638] llc(llvm::FunctionPassManagerT::runPass(llvm::FunctionPass*, llvm::Function*)+0x1b)[0x8857349] llc(llvm::PassManagerT<llvm::FTraits>::runPasses(llvm::Function*, std::map<llvm::Pass*, std::vector<llvm::Pass*, std::allocator<llvm::Pass*>>, std::less<llvm::Pass*>, std::allocator<std::pair<llvm::Pass* const,std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > > >>&)+0x11c)[0x8858bca]llc(llvm::PassManagerT<llvm::FTraits>::runOnUnit(llvm::Function*)+0x16f)[0x885865f] llc(llvm::FunctionPassManagerT::runOnFunction(llvm::Function&)+0x22)[0x8858e84] llc(llvm::FunctionPass::runOnModule(llvm::Module&)+0xa6)[0x8854bd2] llc(llvm::ModulePassManager::runPass(llvm::ModulePass*, llvm::Module*)+0x1b)[0x8857541] llc(llvm::PassManagerT<llvm::MTraits>::runPasses(llvm::Module*, std::map<llvm::Pass*, std::vector<llvm::Pass*, std::allocator<llvm::Pass*>>, std::less<llvm::Pass*>, std::allocator<std::pair<llvm::Pass* const,std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > > >>&)+0x11c)[0x88596cc]llc(llvm::PassManagerT<llvm::MTraits>::runOnUnit(llvm::Module*)+0x16f)[0x8859161] llc(llvm::ModulePassManager::runOnModule(llvm::Module&)+0x22)[0x8853bea] llc(llvm::PassManager::run(llvm::Module&)+0x1f)[0x8853f81] llc(main+0xee2)[0x83d36ea] /lib/tls/libc.so.6(__libc_start_main+0xe4)[0x227ad4] llc[0x83d2779] Segmentation fault (core dumped) ------------------------------------------------------------------------------ My allocator is assigning EAX to %reg1024, and this is exactly what any of the LLVM built-in allocators do. The list of passes that I am invoking is as follows: Pass Arguments: -verify -loopsimplify -loop-reduce -lowergc -lowerinvoke -unreachableblockelim Target Data Layout Debug Information Module Pass Manager Function Pass Manager Immediate Dominators Construction ET Forest Construction Module Verifier -- Module Verifier Natural Loop Construction Dominator Set Construction Dominator Tree Construction -- Immediate Dominators Construction Canonicalize natural loops -- Dominator Set Construction -- Dominator Tree Construction Scalar Evolution Analysis Loop Strength Reduction -- ET Forest Construction -- Scalar Evolution Analysis -- Canonicalize natural loops -- Loop Strength Reduction -- Natural Loop Construction Lower GC intrinsics, for GCless code generators -- Lower GC intrinsics, for GCless code generators Lower invoke and unwind, for unwindless code generators -- Lower invoke and unwind, for unwindless code generators Remove unreachable blocks from the CFG -- Remove unreachable blocks from the CFG X86 DAG->DAG Instruction Selection -- X86 DAG->DAG Instruction Selection **************** Due to my register allocator ******************* Immediate Dominators Construction ET Forest Construction -- Immediate Dominators Construction Natural Loop Construction -- ET Forest Construction Virtual to def/use mapping - Fernando. -- Natural Loop Construction Edge liveness analyses - Fernando. Register allocation via coloring of chordal graphs. -- Register allocation via coloring of chordal graphs. -- Virtual to def/use mapping - Fernando. -- Edge liveness analyses - Fernando. ***************************************************************** Live Variable Analysis X86 FP Stackifier -- X86 FP Stackifier -- Live Variable Analysis Prolog/Epilog Insertion & Frame Finalization -- Prolog/Epilog Insertion & Frame Finalization X86 AT&T-Style Assembly Printer -- X86 AT&T-Style Assembly Printer Machine Code Deleter -- Machine Code Deleter Could some one tell me what is(are) the most likely reason(s) for this error? I would really appreciate any help, Thanks a lot, Fernando
On Fri, 23 Jun 2006, Fernando Magno Quintao Pereira wrote:> I am getting an error with my pass implementation, and I cannot figure > it out. Basically, I've implemented part of a register allocation > algorithm, but I am having problems to set the passes correctly. For > instance, for this program below, the following error message is > produced:It's hard to say without more details, i.e. a stack trace in gdb. What pass is it crashing in, for example? -Chris> .c ----------------------| .bc --------------------------------- > | Live Outs: EAX > | > #include <stdio.h> | entry (0x8d4c6c0, LLVM BB @0x8d46970): > | FNSTCW16m <fi#0>, 1, %NOREG, 0 > int main() { | MOV8mi <fi#0>, 1, %NOREG, 1, 2 > return 0; | FLDCW16m <fi#0>, 1, %NOREG, 0 > } | %reg1024 = MOV32r0 > | %EAX = MOV32rr %reg1024 > | RET > > llc((anonymous namespace)::PrintStackTrace()+0x18)[0x88cfa30] > llc((anonymous namespace)::SignalHandler(int)+0x107)[0x88cfcc1] > /lib/tls/libc.so.6[0x239f48] > llc(llvm::MachineFunctionPass::runOnFunction(llvm::Function&)+0x28)[0x8400638] > llc(llvm::FunctionPassManagerT::runPass(llvm::FunctionPass*, > llvm::Function*)+0x1b)[0x8857349] > llc(llvm::PassManagerT<llvm::FTraits>::runPasses(llvm::Function*, > std::map<llvm::Pass*, std::vector<llvm::Pass*, std::allocator<llvm::Pass*> >> , std::less<llvm::Pass*>, std::allocator<std::pair<llvm::Pass* const, > std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > > > >> &)+0x11c)[0x8858bca] > llc(llvm::PassManagerT<llvm::FTraits>::runOnUnit(llvm::Function*)+0x16f)[0x885865f] > llc(llvm::FunctionPassManagerT::runOnFunction(llvm::Function&)+0x22)[0x8858e84] > llc(llvm::FunctionPass::runOnModule(llvm::Module&)+0xa6)[0x8854bd2] > llc(llvm::ModulePassManager::runPass(llvm::ModulePass*, > llvm::Module*)+0x1b)[0x8857541] > llc(llvm::PassManagerT<llvm::MTraits>::runPasses(llvm::Module*, > std::map<llvm::Pass*, std::vector<llvm::Pass*, std::allocator<llvm::Pass*> >> , std::less<llvm::Pass*>, std::allocator<std::pair<llvm::Pass* const, > std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > > > >> &)+0x11c)[0x88596cc] > llc(llvm::PassManagerT<llvm::MTraits>::runOnUnit(llvm::Module*)+0x16f)[0x8859161] > llc(llvm::ModulePassManager::runOnModule(llvm::Module&)+0x22)[0x8853bea] > llc(llvm::PassManager::run(llvm::Module&)+0x1f)[0x8853f81] > llc(main+0xee2)[0x83d36ea] > /lib/tls/libc.so.6(__libc_start_main+0xe4)[0x227ad4] > llc[0x83d2779] > Segmentation fault (core dumped) > ------------------------------------------------------------------------------ > > My allocator is assigning EAX to %reg1024, and this is exactly what any of > the LLVM built-in allocators do. The list of passes that I am invoking is > as follows: > > Pass Arguments: -verify -loopsimplify -loop-reduce -lowergc -lowerinvoke > -unreachableblockelim > Target Data Layout > Debug Information > Module Pass Manager > Function Pass Manager > Immediate Dominators Construction > ET Forest Construction > Module Verifier > -- Module Verifier > Natural Loop Construction > Dominator Set Construction > Dominator Tree Construction > -- Immediate Dominators Construction > Canonicalize natural loops > -- Dominator Set Construction > -- Dominator Tree Construction > Scalar Evolution Analysis > Loop Strength Reduction > -- ET Forest Construction > -- Scalar Evolution Analysis > -- Canonicalize natural loops > -- Loop Strength Reduction > -- Natural Loop Construction > Lower GC intrinsics, for GCless code generators > -- Lower GC intrinsics, for GCless code generators > Lower invoke and unwind, for unwindless code generators > -- Lower invoke and unwind, for unwindless code generators > Remove unreachable blocks from the CFG > -- Remove unreachable blocks from the CFG > X86 DAG->DAG Instruction Selection > -- X86 DAG->DAG Instruction Selection > **************** Due to my register allocator ******************* > Immediate Dominators Construction > ET Forest Construction > -- Immediate Dominators Construction > Natural Loop Construction > -- ET Forest Construction > Virtual to def/use mapping - Fernando. > -- Natural Loop Construction > Edge liveness analyses - Fernando. > Register allocation via coloring of chordal graphs. > -- Register allocation via coloring of chordal graphs. > -- Virtual to def/use mapping - Fernando. > -- Edge liveness analyses - Fernando. > ***************************************************************** > Live Variable Analysis > X86 FP Stackifier > -- X86 FP Stackifier > -- Live Variable Analysis > Prolog/Epilog Insertion & Frame Finalization > -- Prolog/Epilog Insertion & Frame Finalization > X86 AT&T-Style Assembly Printer > -- X86 AT&T-Style Assembly Printer > Machine Code Deleter > -- Machine Code Deleter > > Could some one tell me what is(are) the most likely reason(s) for this > error? I would really appreciate any help, > > Thanks a lot, > > Fernando > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-Chris -- http://nondot.org/sabre/ http://llvm.org/
Dear LLVM guys, I've solved my problem with the passes, and compiled my first code using the new register allocator! Debugging was quite easy, using gdb. The problem was that I was forgetting to initialize the array that records the physical registers ever used (MachineFunction::UsedPhysRegs). This is a very minor thing, but I would suggest asserting that the vector has been initialized before it is used in functions such as runOnMachineFunction::X86FloatingPoint.cpp or PPCRegisterInfo::emitPrologue. Now I have another question. My register allocator is generating code like this: .text .align 16 .globl main main: subl $2, %esp fnstcw (%esp) movb $2, 1(%esp) fldcw (%esp) xorl %eax, %eax movl %eax, %eax <---------------------- addl $2, %esp ret .size main, .-main Whereas RegAllocLocal.cpp is producing this one here: .text .align 16 .globl main main: subl $2, %esp fnstcw (%esp) movb $2, 1(%esp) fldcw (%esp) xorl %eax, %eax addl $2, %esp ret .size main, .-main Is it the "Two-Address instruction pass" that is removing that move marked above? Thanks a lot, Fernando> On Fri, 23 Jun 2006, Fernando Magno Quintao Pereira wrote: > > I am getting an error with my pass implementation, and I cannot figure > > it out. Basically, I've implemented part of a register allocation > > algorithm, but I am having problems to set the passes correctly. For > > instance, for this program below, the following error message is > > produced: > > It's hard to say without more details, i.e. a stack trace in gdb. What > pass is it crashing in, for example? > > -Chris > > > .c ----------------------| .bc --------------------------------- > > | Live Outs: EAX > > | > > #include <stdio.h> | entry (0x8d4c6c0, LLVM BB @0x8d46970): > > | FNSTCW16m <fi#0>, 1, %NOREG, 0 > > int main() { | MOV8mi <fi#0>, 1, %NOREG, 1, 2 > > return 0; | FLDCW16m <fi#0>, 1, %NOREG, 0 > > } | %reg1024 = MOV32r0 > > | %EAX = MOV32rr %reg1024 > > | RET > > > > llc((anonymous namespace)::PrintStackTrace()+0x18)[0x88cfa30] > > llc((anonymous namespace)::SignalHandler(int)+0x107)[0x88cfcc1] > > /lib/tls/libc.so.6[0x239f48] > > llc(llvm::MachineFunctionPass::runOnFunction(llvm::Function&)+0x28)[0x8400638] > > llc(llvm::FunctionPassManagerT::runPass(llvm::FunctionPass*, > > llvm::Function*)+0x1b)[0x8857349] > > llc(llvm::PassManagerT<llvm::FTraits>::runPasses(llvm::Function*, > > std::map<llvm::Pass*, std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > >> , std::less<llvm::Pass*>, std::allocator<std::pair<llvm::Pass* const, > > std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > > > > >> &)+0x11c)[0x8858bca] > > llc(llvm::PassManagerT<llvm::FTraits>::runOnUnit(llvm::Function*)+0x16f)[0x885865f] > > llc(llvm::FunctionPassManagerT::runOnFunction(llvm::Function&)+0x22)[0x8858e84] > > llc(llvm::FunctionPass::runOnModule(llvm::Module&)+0xa6)[0x8854bd2] > > llc(llvm::ModulePassManager::runPass(llvm::ModulePass*, > > llvm::Module*)+0x1b)[0x8857541] > > llc(llvm::PassManagerT<llvm::MTraits>::runPasses(llvm::Module*, > > std::map<llvm::Pass*, std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > >> , std::less<llvm::Pass*>, std::allocator<std::pair<llvm::Pass* const, > > std::vector<llvm::Pass*, std::allocator<llvm::Pass*> > > > > >> &)+0x11c)[0x88596cc] > > llc(llvm::PassManagerT<llvm::MTraits>::runOnUnit(llvm::Module*)+0x16f)[0x8859161] > > llc(llvm::ModulePassManager::runOnModule(llvm::Module&)+0x22)[0x8853bea] > > llc(llvm::PassManager::run(llvm::Module&)+0x1f)[0x8853f81] > > llc(main+0xee2)[0x83d36ea] > > /lib/tls/libc.so.6(__libc_start_main+0xe4)[0x227ad4] > > llc[0x83d2779] > > Segmentation fault (core dumped) > > ------------------------------------------------------------------------------ > > > > My allocator is assigning EAX to %reg1024, and this is exactly what any of > > the LLVM built-in allocators do. The list of passes that I am invoking is > > as follows: > > > > Pass Arguments: -verify -loopsimplify -loop-reduce -lowergc -lowerinvoke > > -unreachableblockelim > > Target Data Layout > > Debug Information > > Module Pass Manager > > Function Pass Manager > > Immediate Dominators Construction > > ET Forest Construction > > Module Verifier > > -- Module Verifier > > Natural Loop Construction > > Dominator Set Construction > > Dominator Tree Construction > > -- Immediate Dominators Construction > > Canonicalize natural loops > > -- Dominator Set Construction > > -- Dominator Tree Construction > > Scalar Evolution Analysis > > Loop Strength Reduction > > -- ET Forest Construction > > -- Scalar Evolution Analysis > > -- Canonicalize natural loops > > -- Loop Strength Reduction > > -- Natural Loop Construction > > Lower GC intrinsics, for GCless code generators > > -- Lower GC intrinsics, for GCless code generators > > Lower invoke and unwind, for unwindless code generators > > -- Lower invoke and unwind, for unwindless code generators > > Remove unreachable blocks from the CFG > > -- Remove unreachable blocks from the CFG > > X86 DAG->DAG Instruction Selection > > -- X86 DAG->DAG Instruction Selection > > **************** Due to my register allocator ******************* > > Immediate Dominators Construction > > ET Forest Construction > > -- Immediate Dominators Construction > > Natural Loop Construction > > -- ET Forest Construction > > Virtual to def/use mapping - Fernando. > > -- Natural Loop Construction > > Edge liveness analyses - Fernando. > > Register allocation via coloring of chordal graphs. > > -- Register allocation via coloring of chordal graphs. > > -- Virtual to def/use mapping - Fernando. > > -- Edge liveness analyses - Fernando. > > ***************************************************************** > > Live Variable Analysis > > X86 FP Stackifier > > -- X86 FP Stackifier > > -- Live Variable Analysis > > Prolog/Epilog Insertion & Frame Finalization > > -- Prolog/Epilog Insertion & Frame Finalization > > X86 AT&T-Style Assembly Printer > > -- X86 AT&T-Style Assembly Printer > > Machine Code Deleter > > -- Machine Code Deleter > > > > Could some one tell me what is(are) the most likely reason(s) for this > > error? I would really appreciate any help, > > > > Thanks a lot, > > > > Fernando > > _______________________________________________ > > LLVM Developers mailing list > > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > > > -Chris > > -- > http://nondot.org/sabre/ > http://llvm.org/ > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >