[LLVMdev] Function Pass Manager

Ralf Karrenberg Chareos at gmx.de
Sat Jun 2 01:40:17 PDT 2012


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
>



More information about the llvm-dev mailing list