Below is a stripped down version of the pass.<br>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<br><br>#include "llvm/Analysis/DependenceAnalysis.h"<br>
#include "llvm/Analysis/LoopInfo.h"<br>#include "llvm/Analysis/LoopPass.h"<br>#include "llvm/Analysis/ScalarEvolution.h"<br>#include "llvm/Function.h"<br>#include "llvm/Module.h"<br>
#include "llvm/Pass.h"<br>#include "llvm/Support/raw_ostream.h"<br><br>using namespace llvm;<br>using namespace std;<br><br>namespace<br>{<br>    class ExtractFeatures : public ModulePass<br>    {<br>        public:<br>
            static char ID;<br><br>            ExtractFeatures() : ModulePass(ID)<br>            {<br>                module = NULL;<br>                loopInfo = NULL;<br>                scalarEvolution = NULL;<br>            }<br>
<br>            virtual bool runOnModule(Module& m)<br>            {<br>                module = &m;<br>                bool modified = false;<br><br><br>                for (Module::iterator functionIter = module->begin(); functionIter != module->end(); functionIter++)<br>
                {<br>                    if (functionIter->isDeclaration())<br>                              continue;<br><br>                    Attributes attributes = functionIter->getFnAttributes();<br>                    if (!attributes.hasAttribute(Attributes::AlwaysInline))<br>
                    {<br>                        functionIter->addFnAttr(llvm::Attributes::AlwaysInline);<br><br>                        errs() << "AlwaysInline NOT detected\n";<br><br>                        modified = true;<br>
                    }<br>                    else<br>                    {<br>                        errs() << "AlwaysInline detected\n";<br>                    }<br>                }<br><br>                return modified;<br>
            }<br><br>            virtual void getAnalysisUsage(AnalysisUsage &analysisUsage) const<br>            {<br>                analysisUsage.addRequired<LoopInfo>();<br>                analysisUsage.addPreserved<LoopInfo>();<br>
                analysisUsage.addRequired<ScalarEvolution>();<br>                analysisUsage.addPreserved<ScalarEvolution>();<br>                analysisUsage.addRequired<DependenceAnalysis>();<br>                analysisUsage.addPreserved<DependenceAnalysis>();<br>
            }<br><br>        private:<br>            DependenceAnalysis* dependenceAnalysis;<br>            LoopInfo* loopInfo;<br>            Module* module;<br>            ScalarEvolution* scalarEvolution;<br>    };<br>
<br>    char ExtractFeatures::ID = 0;<br><br>    static RegisterPass<ExtractFeatures> X("extract", "Extract source features", true, true);<br>}<br><br><br>