hi all, I want access to all basic blocks of function in a loop, so I used the following code: *bool parallel::runOnLoop(Loop *L, LPPassManager &LPM) { for (Function::iterator bi= func->begin(); bi != func->end(); bi++){ // } }* First loop run without problem, but for second loop I get the following error: *0 libLLVM-2.9.so 0x0137d530 1 libLLVM-2.9.so 0x0137fa6c 2 0x002a7400 __kernel_sigreturn + 0 3 parallel.so 0x002895e9 parallel::runOnLoop(llvm::Loop*, llvm::LPPassManager&) + 345 4 libLLVM-2.9.so 0x00982994 llvm::LPPassManager::runOnFunction(llvm::Function&) + 1156 5 libLLVM-2.9.so 0x00eb02c1 llvm::FPPassManager::runOnFunction(llvm::Function&) + 545 6 libLLVM-2.9.so 0x00eb03d7 llvm::FPPassManager::runOnModule(llvm::Module&) + 87 7 libLLVM-2.9.so 0x00eafde5 llvm::MPPassManager::runOnModule(llvm::Module&) + 517 8 libLLVM-2.9.so 0x00eaff8b llvm::PassManagerImpl::run(llvm::Module&) + 171 9 libLLVM-2.9.so 0x00eb008d llvm::PassManager::run(llvm::Module&) + 45 10 opt 0x0805b32f main + 5295 11 libc.so.6 0x002becc6 __libc_start_main + 230 12 opt 0x0804ff51 Stack dump: 0. Program arguments: opt -dse -lda -memdep -basicaa -libcall-aa -scev-aa -globalsmodref-aa -load /home/llvm/src/Release+Debug+Profile+Asserts/lib/parallel.so -parallel -dot-cfg obj.o -o out.o 1. Running pass 'Function Pass Manager' on module 'obj.o'. 2. Running pass 'Loop Pass Manager' on function '@main' 3. Running pass 'parallel World Pass' on basic block '%bb4' Segmentation fault (core dumped)* -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111212/f7e277ec/attachment.html>
On 12/12/11 9:59 AM, neda 8664 wrote:> hi all, > > I want access to all basic blocks of function in a loop, so I used the > following code: > > /bool parallel::runOnLoop(Loop *L, LPPassManager &LPM) > { > for (Function::iterator bi= func->begin(); bi != func->end(); bi++){ > // > } > }/Are you modifying anything within this code (especially changes that add/remove basic blocks or change their Terminator instructions)? Depending on what you're doing, you may be invalidating the basic block iterator bi. -- John T.> > First loop run without problem, but for second loop I get the > following error: > > /0 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x0137d530 > 1 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x0137fa6c > 2 0x002a7400 __kernel_sigreturn + 0 > 3 parallel.so 0x002895e9 parallel::runOnLoop(llvm::Loop*, > llvm::LPPassManager&) + 345 > 4 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00982994 > llvm::LPPassManager::runOnFunction(llvm::Function&) + 1156 > 5 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eb02c1 > llvm::FPPassManager::runOnFunction(llvm::Function&) + 545 > 6 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eb03d7 > llvm::FPPassManager::runOnModule(llvm::Module&) + 87 > 7 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eafde5 > llvm::MPPassManager::runOnModule(llvm::Module&) + 517 > 8 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eaff8b > llvm::PassManagerImpl::run(llvm::Module&) + 171 > 9 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eb008d > llvm::PassManager::run(llvm::Module&) + 45 > 10 opt 0x0805b32f main + 5295 > 11 libc.so.6 0x002becc6 __libc_start_main + 230 > 12 opt 0x0804ff51 > Stack dump: > 0. Program arguments: opt -dse -lda -memdep -basicaa -libcall-aa > -scev-aa -globalsmodref-aa -load > /home/llvm/src/Release+Debug+Profile+Asserts/lib/parallel.so -parallel > -dot-cfg obj.o -o out.o > 1. Running pass 'Function Pass Manager' on module 'obj.o'. > 2. Running pass 'Loop Pass Manager' on function '@main' > 3. Running pass 'parallel World Pass' on basic block '%bb4' > Segmentation fault (core dumped)/ > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111212/a83f5c88/attachment.html>
Thank you for your reply Yes, I change them, so what should I do for another loops? On Mon, Dec 12, 2011 at 7:54 PM, neda 8664 <neda8664 at gmail.com> wrote:> Thank you for your reply > > Yes, I change them, so what should I do for another loops? > > On Mon, Dec 12, 2011 at 7:42 PM, John Criswell <criswell at illinois.edu>wrote: > >> On 12/12/11 9:59 AM, neda 8664 wrote: >> >> hi all, >> >> I want access to all basic blocks of function in a loop, so I used the >> following code: >> >> *bool parallel::runOnLoop(Loop *L, LPPassManager &LPM) >> { >> for (Function::iterator bi= func->begin(); bi != func->end(); bi++){ >> // >> } >> }* >> >> >> Are you modifying anything within this code (especially changes that >> add/remove basic blocks or change their Terminator instructions)? >> Depending on what you're doing, you may be invalidating the basic block >> iterator bi. >> >> -- John T. >> >> >> First loop run without problem, but for second loop I get the following >> error: >> >> *0 libLLVM-2.9.so 0x0137d530 >> 1 libLLVM-2.9.so 0x0137fa6c >> 2 0x002a7400 __kernel_sigreturn + 0 >> 3 parallel.so 0x002895e9 parallel::runOnLoop(llvm::Loop*, >> llvm::LPPassManager&) + 345 >> 4 libLLVM-2.9.so 0x00982994 >> llvm::LPPassManager::runOnFunction(llvm::Function&) + 1156 >> 5 libLLVM-2.9.so 0x00eb02c1 >> llvm::FPPassManager::runOnFunction(llvm::Function&) + 545 >> 6 libLLVM-2.9.so 0x00eb03d7 >> llvm::FPPassManager::runOnModule(llvm::Module&) + 87 >> 7 libLLVM-2.9.so 0x00eafde5 >> llvm::MPPassManager::runOnModule(llvm::Module&) + 517 >> 8 libLLVM-2.9.so 0x00eaff8b llvm::PassManagerImpl::run(llvm::Module&) + >> 171 >> 9 libLLVM-2.9.so 0x00eb008d llvm::PassManager::run(llvm::Module&) + 45 >> 10 opt 0x0805b32f main + 5295 >> 11 libc.so.6 0x002becc6 __libc_start_main + 230 >> 12 opt 0x0804ff51 >> Stack dump: >> 0. Program arguments: opt -dse -lda -memdep -basicaa -libcall-aa >> -scev-aa -globalsmodref-aa -load >> /home/llvm/src/Release+Debug+Profile+Asserts/lib/parallel.so -parallel >> -dot-cfg obj.o -o out.o >> 1. Running pass 'Function Pass Manager' on module 'obj.o'. >> 2. Running pass 'Loop Pass Manager' on function '@main' >> 3. Running pass 'parallel World Pass' on basic block '%bb4' >> Segmentation fault (core dumped)* >> >> >> _______________________________________________ >> LLVM Developers mailing listLLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111212/9d0ee0ac/attachment.html>
On 12/12/11 10:25 AM, neda 8664 wrote:> > Thank you for your reply > > Yes, I change them, so what should I do for another loops?I don't really know what you should do since I don't know what your code does. All I know is that it's changing the function's control-flow graph. If you're not modifying the structure of the loops in the function, then you can probably just fix the problem by using a worklist-style algorithm. First loop through the basic blocks in the function and record in a std::vector<> or std::set<> (or some other C++ container) the set of basic blocks that you want to change. After you do that, you can iterate through all the basic blocks in the container and start making modifications to them. That will fix any iterator invalidation occurring with the for() loop. That may work, but if I had been writing this pass, I would probably have made it a FunctionPass to ensure that the CFG changes don't confuse the PassManager. -- John T.> > On Mon, Dec 12, 2011 at 7:54 PM, neda 8664 <neda8664 at gmail.com > <mailto:neda8664 at gmail.com>> wrote: > > Thank you for your reply > > Yes, I change them, so what should I do for another loops? > > > On Mon, Dec 12, 2011 at 7:42 PM, John Criswell > <criswell at illinois.edu <mailto:criswell at illinois.edu>> wrote: > > On 12/12/11 9:59 AM, neda 8664 wrote: >> hi all, >> >> I want access to all basic blocks of function in a loop, so I >> used the following code: >> >> /bool parallel::runOnLoop(Loop *L, LPPassManager &LPM) >> { >> for (Function::iterator bi= func->begin(); bi !>> func->end(); bi++){ >> // >> } >> }/ > > Are you modifying anything within this code (especially > changes that add/remove basic blocks or change their > Terminator instructions)? Depending on what you're doing, you > may be invalidating the basic block iterator bi. > > -- John T. > >> >> First loop run without problem, but for second loop I get the >> following error: >> >> /0 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x0137d530 >> 1 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x0137fa6c >> 2 0x002a7400 __kernel_sigreturn + 0 >> 3 parallel.so 0x002895e9 parallel::runOnLoop(llvm::Loop*, >> llvm::LPPassManager&) + 345 >> 4 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00982994 >> llvm::LPPassManager::runOnFunction(llvm::Function&) + 1156 >> 5 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eb02c1 >> llvm::FPPassManager::runOnFunction(llvm::Function&) + 545 >> 6 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eb03d7 >> llvm::FPPassManager::runOnModule(llvm::Module&) + 87 >> 7 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eafde5 >> llvm::MPPassManager::runOnModule(llvm::Module&) + 517 >> 8 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eaff8b >> llvm::PassManagerImpl::run(llvm::Module&) + 171 >> 9 libLLVM-2.9.so <http://libLLVM-2.9.so> 0x00eb008d >> llvm::PassManager::run(llvm::Module&) + 45 >> 10 opt 0x0805b32f main + 5295 >> 11 libc.so.6 0x002becc6 __libc_start_main + 230 >> 12 opt 0x0804ff51 >> Stack dump: >> 0. Program arguments: opt -dse -lda -memdep -basicaa >> -libcall-aa -scev-aa -globalsmodref-aa -load >> /home/llvm/src/Release+Debug+Profile+Asserts/lib/parallel.so >> -parallel -dot-cfg obj.o -o out.o >> 1. Running pass 'Function Pass Manager' on module 'obj.o'. >> 2. Running pass 'Loop Pass Manager' on function '@main' >> 3. Running pass 'parallel World Pass' on basic block '%bb4' >> Segmentation fault (core dumped)/ >> >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111212/8f40d11d/attachment.html>
John Criswell <criswell <at> illinois.edu> writes:> > > On 12/12/11 9:59 AM, neda 8664 wrote: > > > hi all, > I want access to all basic blocks of function in a loop, so I used > the following code:bool parallel::runOnLoop(Loop *L, LPPassManager > &LPM) > { > for (Function::iterator bi= func->begin(); bi !> func->end(); bi++){ > // > } > } > > > Are you modifying anything within this code (especially changes that > add/remove basic blocks or change their Terminator instructions)? > Depending on what you're doing, you may be invalidating the basic > block iterator bi. > -- John T. > > _______________________________________________ > LLVM Developers mailing list > LLVMdev <at> cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >Hello, I am getting same opt Stack dump error frequently as well. Also trying to access basic blocks in runOnBasicBlock(BasicBlock &BB). This is at the 4th line with errs(): Instruction* current = BB.getTerminator(); errs() << "\n last: "<<*current<<"\n"; Instruction* prev = current->getPrevNode(); errs()<<*prev<<"\n"; What can be the cause?