From 15ddbdfd7137840044f155e7723a5bd6e0f2e9fc Mon Sep 17 00:00:00 2001 From: theraven Date: Fri, 22 Apr 2011 12:01:28 +0000 Subject: [PATCH] Added meta-pass that runs all of the LLVM optimisations. --- opts/ClassLookupCache.cpp | 2 +- opts/ObjectiveCOpts.cpp | 54 +++++++++++++++++++++++++++++++++++++++ opts/ObjectiveCOpts.h | 7 +++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 opts/ObjectiveCOpts.cpp create mode 100644 opts/ObjectiveCOpts.h diff --git a/opts/ClassLookupCache.cpp b/opts/ClassLookupCache.cpp index 19ef41f..7d34c11 100644 --- a/opts/ClassLookupCache.cpp +++ b/opts/ClassLookupCache.cpp @@ -128,7 +128,7 @@ namespace virtual bool runOnModule(Module &Mod) { statics.empty(); M = &Mod; - bool modified; + bool modified = false; for (Module::iterator F=Mod.begin(), fend=Mod.end() ; F != fend ; ++F) { diff --git a/opts/ObjectiveCOpts.cpp b/opts/ObjectiveCOpts.cpp new file mode 100644 index 0000000..0adbb02 --- /dev/null +++ b/opts/ObjectiveCOpts.cpp @@ -0,0 +1,54 @@ +#include "llvm/Pass.h" +#include "llvm/Module.h" + +#include "ObjectiveCOpts.h" + +using namespace llvm; +namespace +{ + class ObjectiveCOpts : public ModulePass { + ModulePass *IMPCachePass; + ModulePass *ClassLookupCachePass; + ModulePass *ClassMethodInliner; + FunctionPass *GNUNonfragileIvarPass; + FunctionPass *GNULoopIMPCachePass; + + public: + static char ID; + ObjectiveCOpts() : ModulePass(ID) { + IMPCachePass = createClassIMPCachePass(); + ClassLookupCachePass = createClassLookupCachePass(); + ClassMethodInliner = createClassMethodInliner(); + GNUNonfragileIvarPass = createGNUNonfragileIvarPass(); + GNULoopIMPCachePass = createGNULoopIMPCachePass(); + } + virtual ~ObjectiveCOpts() { + delete IMPCachePass; + delete ClassMethodInliner; + delete ClassLookupCachePass; + delete GNULoopIMPCachePass; + delete GNUNonfragileIvarPass; + } + + virtual bool runOnModule(Module &Mod) { + bool modified; + modified = IMPCachePass->runOnModule(Mod); + modified |= ClassLookupCachePass->runOnModule(Mod); + modified |= ClassMethodInliner->runOnModule(Mod); + + for (Module::iterator F=Mod.begin(), fend=Mod.end() ; + F != fend ; ++F) { + + if (F->isDeclaration()) { continue; } + modified |= GNUNonfragileIvarPass->runOnFunction(*F); + modified |= GNULoopIMPCachePass->runOnFunction(*F); + } + + return modified; + }; + }; + + char ObjectiveCOpts::ID = 0; + RegisterPass X("gnu-objc", + "Run all of the GNUstep Objective-C runtimm optimisations"); +} diff --git a/opts/ObjectiveCOpts.h b/opts/ObjectiveCOpts.h new file mode 100644 index 0000000..c90452d --- /dev/null +++ b/opts/ObjectiveCOpts.h @@ -0,0 +1,7 @@ +llvm::ModulePass *createClassIMPCachePass(void); +llvm::ModulePass *createClassLookupCachePass(void); +llvm::ModulePass *createClassMethodInliner(void); +llvm::FunctionPass *createGNUNonfragileIvarPass(void); +llvm::FunctionPass *createGNULoopIMPCachePass(void); +llvm::ModulePass *createTypeFeedbackPass(void); +llvm::ModulePass *createTypeFeedbackDrivenInlinerPass(void);