[llvm-dev] pass invalidation

Yuxi Chen via llvm-dev llvm-dev at lists.llvm.org
Mon Jun 20 14:08:16 PDT 2016


Thanks for your reply. 
You  mean I can write a new Pass to change the FunctionPassManager, but where I need put my analysis pass(A,B,C). I mean I am not clear about the relationship between the new-created pass ABC and A,B,C. 

As for other built-in passes, like LoopInfo, how need I handle them. Seem I mess all stuff up.

From: llvm-dev [llvm-dev-bounces at lists.llvm.org] on behalf of serge guelton via llvm-dev [llvm-dev at lists.llvm.org]
Sent: Sunday, June 19, 2016 2:59 AM
To: Yuxi Chen via llvm-dev
Subject: Re: [llvm-dev] pass invalidation

On Sun, Jun 19, 2016 at 05:44:01AM +0000, Yuxi Chen via llvm-dev wrote:
> Hi All,
> When I use llvm, I encounter a problem like "unable to schedule pass A required by C"
> I investigated deeper. It's like:
> I have three passes, say A, B, C(all are on function level)
> A would modify IR code. (change instruction order)
> For pass B,
> I would use the result of pass A, I use addRequired<B>(), and &getAnalysis<B>(), it works.
> void getAnalysisUsage(AU){
> AU.addRequired<A>();
> }
> For pass C, it will use the results of pass A and B.
> I use the way as used for pass B, but it failed, even for LoopInfo analysis pass(which is the built-in analysis pass).
> void getAnalysisUsage(AU){
> AU.addRequired<A>();
> AU.addRequired<B>();
> }
> It seems because A would modify IR code, so for pass C, I need first load pass A then pass B, otherwise it will be invalidated.
> However, when I change the using order, I still got error "unable to schedule pass A required by C".
> Does anyone encounter the same problem before and have a solution?
> Any help is appreciated.


It looks like A is not an analyse, as it modifies IR code, while
analysis don't modify IR. You cannot specify this kind of dependencies
in the getAnalysisUsage method.

What you can do though is create a pass ABC that spawns a new
Passmanager that calls A, B and C in that order, something like:

    llvm::legacy::FunctionPassManager FPM(Module);

    bool modified = false;
    modified |= FPM.doInitialization();
    for (Function &F : Module)
      modified |= FPM.run(F);
    modified |= FPM.doFinalization();
LLVM Developers mailing list
llvm-dev at lists.llvm.org

More information about the llvm-dev mailing list