[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