[LLVMdev] Add a new information and preserve it in LLVM

Hanbing Li hanbing.li at inria.fr
Mon Apr 7 09:08:24 PDT 2014


Hi John, 

Thank you for your answer. I tried ImmutablePasses, while the problem came again. 
Because the W need some information like loopinfo, so I need LoopInfo *LI = &getAnalysis<LoopInfo>(F); in this ImmutablePasses, and Function or Module are needed. 
I didn't find a way to get the Module or Function in ImmutablePasses. 

So, 1, can I use LoopInfo *LI = &getAnalysis<LoopInfo>(F); in ImmutablePasses? 
2, is there a method to get the Module in ImmutablePasses? 

Thank you! 

Sincerely, 

Hanbing 

----- Mail original -----

> De: "John Criswell" <criswell at illinois.edu>
> À: "Hanbing Li" <hanbing.li at inria.fr>, llvmdev at cs.uiuc.edu
> Envoyé: Samedi 5 Avril 2014 00:27:13
> Objet: Re: [LLVMdev] Add a new information and preserve it in LLVM

> On 4/4/14 3:02 PM, Hanbing Li wrote:

> > Hello,
> 

> > I am trying to add some thing into LLVM, while I encountered some problems.
> 

> > So my situation is that I have some information W, some transform passes
> > may
> > change it, after these passes, I need the new W. What I did is to create an
> > analysis pass similar to scalar-evolution or loopinfo, I can get the
> > information by using getAnalysis<W>(); and preserve this information W by
> > using AU.addPreserved<W>();. Then the problem came, for the module pass,
> > the
> > information can’t be preserved. (I found this: To the best of my knowledge,
> > the LLVM pass manager never preserves a FunctionPass analysis that is
> > requested by a ModulePass; every time you call getAnalysis for a function,
> > the FunctionPass is re-run.
> > http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-March/048139.html ) So this
> > means that I can’t update W when some module passes changed it?
> 

> > My questions are:
> 

> > 1, Module pass really can’t preserve the W?
> 

> If W is a FunctionPass, then I believe you are correct: a ModulePass will
> re-run the FunctionPass every time it uses the FunctionPass.

> I get the impression that you're using the PassManager infrastructure
> improperly, and that is probably why you're not getting the results you
> want.

> First, the ability to preserve a pass's results with addPreserved<W>() is an
> optimization. A FunctionPass or ModulePass() that analyzes the LLVM IR
> should work whether it is run one time or a hundred times. The
> addPreserved<>() functionality is only there so that the LLVM compiler can
> cache the results of analysis passes for efficiency.

> Second, the way to fix your problem depends on what you want to do. If you
> want pass W to analyze the LLVM IR of a program and cache its results
> (because the analysis it does is expensive), then make it a ModulePass. That
> way, other ModulePass'es can update and preserve its results.

> If you are just using W as a container in which to record information that
> transform passes are doing, then you might want to make W an ImmutablePass.
> ImmutablePasses are only run once and are never invalidated; other passes
> can use them to record information about what they do. ImmutablePasses, I
> think, were not really designed for this purpose, but they'll get the job
> done.

> Regards,

> John Criswell
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140407/0061b257/attachment.html>


More information about the llvm-dev mailing list