David Greene via llvm-dev
2019-Apr-03 16:40 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
Interesting that we're getting a relative flood of these recently.
See here:
http://lists.llvm.org/pipermail/llvm-dev/2019-March/131346.html
I don't think one can reliably get a Function analysis pass from within
a ModulePass using the legacy pass manager. You have to manually
construct the pass yourself.
-David
Jonathan Smith via llvm-dev <llvm-dev at lists.llvm.org> writes:
> It should be `LoopInfoWrapperPass` instead of just `LoopInfo`, but you
> can also get the same information if you manually construct a
> dominator tree and target info first and pass those to the LoopInfo
> constructor.
>
> On Tue, Apr 2, 2019 at 2:48 AM J Skye via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
>>
>> Hi all,
>>
>>
>> I tried to have a LoopInfo object in a function pass, and add
addRequired in getAnalysisUsage, and then use getAnalysis in runOnFunction(). It
worked OK.
>> Now I want to have a module pass to traverse the functions, and
similarly, I want to have to loop information of the functions.
>> When I did the above in runOnModule, and build the module pass, the
following error popped out, and the compile did not succeed:
>>
>> [ 50%] Building CXX object
src/CMakeFiles/SkeletonPass.dir/Skeleton.cpp.o
>> /home/**/Desktop/skeleton/src/Skeleton.cpp: In member function ‘virtual
bool llvm::SkeletonPass::runOnModule(llvm::Module&)’:
>> /home/**/Desktop/skeleton/src/Skeleton.cpp:47:43: error: no matching
function for call to ‘llvm::SkeletonPass::getAnalysis(llvm::Function*&)’
>> LoopInfo &LI = getAnalysis<LoopInfo>(F);
>>
>> ...
>> home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h: In
instantiation of ‘llvm::AnalysisUsage& llvm::AnalysisUsage::addRequired()
[with PassClass = llvm::LoopInfo]’:
>> /home/**/Desktop/skeleton/src/Skeleton.cpp:24:38: required from here
>> /home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h:67:39:
error: ‘ID’ is not a member of ‘llvm::LoopInfo’
>> return addRequiredID(PassClass::ID);
>> ^
>>
>> Here is my source code:
>>
>> #include "llvm/Pass.h"
>> #include "llvm/IR/Function.h"
>> #include "llvm/IR/Module.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include "llvm/IR/Dominators.h"
>> #include "llvm/Analysis/LoopInfo.h"
>>
>> namespace llvm
>> {
>> class SkeletonPass : public ModulePass
>> {
>> public:
>> static char ID;
>> SkeletonPass() : ModulePass(ID) {}
>> bool runOnModule(Module &M) override;
>> virtual StringRef getPassName() const override
>> {
>> return "Skeleton";
>> }
>> virtual void getAnalysisUsage(AnalysisUsage &AU) const
override {
>> errs() << "get analysis usage method.\n";
>> AU.addRequired<LoopInfo>();
>> }
>> };
>>
>> Pass *createSkeletonPass()
>> {
>> return new SkeletonPass();
>> }
>>
>> char SkeletonPass::ID = 0;
>> Pass *createSkeletonPass();
>> void initializeSkeletonPass(PassRegistry &Registry);
>>
>>
>> } // namespace llvm
>>
>> using namespace llvm;
>> using namespace std;
>>
>>
>> bool SkeletonPass::runOnModule(llvm::Module &M){
>> errs() << "=============start=============\n";
>> auto F = M.getFunction("main");
>> LoopInfo &LI = getAnalysis<LoopInfo>(F);
>>
>> LI.print(errs());
>> errs() << "==========================\n";
>> }
>>
>> static RegisterPass<SkeletonPass> X("run", "Hello
world pass", false, false);
>>
>> The version of LLVM is 6.0.1, can anyone tell me the correct way to
handle this in a module pass? Thanks a lot!
>>
>> Best,
>> Liu
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>>
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev_______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Jonathan Smith via llvm-dev
2019-Apr-03 16:50 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
I saw this (or perhaps an earlier, similar message) before and that
was enough for me to avoid trying it.
The good thing is it's easy enough to get a LoopInfo manually without
constructing a pass at all:
llvm::DominatorTree domTree{&func, func};
llvm::LoopInfo loopInfo{&func, domTree};
On Wed, Apr 3, 2019 at 12:40 PM David Greene <dag at cray.com>
wrote:>
> Interesting that we're getting a relative flood of these recently.
>
> See here:
>
> http://lists.llvm.org/pipermail/llvm-dev/2019-March/131346.html
>
> I don't think one can reliably get a Function analysis pass from within
> a ModulePass using the legacy pass manager. You have to manually
> construct the pass yourself.
>
> -David
>
> Jonathan Smith via llvm-dev <llvm-dev at lists.llvm.org> writes:
>
> > It should be `LoopInfoWrapperPass` instead of just `LoopInfo`, but you
> > can also get the same information if you manually construct a
> > dominator tree and target info first and pass those to the LoopInfo
> > constructor.
> >
> > On Tue, Apr 2, 2019 at 2:48 AM J Skye via llvm-dev
> > <llvm-dev at lists.llvm.org> wrote:
> >>
> >> Hi all,
> >>
> >>
> >> I tried to have a LoopInfo object in a function pass, and add
addRequired in getAnalysisUsage, and then use getAnalysis in runOnFunction(). It
worked OK.
> >> Now I want to have a module pass to traverse the functions, and
similarly, I want to have to loop information of the functions.
> >> When I did the above in runOnModule, and build the module pass,
the following error popped out, and the compile did not succeed:
> >>
> >> [ 50%] Building CXX object
src/CMakeFiles/SkeletonPass.dir/Skeleton.cpp.o
> >> /home/**/Desktop/skeleton/src/Skeleton.cpp: In member function
‘virtual bool llvm::SkeletonPass::runOnModule(llvm::Module&)’:
> >> /home/**/Desktop/skeleton/src/Skeleton.cpp:47:43: error: no
matching function for call to
‘llvm::SkeletonPass::getAnalysis(llvm::Function*&)’
> >> LoopInfo &LI = getAnalysis<LoopInfo>(F);
> >>
> >> ...
> >> home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h: In
instantiation of ‘llvm::AnalysisUsage& llvm::AnalysisUsage::addRequired()
[with PassClass = llvm::LoopInfo]’:
> >> /home/**/Desktop/skeleton/src/Skeleton.cpp:24:38: required from
here
> >>
/home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h:67:39: error:
‘ID’ is not a member of ‘llvm::LoopInfo’
> >> return addRequiredID(PassClass::ID);
> >> ^
> >>
> >> Here is my source code:
> >>
> >> #include "llvm/Pass.h"
> >> #include "llvm/IR/Function.h"
> >> #include "llvm/IR/Module.h"
> >> #include "llvm/Support/raw_ostream.h"
> >> #include "llvm/IR/Dominators.h"
> >> #include "llvm/Analysis/LoopInfo.h"
> >>
> >> namespace llvm
> >> {
> >> class SkeletonPass : public ModulePass
> >> {
> >> public:
> >> static char ID;
> >> SkeletonPass() : ModulePass(ID) {}
> >> bool runOnModule(Module &M) override;
> >> virtual StringRef getPassName() const override
> >> {
> >> return "Skeleton";
> >> }
> >> virtual void getAnalysisUsage(AnalysisUsage &AU) const
override {
> >> errs() << "get analysis usage
method.\n";
> >> AU.addRequired<LoopInfo>();
> >> }
> >> };
> >>
> >> Pass *createSkeletonPass()
> >> {
> >> return new SkeletonPass();
> >> }
> >>
> >> char SkeletonPass::ID = 0;
> >> Pass *createSkeletonPass();
> >> void initializeSkeletonPass(PassRegistry &Registry);
> >>
> >>
> >> } // namespace llvm
> >>
> >> using namespace llvm;
> >> using namespace std;
> >>
> >>
> >> bool SkeletonPass::runOnModule(llvm::Module &M){
> >> errs() << "=============start=============\n";
> >> auto F = M.getFunction("main");
> >> LoopInfo &LI = getAnalysis<LoopInfo>(F);
> >>
> >> LI.print(errs());
> >> errs() << "==========================\n";
> >> }
> >>
> >> static RegisterPass<SkeletonPass> X("run",
"Hello world pass", false, false);
> >>
> >> The version of LLVM is 6.0.1, can anyone tell me the correct way
to handle this in a module pass? Thanks a lot!
> >>
> >> Best,
> >> Liu
> >>
> >> _______________________________________________
> >> LLVM Developers mailing list
> >> llvm-dev at lists.llvm.org
> >>
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev_______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Florian Hahn via llvm-dev
2019-Apr-03 16:56 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
> On Apr 3, 2019, at 17:40, David Greene via llvm-dev <llvm-dev at lists.llvm.org> wrote: > > I don't think one can reliably get a Function analysis pass from within > a ModulePass using the legacy pass manager. You have to manually > construct the pass yourself.That’s strange. AFAIK IPSCCP does exactly that for the DT analysis, see getAnalysis in https://github.com/llvm/llvm-project/blob/master/llvm/lib/Transforms/IPO/SCCP.cpp#L53 Which is called for each function in the module: https://github.com/llvm/llvm-project/blob/master/llvm/lib/Transforms/Scalar/SCCP.cpp#L1960 <https://github.com/llvm/llvm-project/blob/master/llvm/lib/Transforms/Scalar/SCCP.cpp#L1960> It does not seem like the legacy pass manager is able to preserve Function analyses from Module passes, whereas the new pass manager can, however. Cheers, Florian -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190403/df406604/attachment.html>
David Greene via llvm-dev
2019-Apr-03 18:33 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
Florian Hahn <florian_hahn at apple.com> writes:> On Apr 3, 2019, at 17:40, David Greene via llvm-dev <llvm-dev at lists.llvm.org> wrote: > > I don't think one can reliably get a Function analysis pass from within > a ModulePass using the legacy pass manager. You have to manually > construct the pass yourself. > > That’s strange. AFAIK IPSCCP does exactly that for the DT analysis, see getAnalysis in > https://github.com/llvm/llvm-project/blob/master/llvm/lib/Transforms/IPO/SCCP.cpp#L53Yes, I know. That's what I modeled my solution after. And it worked for a bunch of codes I ran it on. Until it didn't. I think IPSCCP is broken because the on-the-fly pass manager stuff is broken.> It does not seem like the legacy pass manager is able to preserve > Function analyses from Module passes, whereas the new pass manager > can, however.It's not about preserving analyses. The analyses are not safely available within the ModulePass itself. They get deleted sometime during the sequence of calls to getAnalysis. -David