J Skye via llvm-dev
2019-Apr-02 06:47 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20190402/e5bdc3b5/attachment.html>
Jonathan Smith via llvm-dev
2019-Apr-02 14:24 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
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
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