[LLVMdev] AnalysisUsage: addRequired vs. addRequiredTransitive

Andreas Bolka 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
> right?

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 mailing list