Skip to content

Commit 25320da

Browse files
committed
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.
1 parent 2e90bd9 commit 25320da

File tree

2 files changed

+100
-5
lines changed

2 files changed

+100
-5
lines changed

src/comp/lib/llvm.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,40 @@ native mod llvm = llvm_lib {
741741
/** Adds a verification pass. */
742742
fn LLVMAddVerifierPass(PassManagerRef PM);
743743

744+
fn LLVMAddGlobalOptimizerPass(PassManagerRef PM);
745+
fn LLVMAddIPSCCPPass(PassManagerRef PM);
746+
fn LLVMAddDeadArgEliminationPass(PassManagerRef PM);
747+
fn LLVMAddInstructionCombiningPass(PassManagerRef PM);
748+
fn LLVMAddCFGSimplificationPass(PassManagerRef PM);
749+
fn LLVMAddFunctionInliningPass(PassManagerRef PM);
750+
fn LLVMAddFunctionAttrsPass(PassManagerRef PM);
751+
fn LLVMAddScalarReplAggregatesPass(PassManagerRef PM);
752+
// fn LLVMAddScalarReplAggregatesPassSSA(PassManagerRef PM);
753+
fn LLVMAddJumpThreadingPass(PassManagerRef PM);
754+
fn LLVMAddConstantPropagationPass(PassManagerRef PM);
755+
fn LLVMAddReassociatePass(PassManagerRef PM);
756+
fn LLVMAddLoopRotatePass(PassManagerRef PM);
757+
fn LLVMAddLICMPass(PassManagerRef PM);
758+
fn LLVMAddLoopUnswitchPass(PassManagerRef PM);
759+
fn LLVMAddLoopDeletionPass(PassManagerRef PM);
760+
fn LLVMAddLoopUnrollPass(PassManagerRef PM);
761+
fn LLVMAddGVNPass(PassManagerRef PM);
762+
fn LLVMAddMemCpyOptPass(PassManagerRef PM);
763+
fn LLVMAddSCCPPass(PassManagerRef PM);
764+
fn LLVMAddDeadStoreEliminationPass(PassManagerRef PM);
765+
fn LLVMAddStripDeadPrototypesPass(PassManagerRef PM);
766+
fn LLVMAddDeadTypeEliminationPass(PassManagerRef PM);
767+
fn LLVMAddConstantMergePass(PassManagerRef PM);
768+
fn LLVMAddArgumentPromotionPass(PassManagerRef PM);
769+
fn LLVMAddTailCallEliminationPass(PassManagerRef PM);
770+
fn LLVMAddIndVarSimplifyPass(PassManagerRef PM);
771+
fn LLVMAddAggressiveDCEPass(PassManagerRef PM);
772+
fn LLVMAddGlobalDCEPass(PassManagerRef PM);
773+
// fn LLVMAddCorrelatedValuePropagationPass(PassManagerRef PM);
774+
fn LLVMAddPruneEHPass(PassManagerRef PM);
775+
fn LLVMAddSimplifyLibCallsPass(PassManagerRef PM);
776+
// fn LLVMAddLoopIdiomPass(PassManagerRef PM);
777+
744778
/** Destroys a memory buffer. */
745779
fn LLVMDisposeMemoryBuffer(MemoryBufferRef MemBuf);
746780

src/comp/middle/trans.rs

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6599,12 +6599,71 @@ fn trap(@block_ctxt bcx) {
65996599
bcx.build.Call(bcx.fcx.ccx.intrinsics.get("llvm.trap"), v);
66006600
}
66016601

6602-
fn check_module(ModuleRef llmod) {
6602+
fn run_passes(ModuleRef llmod, bool opt) {
66036603
auto pm = mk_pass_manager();
6604-
llvm.LLVMAddVerifierPass(pm.llpm);
6605-
llvm.LLVMRunPassManager(pm.llpm, llmod);
66066604

66076605
// TODO: run the linter here also, once there are llvm-c bindings for it.
6606+
6607+
// FIXME: This is mostly a copy of the bits of opt's -O2 that are
6608+
// available in the C api.
6609+
// FIXME2: We might want to add optmization levels like -O1, -O2, -Os, etc
6610+
// FIXME3: Should we expose and use the pass lists used by the opt tool?
6611+
if (opt) {
6612+
auto fpm = mk_pass_manager();
6613+
6614+
// createStandardFunctionPasses
6615+
llvm.LLVMAddCFGSimplificationPass(fpm.llpm);
6616+
llvm.LLVMAddScalarReplAggregatesPass(fpm.llpm);
6617+
//llvm.LLVMAddEarlyCSEPass(fpm.llpm);
6618+
6619+
llvm.LLVMRunPassManager(fpm.llpm, llmod);
6620+
6621+
// createStandardModulePasses
6622+
llvm.LLVMAddGlobalOptimizerPass(pm.llpm);
6623+
llvm.LLVMAddIPSCCPPass(pm.llpm);
6624+
llvm.LLVMAddDeadArgEliminationPass(pm.llpm);
6625+
llvm.LLVMAddInstructionCombiningPass(pm.llpm);
6626+
llvm.LLVMAddCFGSimplificationPass(pm.llpm);
6627+
llvm.LLVMAddPruneEHPass(pm.llpm);
6628+
llvm.LLVMAddFunctionInliningPass(pm.llpm);
6629+
6630+
// FIXME: crashes!
6631+
// llvm.LLVMAddFunctionAttrsPass(pm.llpm);
6632+
6633+
// llvm.LLVMAddScalarReplAggregatesPassSSA(pm.llpm);
6634+
// llvm.LLVMAddEarlyCSEPass(pm.llpm);
6635+
llvm.LLVMAddSimplifyLibCallsPass(pm.llpm);
6636+
llvm.LLVMAddJumpThreadingPass(pm.llpm);
6637+
// llvm.LLVMAddCorrelatedValuePropagationPass(pm.llpm);
6638+
llvm.LLVMAddCFGSimplificationPass(pm.llpm);
6639+
llvm.LLVMAddInstructionCombiningPass(pm.llpm);
6640+
llvm.LLVMAddTailCallEliminationPass(pm.llpm);
6641+
llvm.LLVMAddCFGSimplificationPass(pm.llpm);
6642+
llvm.LLVMAddReassociatePass(pm.llpm);
6643+
llvm.LLVMAddLoopRotatePass(pm.llpm);
6644+
llvm.LLVMAddLICMPass(pm.llpm);
6645+
llvm.LLVMAddLoopUnswitchPass(pm.llpm);
6646+
llvm.LLVMAddInstructionCombiningPass(pm.llpm);
6647+
llvm.LLVMAddIndVarSimplifyPass(pm.llpm);
6648+
// llvm.LLVMAddLoopIdiomPass(pm.llpm);
6649+
llvm.LLVMAddLoopDeletionPass(pm.llpm);
6650+
llvm.LLVMAddLoopUnrollPass(pm.llpm);
6651+
llvm.LLVMAddInstructionCombiningPass(pm.llpm);
6652+
llvm.LLVMAddGVNPass(pm.llpm);
6653+
llvm.LLVMAddMemCpyOptPass(pm.llpm);
6654+
llvm.LLVMAddSCCPPass(pm.llpm);
6655+
llvm.LLVMAddInstructionCombiningPass(pm.llpm);
6656+
llvm.LLVMAddJumpThreadingPass(pm.llpm);
6657+
// llvm.LLVMAddCorrelatedValuePropagationPass(pm.llpm);
6658+
llvm.LLVMAddDeadStoreEliminationPass(pm.llpm);
6659+
llvm.LLVMAddAggressiveDCEPass(pm.llpm);
6660+
llvm.LLVMAddCFGSimplificationPass(pm.llpm);
6661+
llvm.LLVMAddStripDeadPrototypesPass(pm.llpm);
6662+
llvm.LLVMAddDeadTypeEliminationPass(pm.llpm);
6663+
llvm.LLVMAddConstantMergePass(pm.llpm);
6664+
}
6665+
llvm.LLVMAddVerifierPass(pm.llpm);
6666+
llvm.LLVMRunPassManager(pm.llpm, llmod);
66086667
}
66096668

66106669
fn decl_no_op_type_glue(ModuleRef llmod, type_names tn) -> ValueRef {
@@ -6962,7 +7021,8 @@ fn make_common_glue(str output) {
69627021

69637022
trans_exit_task_glue(glues, new_str_hash[ValueRef](), tn, llmod);
69647023

6965-
check_module(llmod);
7024+
run_passes(llmod, true);
7025+
69667026
llvm.LLVMWriteBitcodeToFile(llmod, _str.buf(output));
69677027
llvm.LLVMDisposeModule(llmod);
69687028
}
@@ -7031,7 +7091,8 @@ fn trans_crate(session.session sess, @ast.crate crate,
70317091
// Translate the metadata.
70327092
middle.metadata.write_metadata(cx, crate);
70337093

7034-
check_module(llmod);
7094+
// FIXME: Add an -O option
7095+
run_passes(llmod, true);
70357096

70367097
llvm.LLVMWriteBitcodeToFile(llmod, _str.buf(output));
70377098
llvm.LLVMDisposeModule(llmod);

0 commit comments

Comments
 (0)