[LLVMdev] AnalysisUsage: addRequired vs. addRequiredTransitive
andreas.bolka at gmx.net
Thu Apr 1 16:59:30 PDT 2010
On Fri Apr 02 00:37:03 +0200 2010, Trevor Harmon wrote:
> On Mar 31, 2010, at 3:13 PM, Owen Anderson wrote:
> > Others, like MemoryDependenceAnalysis, are "lazy." MDA
> > specifically does NOT compute results in its runOnFunction(),
> > instead computing results on-demand when a user queries it. Because
> > MDA depends on AA, we must ensure that, as long as MDA is alive and
> > responding to queries, AA is alive as well. That is what
> > addRequiredTransitive does.
> I'm not sure if I follow this. So let's say I'm writing a pass Foo,
> and Foo depends on MDA. You're saying that Foo's getAnalysisUsage must
> call addRequiredTransitive< MemoryDependenceAnalysis>, not
> addRequired<MemoryDependenceAnalysis>, because otherwise the
> dependencies of Foo's dependencies might be destroyed. Do I have that
Nope. If Foo depends on MDA, then Foo does addRequired<MDA>(). But when
Foo uses MDA, MDA itself needs AA. So MDA does
addRequiredTransitive<AA>() as AA does not only need to be around within
MDA's runOnFunction but also within each runOnFunction of a pass
depending on MDA.
So if MDA does addRequired<AA>, AA is only guaranteed to be alive for
MDA's runOnFunction. If MDA does addRequiredTransitive<AA> instead, AA
is not only alive for MDA's runOnFunction, but also for all
runOnFunction-s of passes requiring MDA.
Clear as mud?
More information about the llvm-dev