Syed Rafiul Hussain via llvm-dev
2016-Jan-22 20:49 UTC
[llvm-dev] LLVM - getAnalysisUsage()
I have added -debug-pass=Structure, and found the following:
ModulePass Manager
X Analysis
Unnamed pass: implement Pass::getPassName()
FunctionPass Manager
Module Verifier
Bitcode Writer
Pass Arguments: -x -y -z
FunctionPass Manager
X Analysis
Y Construction
Z Construction
Even for getAnalysis<Y>(*F) and getAnalysis<Z>(&F), all the
passes X,
Y, Z are executed again. In total there are three places where
getAnalysis() directive has been used for X, Y, Z. However, for each
getAnalysis() call, all three passes are scheduled/executed.
On Fri, Jan 22, 2016 at 12:24 PM, Mehdi Amini <mehdi.amini at apple.com>
wrote:>
>> On Jan 21, 2016, at 9:05 PM, Syed Rafiul Hussain via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
>>
>> Hi,
>>
>> I am using llvm-3.8 for my project. Following is my getAnalysisUsage()
method:
>>
>> virtual void getAnalysisUsage(AnalysisUsage &AU) const override
>> {
>> AU.setPreservesAll();
>> AU.addRequired<X>();
>> AU.addRequired<Y>();
>> AU.addRequired<Z>();
>> }
>>
>> Now, if I call getAnalysis<X>(*F), instead of invoking just the X
>> pass, all the passes, i.e., X, Y and Z are being invoked. Could anyone
>> help me in this regard?
>
> This is expected. With the current pass manager, the scheduling is done
upfront. The “addRequired” directive tells the pass manager that before even
starting to run your pass, it needs to schedule X, Y, and Z.
> They will run even without the call to getAnalysis<X>(*F). The new
pass manager (not complete yet but almost) will change that.
>
> When running your pass with opt, you can add —debug-pass=Structure to see
what the scheduling is.
>
> I hope I didn’t misunderstand your question.
>
> —
> Mehdi
>
--
Rafi
This is expected if those analysis are not preserved. On Fri, Jan 22, 2016 at 12:49 PM, Syed Rafiul Hussain via llvm-dev < llvm-dev at lists.llvm.org> wrote:> I have added -debug-pass=Structure, and found the following: > > ModulePass Manager > X Analysis > Unnamed pass: implement Pass::getPassName() > FunctionPass Manager > Module Verifier > Bitcode Writer > Pass Arguments: -x -y -z > FunctionPass Manager > X Analysis > Y Construction > Z Construction > > Even for getAnalysis<Y>(*F) and getAnalysis<Z>(&F), all the passes X, > Y, Z are executed again. In total there are three places where > getAnalysis() directive has been used for X, Y, Z. However, for each > getAnalysis() call, all three passes are scheduled/executed. > > > > > On Fri, Jan 22, 2016 at 12:24 PM, Mehdi Amini <mehdi.amini at apple.com> > wrote: > > > >> On Jan 21, 2016, at 9:05 PM, Syed Rafiul Hussain via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> > >> Hi, > >> > >> I am using llvm-3.8 for my project. Following is my getAnalysisUsage() > method: > >> > >> virtual void getAnalysisUsage(AnalysisUsage &AU) const override > >> { > >> AU.setPreservesAll(); > >> AU.addRequired<X>(); > >> AU.addRequired<Y>(); > >> AU.addRequired<Z>(); > >> } > >> > >> Now, if I call getAnalysis<X>(*F), instead of invoking just the X > >> pass, all the passes, i.e., X, Y and Z are being invoked. Could anyone > >> help me in this regard? > > > > This is expected. With the current pass manager, the scheduling is done > upfront. The “addRequired” directive tells the pass manager that before > even starting to run your pass, it needs to schedule X, Y, and Z. > > They will run even without the call to getAnalysis<X>(*F). The new pass > manager (not complete yet but almost) will change that. > > > > When running your pass with opt, you can add —debug-pass=Structure to > see what the scheduling is. > > > > I hope I didn’t misunderstand your question. > > > > — > > Mehdi > > > > > > -- > Rafi > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160122/340592f9/attachment.html>
> On Jan 22, 2016, at 12:49 PM, Syed Rafiul Hussain <rafiul1906 at gmail.com> wrote: > > I have added -debug-pass=Structure, and found the following: > > ModulePass Manager > X Analysis > Unnamed pass: implement Pass::getPassName() > FunctionPass Manager > Module Verifier > Bitcode Writer > Pass Arguments: -x -y -z > FunctionPass Manager > X Analysis > Y Construction > Z ConstructionThis is suspicious to me, I think you try to anonymize the names but reused "X Analysis” two times (it shows up as a module pass the first time, and in a functionpass manager the second times).> > Even for getAnalysis<Y>(*F) and getAnalysis<Z>(&F), all the passes X, > Y, Z are executed again. In total there are three places where > getAnalysis() directive has been used for X, Y, Z. However, for each > getAnalysis() call, all three passes are scheduled/executed.Again the “getAnalysis()” has nothing to do with scheduling execution. All is decided with the getRequired calls. — Mehdi> > > > > On Fri, Jan 22, 2016 at 12:24 PM, Mehdi Amini <mehdi.amini at apple.com> wrote: >> >>> On Jan 21, 2016, at 9:05 PM, Syed Rafiul Hussain via llvm-dev <llvm-dev at lists.llvm.org> wrote: >>> >>> Hi, >>> >>> I am using llvm-3.8 for my project. Following is my getAnalysisUsage() method: >>> >>> virtual void getAnalysisUsage(AnalysisUsage &AU) const override >>> { >>> AU.setPreservesAll(); >>> AU.addRequired<X>(); >>> AU.addRequired<Y>(); >>> AU.addRequired<Z>(); >>> } >>> >>> Now, if I call getAnalysis<X>(*F), instead of invoking just the X >>> pass, all the passes, i.e., X, Y and Z are being invoked. Could anyone >>> help me in this regard? >> >> This is expected. With the current pass manager, the scheduling is done upfront. The “addRequired” directive tells the pass manager that before even starting to run your pass, it needs to schedule X, Y, and Z. >> They will run even without the call to getAnalysis<X>(*F). The new pass manager (not complete yet but almost) will change that. >> >> When running your pass with opt, you can add —debug-pass=Structure to see what the scheduling is. >> >> I hope I didn’t misunderstand your question. >> >> — >> Mehdi >> > > > > -- > Rafi
Syed Rafiul Hussain via llvm-dev
2016-Jan-23 02:33 UTC
[llvm-dev] LLVM - getAnalysisUsage()
Sorry for my typo:
The actual outputs are following:
ModulePass Manager
Module pass example
Unnamed pass: implement Pass::getPassName()
FunctionPass Manager
Module Verifier
Bitcode Writer
Pass Arguments: -functionscalls -domtree -dominancefrontier
FunctionPass Manager
Function Call Analysis
Dominator Tree Construction
Dominance Frontier Construction
Yes, I got your point that getAnalysis() is not scheduling the
execution. However, I do not want a function-pass to be executed more
than once for a single function. Do you have any suggestions to do
that?
Thanks.
On Fri, Jan 22, 2016 at 4:43 PM, Mehdi Amini <mehdi.amini at apple.com>
wrote:>
>> On Jan 22, 2016, at 12:49 PM, Syed Rafiul Hussain <rafiul1906 at
gmail.com> wrote:
>>
>> I have added -debug-pass=Structure, and found the following:
>>
>> ModulePass Manager
>> X Analysis
>> Unnamed pass: implement Pass::getPassName()
>> FunctionPass Manager
>> Module Verifier
>> Bitcode Writer
>> Pass Arguments: -x -y -z
>> FunctionPass Manager
>> X Analysis
>> Y Construction
>> Z Construction
>
> This is suspicious to me, I think you try to anonymize the names but reused
"X Analysis” two times (it shows up as a module pass the first time, and in
a functionpass manager the second times).
>
>>
>> Even for getAnalysis<Y>(*F) and getAnalysis<Z>(&F), all
the passes X,
>> Y, Z are executed again. In total there are three places where
>> getAnalysis() directive has been used for X, Y, Z. However, for each
>> getAnalysis() call, all three passes are scheduled/executed.
>
> Again the “getAnalysis()” has nothing to do with scheduling execution. All
is decided with the getRequired calls.
>
> —
> Mehdi
>
>
>>
>>
>>
>>
>> On Fri, Jan 22, 2016 at 12:24 PM, Mehdi Amini <mehdi.amini at
apple.com> wrote:
>>>
>>>> On Jan 21, 2016, at 9:05 PM, Syed Rafiul Hussain via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I am using llvm-3.8 for my project. Following is my
getAnalysisUsage() method:
>>>>
>>>> virtual void getAnalysisUsage(AnalysisUsage &AU) const
override
>>>> {
>>>> AU.setPreservesAll();
>>>> AU.addRequired<X>();
>>>> AU.addRequired<Y>();
>>>> AU.addRequired<Z>();
>>>> }
>>>>
>>>> Now, if I call getAnalysis<X>(*F), instead of invoking
just the X
>>>> pass, all the passes, i.e., X, Y and Z are being invoked. Could
anyone
>>>> help me in this regard?
>>>
>>> This is expected. With the current pass manager, the scheduling is
done upfront. The “addRequired” directive tells the pass manager that before
even starting to run your pass, it needs to schedule X, Y, and Z.
>>> They will run even without the call to getAnalysis<X>(*F).
The new pass manager (not complete yet but almost) will change that.
>>>
>>> When running your pass with opt, you can add —debug-pass=Structure
to see what the scheduling is.
>>>
>>> I hope I didn’t misunderstand your question.
>>>
>>> —
>>> Mehdi
>>>
>>
>>
>>
>> --
>> Rafi
>
--
Rafi