aboutsummaryrefslogtreecommitdiff
path: root/projects/Stacker/lib/compiler
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 /projects/Stacker/lib/compiler
parent2c711577ab8ee81672363fba92d5887868fd4a9f (diff)
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
Diffstat (limited to 'projects/Stacker/lib/compiler')
-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 29eb6d3fa1..83b777be3c 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 4186416d65..bf9642604d 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