Hi, I'm writing a function pass which is dynamically loaded by opt and I need some analysis and passes to be run before my pass: virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<LoopInfo>(); AU.addPreserved<LoopInfo>(); AU.addRequiredID(LoopSimplifyID); AU.addPreservedID(LoopSimplifyID); AU.addRequiredID(LCSSAID); AU.addPreservedID(LCSSAID); AU.addRequired<ScalarEvolution>(); AU.addPreserved<ScalarEvolution>(); } When I run it with opt -load, I'm getting the following error: Unable to schedule 'Canonicalize natural loops' required by 'MyPass' Unable to schedule pass After looking at the pass manager framework, it seems that passes with lower level than FunctionPass (such as LoopPass in my particular case) cannot be scheduled on-the-fly or must be handled by specific function managers. This is not the case for module passes, i.e. module passes requiring function ones. Is it correct ? In other words, why is addLowerLevelRequiredPass() not specialized for function managers ? I think I'm misunderstanding the whole thing, is it possible to chain transformation passes from my pass or do I chain them explicitly from the command line ? Thanks in advance, Ivan
Hi again, I come back to this issue with an example. It's a pass which does nothing but throw the 'Unable to schedule' error. namespace { struct MyPass : public FunctionPass { static char ID; // Pass identification, replacement for typeid MyPass() : FunctionPass(ID) { initializeMyPassPass(*PassRegistry::getPassRegistry()); } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequiredID(LoopSimplifyID); AU.addPreservedID(LoopSimplifyID); } virtual bool runOnFunction(Function &F); }; } char MyPass::ID = 0; INITIALIZE_PASS_BEGIN(MyPass, "mypass", "mypass", false, false) INITIALIZE_PASS_DEPENDENCY(LoopSimplify) INITIALIZE_PASS_END(MyPass, "mypass", "mypass", false, false) bool MyPass::runOnFunction(Function &F) { return MyPass::ID == 0; } FunctionPass *llvm::createMyPassPass() { return new MyPass(); } It's a simple FunctionPass requiring a lower level pass, LoopSimplify. I wrote this pass among the other llvm passes in Transform/Scalar, it's not a dynamic loaded pass. It's worth to note that if I change this pass to be a ModulePass instead, the required pass LoopSimplify is scheduled on-the-fly without problems. Is there any reason to not specialize addLowerLevelRequiredPass() for function managers ? Ivan Le 23/03/2012 17:00, Ivan Llopard a écrit :> Hi, > > I'm writing a function pass which is dynamically loaded by opt and I > need some analysis and passes to be run before my pass: > > virtual void getAnalysisUsage(AnalysisUsage &AU) const { > AU.addRequired<LoopInfo>(); > AU.addPreserved<LoopInfo>(); > AU.addRequiredID(LoopSimplifyID); > AU.addPreservedID(LoopSimplifyID); > AU.addRequiredID(LCSSAID); > AU.addPreservedID(LCSSAID); > AU.addRequired<ScalarEvolution>(); > AU.addPreserved<ScalarEvolution>(); > } > > When I run it with opt -load, I'm getting the following error: > > Unable to schedule 'Canonicalize natural loops' required by 'MyPass' > Unable to schedule pass > > After looking at the pass manager framework, it seems that passes with > lower level than FunctionPass (such as LoopPass in my particular case) > cannot be scheduled on-the-fly or must be handled by specific function > managers. This is not the case for module passes, i.e. module passes > requiring function ones. Is it correct ? > > In other words, why is addLowerLevelRequiredPass() not specialized for > function managers ? > > I think I'm misunderstanding the whole thing, is it possible to chain > transformation passes from my pass or do I chain them explicitly from > the command line ? > > Thanks in advance, > > Ivan
Hi, does anybody have a solution to the problem mentioned by Ivan (see below)? I am running some custom passes on a given function via a FunctionPassManager and want its loops simplified as a prerequisite. Thanks, Ralf On 4/12/12 10:32 AM, Ivan Llopard wrote:> Hi again, > > I come back to this issue with an example. It's a pass which does > nothing but throw the 'Unable to schedule' error. > > namespace { > struct MyPass : public FunctionPass { > static char ID; // Pass identification, replacement for typeid > MyPass() : FunctionPass(ID) { > initializeMyPassPass(*PassRegistry::getPassRegistry()); > } > virtual void getAnalysisUsage(AnalysisUsage&AU) const { > AU.addRequiredID(LoopSimplifyID); > AU.addPreservedID(LoopSimplifyID); > } > virtual bool runOnFunction(Function&F); > }; > } > > char MyPass::ID = 0; > INITIALIZE_PASS_BEGIN(MyPass, "mypass", "mypass", > false, false) > INITIALIZE_PASS_DEPENDENCY(LoopSimplify) > INITIALIZE_PASS_END(MyPass, "mypass", "mypass", > false, false) > > bool MyPass::runOnFunction(Function&F) { > return MyPass::ID == 0; > } > > FunctionPass *llvm::createMyPassPass() { > return new MyPass(); > } > > It's a simple FunctionPass requiring a lower level pass, LoopSimplify. I > wrote this pass among the other llvm passes in Transform/Scalar, it's > not a dynamic loaded pass. > It's worth to note that if I change this pass to be a ModulePass > instead, the required pass LoopSimplify is scheduled on-the-fly without > problems. > Is there any reason to not specialize addLowerLevelRequiredPass() for > function managers ? > > Ivan > > > Le 23/03/2012 17:00, Ivan Llopard a écrit : >> Hi, >> >> I'm writing a function pass which is dynamically loaded by opt and I >> need some analysis and passes to be run before my pass: >> >> virtual void getAnalysisUsage(AnalysisUsage&AU) const { >> AU.addRequired<LoopInfo>(); >> AU.addPreserved<LoopInfo>(); >> AU.addRequiredID(LoopSimplifyID); >> AU.addPreservedID(LoopSimplifyID); >> AU.addRequiredID(LCSSAID); >> AU.addPreservedID(LCSSAID); >> AU.addRequired<ScalarEvolution>(); >> AU.addPreserved<ScalarEvolution>(); >> } >> >> When I run it with opt -load, I'm getting the following error: >> >> Unable to schedule 'Canonicalize natural loops' required by 'MyPass' >> Unable to schedule pass >> >> After looking at the pass manager framework, it seems that passes with >> lower level than FunctionPass (such as LoopPass in my particular case) >> cannot be scheduled on-the-fly or must be handled by specific function >> managers. This is not the case for module passes, i.e. module passes >> requiring function ones. Is it correct ? >> >> In other words, why is addLowerLevelRequiredPass() not specialized for >> function managers ? >> >> I think I'm misunderstanding the whole thing, is it possible to chain >> transformation passes from my pass or do I chain them explicitly from >> the command line ? >> >> Thanks in advance, >> >> Ivan > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
On 4/12/12 3:32 AM, Ivan Llopard wrote:> Hi again, > > I come back to this issue with an example. It's a pass which does > nothing but throw the 'Unable to schedule' error. > > namespace { > struct MyPass : public FunctionPass { > static char ID; // Pass identification, replacement for typeid > MyPass() : FunctionPass(ID) { > initializeMyPassPass(*PassRegistry::getPassRegistry()); > } > virtual void getAnalysisUsage(AnalysisUsage&AU) const { > AU.addRequiredID(LoopSimplifyID); > AU.addPreservedID(LoopSimplifyID); > } > virtual bool runOnFunction(Function&F); > }; > }Is LoopSimplifyID an analysis pass or a transform (optimization) pass? You cannot reliably use the addRequired() method to force a transform pass to run before another pass; there are cases in which the PassManager cannot schedule the required passes. You must simply ensure that LoopSimplify is executed before your pass. -- John T.