Make the StackerCompiler and optimizing translator by running specific
authorReid Spencer <rspencer@reidspencer.com>
Sat, 4 Sep 2004 19:07:32 +0000 (19:07 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sat, 4 Sep 2004 19:07:32 +0000 (19:07 +0000)
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

projects/Stacker/lib/compiler/StackerCompiler.cpp
projects/Stacker/lib/compiler/StackerCompiler.h

index 29eb6d3fa17d8772a16d854a235552faa22f83ef..83b777be3cee1efb37145c39d4723eea94fb683c 100644 (file)
 //            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 
index 4186416d65ecc3be77bc010950ce347b586acd40..bf9642604da957d782ecb9391b3a6dd0ddd36905 100644 (file)
@@ -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