diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index a74d5bd3a..a6291ccb9 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -14016,11 +14016,28 @@ void lb_generate_code(lbGenerator *gen) { LLVMPassRegistryRef pass_registry = LLVMGetGlobalPassRegistry(); LLVMPassManagerRef default_function_pass_manager = LLVMCreateFunctionPassManagerForModule(mod); + LLVMPassManagerRef function_pass_manager_minimal = LLVMCreateFunctionPassManagerForModule(mod); + LLVMPassManagerRef function_pass_manager_size = LLVMCreateFunctionPassManagerForModule(mod); + LLVMPassManagerRef function_pass_manager_speed = LLVMCreateFunctionPassManagerForModule(mod); defer (LLVMDisposePassManager(default_function_pass_manager)); + defer (LLVMDisposePassManager(function_pass_manager_minimal)); + defer (LLVMDisposePassManager(function_pass_manager_size)); + defer (LLVMDisposePassManager(function_pass_manager_speed)); LLVMInitializeFunctionPassManager(default_function_pass_manager); + LLVMInitializeFunctionPassManager(function_pass_manager_minimal); + LLVMInitializeFunctionPassManager(function_pass_manager_size); + LLVMInitializeFunctionPassManager(function_pass_manager_speed); + lb_populate_function_pass_manager(default_function_pass_manager, false, build_context.optimization_level); + lb_populate_function_pass_manager(function_pass_manager_minimal, false, 0); + lb_populate_function_pass_manager(function_pass_manager_size, false, 1); + lb_populate_function_pass_manager(function_pass_manager_speed, false, 2); + LLVMFinalizeFunctionPassManager(default_function_pass_manager); + LLVMFinalizeFunctionPassManager(function_pass_manager_minimal); + LLVMFinalizeFunctionPassManager(function_pass_manager_size); + LLVMFinalizeFunctionPassManager(function_pass_manager_speed); LLVMPassManagerRef default_function_pass_manager_without_memcpy = LLVMCreateFunctionPassManagerForModule(mod); @@ -14330,7 +14347,25 @@ void lb_generate_code(lbGenerator *gen) { if (p->flags & lbProcedureFlag_WithoutMemcpyPass) { LLVMRunFunctionPassManager(default_function_pass_manager_without_memcpy, p->value); } else { - LLVMRunFunctionPassManager(default_function_pass_manager, p->value); + if (p->entity && p->entity->kind == Entity_Procedure) { + switch (p->entity->Procedure.optimization_mode) { + case ProcedureOptimizationMode_None: + case ProcedureOptimizationMode_Minimal: + LLVMRunFunctionPassManager(function_pass_manager_minimal, p->value); + break; + case ProcedureOptimizationMode_Size: + LLVMRunFunctionPassManager(function_pass_manager_size, p->value); + break; + case ProcedureOptimizationMode_Speed: + LLVMRunFunctionPassManager(function_pass_manager_speed, p->value); + break; + default: + LLVMRunFunctionPassManager(default_function_pass_manager, p->value); + break; + } + } else { + LLVMRunFunctionPassManager(default_function_pass_manager, p->value); + } } } } diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index 5e1154af2..52cfa1808 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -1,11 +1,41 @@ +void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level); +void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level); +void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, i32 optimization_level); + +void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm) { + LLVMAddPromoteMemoryToRegisterPass(fpm); + LLVMAddMergedLoadStoreMotionPass(fpm); + LLVMAddConstantPropagationPass(fpm); + LLVMAddEarlyCSEPass(fpm); + + LLVMAddConstantPropagationPass(fpm); + LLVMAddMergedLoadStoreMotionPass(fpm); + LLVMAddPromoteMemoryToRegisterPass(fpm); + LLVMAddCFGSimplificationPass(fpm); +} + void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) { // NOTE(bill): Treat -opt:3 as if it was -opt:2 // TODO(bill): Determine which opt definitions should exist in the first place optimization_level = gb_clamp(optimization_level, 0, 2); - if (!ignore_memcpy_pass) { + if (ignore_memcpy_pass) { + lb_basic_populate_function_pass_manager(fpm); + return; + } else if (optimization_level == 0) { LLVMAddMemCpyOptPass(fpm); + lb_basic_populate_function_pass_manager(fpm); + return; } + +#if 1 + + LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate(); + LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level); + LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level); + LLVMPassManagerBuilderPopulateFunctionPassManager(pmb, fpm); +#else + LLVMAddMemCpyOptPass(fpm); LLVMAddPromoteMemoryToRegisterPass(fpm); LLVMAddMergedLoadStoreMotionPass(fpm); LLVMAddConstantPropagationPass(fpm); @@ -16,16 +46,6 @@ void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcp LLVMAddPromoteMemoryToRegisterPass(fpm); LLVMAddCFGSimplificationPass(fpm); - // LLVMAddSLPVectorizePass(fpm); - // LLVMAddLoopVectorizePass(fpm); - - // LLVMAddScalarizerPass(fpm); - // LLVMAddLoopIdiomPass(fpm); - if (optimization_level == 0) { - return; - } - -#if 1 LLVMAddSCCPPass(fpm); LLVMAddPromoteMemoryToRegisterPass(fpm);