summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorarphaman <arphaman@gmail.com>2013-07-18 09:38:42 +0100
committerarphaman <arphaman@gmail.com>2013-07-18 09:38:42 +0100
commit83e221ce01a798d99f071b250807af7c1458004e (patch)
tree30fac61fc0f3032fca3a8b1cf65cc493d2990a54 /tools
parent7d65588fd3550059592b7747fde6d8f228123a4a (diff)
downloadflang-83e221ce01a798d99f071b250807af7c1458004e.tar.gz
added optimization passes to the driver
Diffstat (limited to 'tools')
-rw-r--r--tools/driver/Main.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/tools/driver/Main.cpp b/tools/driver/Main.cpp
index 383ac6c79e..093bdf203a 100644
--- a/tools/driver/Main.cpp
+++ b/tools/driver/Main.cpp
@@ -23,6 +23,9 @@
#include "llvm/IR/Module.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/PassManager.h"
+#include "llvm/Transforms/IPO.h"
+#include "llvm/Transforms/IPO/PassManagerBuilder.h"
+#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Analysis/Verifier.h"
#include "llvm/Analysis/Passes.h"
#include "llvm/Transforms/Scalar.h"
@@ -94,14 +97,17 @@ namespace {
cl::opt<std::string>
OutputFile("o", cl::desc("<output file>"), cl::init(""));
+ cl::opt<int>
+ OptLevel("O", cl::desc("optimization level"), cl::init(0), cl::Prefix);
+
cl::opt<bool>
EmitDebugInfo("g", cl::desc("Emit debugging info"), cl::init(false));
cl::list<std::string>
- LinkDirectories("L", cl::desc("Additional directories for library files"));
+ LinkDirectories("L", cl::desc("Additional directories for library files"), cl::Prefix);
cl::list<std::string>
- LinkLibraries("l", cl::desc("Additional libraries"));
+ LinkLibraries("l", cl::desc("Additional libraries"), cl::Prefix);
cl::opt<bool>
CompileOnly("c", cl::desc("compile only, do not link"), cl::init(false));
@@ -252,6 +258,25 @@ static bool ParseFile(const std::string &Filename,
if(EmitASM) BA = Backend_EmitAssembly;
if(EmitLLVM) BA = Backend_EmitLL;
+ if(!(EmitLLVM && OptLevel == 0)) {
+ auto PM = new PassManager();
+
+ PM->add(createPromoteMemoryToRegisterPass());
+
+ PassManagerBuilder PMBuilder;
+ PMBuilder.OptLevel = OptLevel;
+ PMBuilder.SizeLevel = 0;
+ unsigned Threshold = 225;
+ if (OptLevel > 2)
+ Threshold = 275;
+ PMBuilder.Inliner = createFunctionInliningPass(Threshold);
+
+ PMBuilder.populateModulePassManager(*PM);
+
+ PM->run(*CG->GetModule());
+ delete PM;
+ }
+
llvm::Triple TheTriple(llvm::sys::getDefaultTargetTriple());
const llvm::Target *TheTarget = 0;
std::string Err;