aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-09-04 19:07:32 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-09-04 19:07:32 +0000
commitc37a506d44cf3998fded129c31e41b92493c67fd (patch)
tree5524e69614a52f5cd5a0017db9b7abb8e2058739
parent2c711577ab8ee81672363fba92d5887868fd4a9f (diff)
downloadexternal_llvm-c37a506d44cf3998fded129c31e41b92493c67fd.zip
external_llvm-c37a506d44cf3998fded129c31e41b92493c67fd.tar.gz
external_llvm-c37a506d44cf3998fded129c31e41b92493c67fd.tar.bz2
Make the StackerCompiler and optimizing translator by running specific
optimizations after construction of the Module. The OptLevel argument to the compile function controls the level of optimization. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16166 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--projects/Stacker/lib/compiler/StackerCompiler.cpp94
-rw-r--r--projects/Stacker/lib/compiler/StackerCompiler.h1
2 files changed, 92 insertions, 3 deletions
diff --git a/projects/Stacker/lib/compiler/StackerCompiler.cpp b/projects/Stacker/lib/compiler/StackerCompiler.cpp
index 29eb6d3..83b777b 100644
--- a/projects/Stacker/lib/compiler/StackerCompiler.cpp
+++ b/projects/Stacker/lib/compiler/StackerCompiler.cpp
@@ -16,9 +16,15 @@
// Globasl - Global variables we use
//===----------------------------------------------------------------------===//
-#include <llvm/Analysis/Verifier.h>
-#include <llvm/Instructions.h>
-#include <llvm/ADT/Statistic.h>
+#include "llvm/PassManager.h"
+#include "llvm/Analysis/LoadValueNumbering.h"
+#include "llvm/Analysis/Verifier.h"
+#include "llvm/Assembly/Parser.h"
+#include "llvm/Target/TargetData.h"
+#include "llvm/Transforms/IPO.h"
+#include "llvm/Transforms/Scalar.h"
+#include "llvm/Instructions.h"
+#include "llvm/ADT/Statistic.h"
#include "StackerCompiler.h"
#include "StackerParser.h"
#include <string>
@@ -80,6 +86,7 @@ Module*
StackerCompiler::compile(
const std::string& filename,
bool should_echo,
+ unsigned optLevel,
size_t the_stack_size
)
{
@@ -254,6 +261,87 @@ StackerCompiler::compile(
// Avoid potential illegal use (TheInstance might be on the stack)
TheInstance = 0;
+ // Set up a pass manager
+ PassManager Passes;
+ // Add in the passes we want to execute
+ Passes.add(new TargetData("stkrc",TheModule));
+ // Verify we start with valid
+ Passes.add(createVerifierPass());
+
+ if (optLevel > 0) {
+ if (optLevel > 1) {
+ // Clean up disgusting code
+ Passes.add(createCFGSimplificationPass());
+ // Mark read-only globals const
+ Passes.add(createGlobalConstifierPass());
+ // Remove unused globals
+ Passes.add(createGlobalDCEPass());
+ // IP Constant Propagation
+ Passes.add(createIPConstantPropagationPass());
+ // Clean up after IPCP
+ Passes.add(createInstructionCombiningPass());
+ // Clean up after IPCP
+ Passes.add(createCFGSimplificationPass());
+ // Inline small definitions (functions)
+ Passes.add(createFunctionInliningPass());
+ // Simplify cfg by copying code
+ Passes.add(createTailDuplicationPass());
+ if (optLevel > 2) {
+ // Merge & remove BBs
+ Passes.add(createCFGSimplificationPass());
+ // Compile silly sequences
+ Passes.add(createInstructionCombiningPass());
+ // Reassociate expressions
+ Passes.add(createReassociatePass());
+ // Combine silly seq's
+ Passes.add(createInstructionCombiningPass());
+ // Eliminate tail calls
+ Passes.add(createTailCallEliminationPass());
+ // Merge & remove BBs
+ Passes.add(createCFGSimplificationPass());
+ // Hoist loop invariants
+ Passes.add(createLICMPass());
+ // Clean up after the unroller
+ Passes.add(createInstructionCombiningPass());
+ // Canonicalize indvars
+ Passes.add(createIndVarSimplifyPass());
+ // Unroll small loops
+ Passes.add(createLoopUnrollPass());
+ // Clean up after the unroller
+ Passes.add(createInstructionCombiningPass());
+ // GVN for load instructions
+ Passes.add(createLoadValueNumberingPass());
+ // Remove common subexprs
+ Passes.add(createGCSEPass());
+ // Constant prop with SCCP
+ Passes.add(createSCCPPass());
+ }
+ if (optLevel > 3) {
+ // Run instcombine again after redundancy elimination
+ Passes.add(createInstructionCombiningPass());
+ // Delete dead stores
+ Passes.add(createDeadStoreEliminationPass());
+ // SSA based 'Aggressive DCE'
+ Passes.add(createAggressiveDCEPass());
+ // Merge & remove BBs
+ Passes.add(createCFGSimplificationPass());
+ // Merge dup global constants
+ Passes.add(createConstantMergePass());
+ }
+ }
+
+ // Merge & remove BBs
+ Passes.add(createCFGSimplificationPass());
+ // Memory To Register
+ Passes.add(createPromoteMemoryToRegister());
+ // Compile silly sequences
+ Passes.add(createInstructionCombiningPass());
+ // Make sure everything is still good.
+ Passes.add(createVerifierPass());
+ }
+
+ // Run our queue of passes all at once now, efficiently.
+ Passes.run(*TheModule);
} catch (...) {
if (F != stdin) fclose(F); // Make sure to close file descriptor
diff --git a/projects/Stacker/lib/compiler/StackerCompiler.h b/projects/Stacker/lib/compiler/StackerCompiler.h
index 4186416..bf96426 100644
--- a/projects/Stacker/lib/compiler/StackerCompiler.h
+++ b/projects/Stacker/lib/compiler/StackerCompiler.h
@@ -69,6 +69,7 @@ class StackerCompiler
Module* compile(
const std::string& filename, ///< File to compile
bool echo, ///< Causes compiler to echo output
+ unsigned optLevel, ///< Level of optimization
size_t stack_size ); ///< Size of generated stack
/// @}
/// @name Accessors