Hi Duncan, thanks for the quick answer. Yes I'm sure the runOnModule is being called, and when I dump the functions before exiting the method I can see the AlwaysInline attribute. I'll check InlineAlways.cpp and will reimplement as last resource but I still wonder why this is not working. On Mon, Nov 5, 2012 at 5:03 PM, Duncan Sands <baldrick at free.fr> wrote:> Hi Arnaldo, > > > I am coding a ModulePass in which I want to add an AlwaysInline attribute >> to >> every function so that they can be later inlined by the -always-inline >> pass. >> > > why not just do the inlining yourself. The always inliner code is at > lib/Transforms/IPO/**InlineAlways.cpp, and it's pretty short. > > > However, the changes to the function seem to be lost after exiting my pass >> because the AlwaysInline attribute is not in the output LLVM IR. >> >> Maybe the function iterator passed by the module object actually points to >> copies of the functions? >> > > As far as I can see your code should work. Most likely it isn't being run > at all - did you check that your runOnModule method is actually being > called? > > Ciao, Duncan. > > >> Any help is much appreciated >> >> >> Code >> ===>> virtual bool runOnModule(Module& m) >> { >> Module* module = &m; >> >> for (Module::iterator functionIter = module->begin(); functionIter !>> module->end(); functionIter++) >> functionIter->addFnAttr(llvm::**Attributes::AlwaysInline); >> >> return true; >> } >> >> >> Command line >> ==========>> clang -O0 -S -emit-llvm -o test.S test.c && opt -S -mem2reg -load <path >> to lib> >> -mypass < test.S > test_opt.S >> >> >> >> ______________________________**_________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/**mailman/listinfo/llvmdev<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev> >> >> > ______________________________**_________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/**mailman/listinfo/llvmdev<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121105/74daf7a6/attachment.html>
Hi Arnaldo, On 05/11/12 10:02, Arnaldo wrote:> Hi Duncan, thanks for the quick answer. > > Yes I'm sure the runOnModule is being called, and when I dump the functions > before exiting the method I can see the AlwaysInline attribute. > > I'll check InlineAlways.cpp and will reimplement as last resource but I still > wonder why this is not working.if you want more help with this please provide the complete code for your pass. Ciao, Duncan.> > > On Mon, Nov 5, 2012 at 5:03 PM, Duncan Sands <baldrick at free.fr > <mailto:baldrick at free.fr>> wrote: > > Hi Arnaldo, > > > I am coding a ModulePass in which I want to add an AlwaysInline attribute to > every function so that they can be later inlined by the -always-inline pass. > > > why not just do the inlining yourself. The always inliner code is at > lib/Transforms/IPO/__InlineAlways.cpp, and it's pretty short. > > > However, the changes to the function seem to be lost after exiting my pass > because the AlwaysInline attribute is not in the output LLVM IR. > > Maybe the function iterator passed by the module object actually points to > copies of the functions? > > > As far as I can see your code should work. Most likely it isn't being run > at all - did you check that your runOnModule method is actually being called? > > Ciao, Duncan. > > > Any help is much appreciated > > > Code > ===> virtual bool runOnModule(Module& m) > { > Module* module = &m; > > for (Module::iterator functionIter = module->begin(); functionIter !> module->end(); functionIter++) > functionIter->addFnAttr(llvm::__Attributes::AlwaysInline); > > return true; > } > > > Command line > ==========> clang -O0 -S -emit-llvm -o test.S test.c && opt -S -mem2reg -load <path > to lib> > -mypass < test.S > test_opt.S > > > > _________________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/__mailman/listinfo/llvmdev > <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev> > > > _________________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/__mailman/listinfo/llvmdev > <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev> > >
Below is a stripped down version of the pass.
The compile line is: clang -O0 -S -emit-llvm -o test.S test.c && opt -S
-mem2reg -load <path to extract lib> -extract < test.S > test_opt.S
#include "llvm/Analysis/DependenceAnalysis.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Function.h"
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
using namespace std;
namespace
{
class ExtractFeatures : public ModulePass
{
public:
static char ID;
ExtractFeatures() : ModulePass(ID)
{
module = NULL;
loopInfo = NULL;
scalarEvolution = NULL;
}
virtual bool runOnModule(Module& m)
{
module = &m;
bool modified = false;
for (Module::iterator functionIter = module->begin();
functionIter != module->end(); functionIter++)
{
if (functionIter->isDeclaration())
continue;
Attributes attributes = functionIter->getFnAttributes();
if (!attributes.hasAttribute(Attributes::AlwaysInline))
{
functionIter->addFnAttr(llvm::Attributes::AlwaysInline);
errs() << "AlwaysInline NOT detected\n";
modified = true;
}
else
{
errs() << "AlwaysInline detected\n";
}
}
return modified;
}
virtual void getAnalysisUsage(AnalysisUsage &analysisUsage)
const
{
analysisUsage.addRequired<LoopInfo>();
analysisUsage.addPreserved<LoopInfo>();
analysisUsage.addRequired<ScalarEvolution>();
analysisUsage.addPreserved<ScalarEvolution>();
analysisUsage.addRequired<DependenceAnalysis>();
analysisUsage.addPreserved<DependenceAnalysis>();
}
private:
DependenceAnalysis* dependenceAnalysis;
LoopInfo* loopInfo;
Module* module;
ScalarEvolution* scalarEvolution;
};
char ExtractFeatures::ID = 0;
static RegisterPass<ExtractFeatures> X("extract",
"Extract source
features", true, true);
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20121106/c88c60dc/attachment.html>