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

John Criswell criswell at illinois.edu
Fri Apr 4 15:27:13 PDT 2014


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/20140404/87c2a043/attachment.html>


More information about the llvm-dev mailing list