diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-09-04 19:07:32 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-09-04 19:07:32 +0000 |
commit | c37a506d44cf3998fded129c31e41b92493c67fd (patch) | |
tree | 5524e69614a52f5cd5a0017db9b7abb8e2058739 | |
parent | 2c711577ab8ee81672363fba92d5887868fd4a9f (diff) | |
download | external_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.cpp | 94 | ||||
-rw-r--r-- | projects/Stacker/lib/compiler/StackerCompiler.h | 1 |
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 |