about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-04-07 12:12:21 -0400
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-04-07 12:12:21 -0400
commit25320da099e375be22706b641eba35b7e35299e0 (patch)
tree3da6433605ad2267391cf2546f1c4bdfbfb30823 /src/comp
parent2e90bd94de32c739733966bfac96cf35e9a08655 (diff)
downloadrust-25320da099e375be22706b641eba35b7e35299e0.tar.gz
rust-25320da099e375be22706b641eba35b7e35299e0.zip
Run optimizations.
It is always on for now just to make sure the bots are happy. If they
are, I will add a -O option and update the makefile.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/lib/llvm.rs34
-rw-r--r--src/comp/middle/trans.rs71
2 files changed, 100 insertions, 5 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 456e43fd656..047059240b3 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -741,6 +741,40 @@ native mod llvm = llvm_lib {
     /** Adds a verification pass. */
     fn LLVMAddVerifierPass(PassManagerRef PM);
 
+    fn LLVMAddGlobalOptimizerPass(PassManagerRef PM);
+    fn LLVMAddIPSCCPPass(PassManagerRef PM);
+    fn LLVMAddDeadArgEliminationPass(PassManagerRef PM);
+    fn LLVMAddInstructionCombiningPass(PassManagerRef PM);
+    fn LLVMAddCFGSimplificationPass(PassManagerRef PM);
+    fn LLVMAddFunctionInliningPass(PassManagerRef PM);
+    fn LLVMAddFunctionAttrsPass(PassManagerRef PM);
+    fn LLVMAddScalarReplAggregatesPass(PassManagerRef PM);
+    // fn LLVMAddScalarReplAggregatesPassSSA(PassManagerRef PM);
+    fn LLVMAddJumpThreadingPass(PassManagerRef PM);
+    fn LLVMAddConstantPropagationPass(PassManagerRef PM);
+    fn LLVMAddReassociatePass(PassManagerRef PM);
+    fn LLVMAddLoopRotatePass(PassManagerRef PM);
+    fn LLVMAddLICMPass(PassManagerRef PM);
+    fn LLVMAddLoopUnswitchPass(PassManagerRef PM);
+    fn LLVMAddLoopDeletionPass(PassManagerRef PM);
+    fn LLVMAddLoopUnrollPass(PassManagerRef PM);
+    fn LLVMAddGVNPass(PassManagerRef PM);
+    fn LLVMAddMemCpyOptPass(PassManagerRef PM);
+    fn LLVMAddSCCPPass(PassManagerRef PM);
+    fn LLVMAddDeadStoreEliminationPass(PassManagerRef PM);
+    fn LLVMAddStripDeadPrototypesPass(PassManagerRef PM);
+    fn LLVMAddDeadTypeEliminationPass(PassManagerRef PM);
+    fn LLVMAddConstantMergePass(PassManagerRef PM);
+    fn LLVMAddArgumentPromotionPass(PassManagerRef PM);
+    fn LLVMAddTailCallEliminationPass(PassManagerRef PM);
+    fn LLVMAddIndVarSimplifyPass(PassManagerRef PM);
+    fn LLVMAddAggressiveDCEPass(PassManagerRef PM);
+    fn LLVMAddGlobalDCEPass(PassManagerRef PM);
+    // fn LLVMAddCorrelatedValuePropagationPass(PassManagerRef PM);
+    fn LLVMAddPruneEHPass(PassManagerRef PM);
+    fn LLVMAddSimplifyLibCallsPass(PassManagerRef PM);
+    // fn LLVMAddLoopIdiomPass(PassManagerRef PM);
+
     /** Destroys a memory buffer. */
     fn LLVMDisposeMemoryBuffer(MemoryBufferRef MemBuf);
 
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index fff3f126948..c5375a9f8bb 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -6599,12 +6599,71 @@ fn trap(@block_ctxt bcx) {
     bcx.build.Call(bcx.fcx.ccx.intrinsics.get("llvm.trap"), v);
 }
 
-fn check_module(ModuleRef llmod) {
+fn run_passes(ModuleRef llmod, bool opt) {
     auto pm = mk_pass_manager();
-    llvm.LLVMAddVerifierPass(pm.llpm);
-    llvm.LLVMRunPassManager(pm.llpm, llmod);
 
     // TODO: run the linter here also, once there are llvm-c bindings for it.
+
+    // FIXME: This is mostly a copy of the bits of opt's -O2 that are
+    // available in the C api.
+    // FIXME2: We might want to add optmization levels like -O1, -O2, -Os, etc
+    // FIXME3: Should we expose and use the pass lists used by the opt tool?
+    if (opt) {
+        auto fpm = mk_pass_manager();
+
+        // createStandardFunctionPasses
+        llvm.LLVMAddCFGSimplificationPass(fpm.llpm);
+        llvm.LLVMAddScalarReplAggregatesPass(fpm.llpm);
+        //llvm.LLVMAddEarlyCSEPass(fpm.llpm);
+
+        llvm.LLVMRunPassManager(fpm.llpm, llmod);
+
+        // createStandardModulePasses
+        llvm.LLVMAddGlobalOptimizerPass(pm.llpm);
+        llvm.LLVMAddIPSCCPPass(pm.llpm);
+        llvm.LLVMAddDeadArgEliminationPass(pm.llpm);
+        llvm.LLVMAddInstructionCombiningPass(pm.llpm);
+        llvm.LLVMAddCFGSimplificationPass(pm.llpm);
+        llvm.LLVMAddPruneEHPass(pm.llpm);
+        llvm.LLVMAddFunctionInliningPass(pm.llpm);
+
+        // FIXME: crashes!
+        // llvm.LLVMAddFunctionAttrsPass(pm.llpm);
+
+        // llvm.LLVMAddScalarReplAggregatesPassSSA(pm.llpm);
+        // llvm.LLVMAddEarlyCSEPass(pm.llpm);
+        llvm.LLVMAddSimplifyLibCallsPass(pm.llpm);
+        llvm.LLVMAddJumpThreadingPass(pm.llpm);
+        // llvm.LLVMAddCorrelatedValuePropagationPass(pm.llpm);
+        llvm.LLVMAddCFGSimplificationPass(pm.llpm);
+        llvm.LLVMAddInstructionCombiningPass(pm.llpm);
+        llvm.LLVMAddTailCallEliminationPass(pm.llpm);
+        llvm.LLVMAddCFGSimplificationPass(pm.llpm);
+        llvm.LLVMAddReassociatePass(pm.llpm);
+        llvm.LLVMAddLoopRotatePass(pm.llpm);
+        llvm.LLVMAddLICMPass(pm.llpm);
+        llvm.LLVMAddLoopUnswitchPass(pm.llpm);
+        llvm.LLVMAddInstructionCombiningPass(pm.llpm);
+        llvm.LLVMAddIndVarSimplifyPass(pm.llpm);
+        // llvm.LLVMAddLoopIdiomPass(pm.llpm);
+        llvm.LLVMAddLoopDeletionPass(pm.llpm);
+        llvm.LLVMAddLoopUnrollPass(pm.llpm);
+        llvm.LLVMAddInstructionCombiningPass(pm.llpm);
+        llvm.LLVMAddGVNPass(pm.llpm);
+        llvm.LLVMAddMemCpyOptPass(pm.llpm);
+        llvm.LLVMAddSCCPPass(pm.llpm);
+        llvm.LLVMAddInstructionCombiningPass(pm.llpm);
+        llvm.LLVMAddJumpThreadingPass(pm.llpm);
+        // llvm.LLVMAddCorrelatedValuePropagationPass(pm.llpm);
+        llvm.LLVMAddDeadStoreEliminationPass(pm.llpm);
+        llvm.LLVMAddAggressiveDCEPass(pm.llpm);
+        llvm.LLVMAddCFGSimplificationPass(pm.llpm);
+        llvm.LLVMAddStripDeadPrototypesPass(pm.llpm);
+        llvm.LLVMAddDeadTypeEliminationPass(pm.llpm);
+        llvm.LLVMAddConstantMergePass(pm.llpm);
+    }
+    llvm.LLVMAddVerifierPass(pm.llpm);
+    llvm.LLVMRunPassManager(pm.llpm, llmod);
 }
 
 fn decl_no_op_type_glue(ModuleRef llmod, type_names tn) -> ValueRef {
@@ -6962,7 +7021,8 @@ fn make_common_glue(str output) {
 
     trans_exit_task_glue(glues, new_str_hash[ValueRef](), tn, llmod);
 
-    check_module(llmod);
+    run_passes(llmod, true);
+
     llvm.LLVMWriteBitcodeToFile(llmod, _str.buf(output));
     llvm.LLVMDisposeModule(llmod);
 }
@@ -7031,7 +7091,8 @@ fn trans_crate(session.session sess, @ast.crate crate,
     // Translate the metadata.
     middle.metadata.write_metadata(cx, crate);
 
-    check_module(llmod);
+    // FIXME: Add an -O option
+    run_passes(llmod, true);
 
     llvm.LLVMWriteBitcodeToFile(llmod, _str.buf(output));
     llvm.LLVMDisposeModule(llmod);