@@ -6599,12 +6599,71 @@ fn trap(@block_ctxt bcx) {
6599
6599
bcx. build . Call ( bcx. fcx . ccx . intrinsics . get ( "llvm.trap" ) , v) ;
6600
6600
}
6601
6601
6602
- fn check_module ( ModuleRef llmod) {
6602
+ fn run_passes ( ModuleRef llmod, bool opt ) {
6603
6603
auto pm = mk_pass_manager ( ) ;
6604
- llvm. LLVMAddVerifierPass ( pm. llpm ) ;
6605
- llvm. LLVMRunPassManager ( pm. llpm , llmod) ;
6606
6604
6607
6605
// 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) ;
6608
6667
}
6609
6668
6610
6669
fn decl_no_op_type_glue ( ModuleRef llmod, type_names tn) -> ValueRef {
@@ -6962,7 +7021,8 @@ fn make_common_glue(str output) {
6962
7021
6963
7022
trans_exit_task_glue ( glues, new_str_hash[ ValueRef ] ( ) , tn, llmod) ;
6964
7023
6965
- check_module ( llmod) ;
7024
+ run_passes ( llmod, true ) ;
7025
+
6966
7026
llvm. LLVMWriteBitcodeToFile ( llmod, _str. buf ( output) ) ;
6967
7027
llvm. LLVMDisposeModule ( llmod) ;
6968
7028
}
@@ -7031,7 +7091,8 @@ fn trans_crate(session.session sess, @ast.crate crate,
7031
7091
// Translate the metadata.
7032
7092
middle. metadata . write_metadata ( cx, crate ) ;
7033
7093
7034
- check_module ( llmod) ;
7094
+ // FIXME: Add an -O option
7095
+ run_passes ( llmod, true ) ;
7035
7096
7036
7097
llvm. LLVMWriteBitcodeToFile ( llmod, _str. buf ( output) ) ;
7037
7098
llvm. LLVMDisposeModule ( llmod) ;
0 commit comments