From 1c9f48031deb4a214735de4b5206b4837a0cacfc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 22 Apr 2021 13:54:26 +0100 Subject: [PATCH] Change function pass manager passes --- src/llvm_backend.cpp | 6 +++--- src/llvm_backend_opt.cpp | 41 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index a6291ccb9..789d3203c 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -14030,9 +14030,9 @@ void lb_generate_code(lbGenerator *gen) { 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); + lb_populate_function_pass_manager_specific(function_pass_manager_minimal, 0); + lb_populate_function_pass_manager_specific(function_pass_manager_size, 1); + lb_populate_function_pass_manager_specific(function_pass_manager_speed, 2); LLVMFinalizeFunctionPassManager(default_function_pass_manager); LLVMFinalizeFunctionPassManager(function_pass_manager_minimal); diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index 52cfa1808..3b268dffa 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -1,6 +1,7 @@ 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_populate_function_pass_manager_specific(LLVMPassManagerRef fpm, i32 optimization_level); void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm) { LLVMAddPromoteMemoryToRegisterPass(fpm); @@ -28,8 +29,46 @@ void lb_populate_function_pass_manager(LLVMPassManagerRef fpm, bool ignore_memcp return; } -#if 1 +#if 0 + LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate(); + LLVMPassManagerBuilderSetOptLevel(pmb, optimization_level); + LLVMPassManagerBuilderSetSizeLevel(pmb, optimization_level); + LLVMPassManagerBuilderPopulateFunctionPassManager(pmb, fpm); +#else + LLVMAddMemCpyOptPass(fpm); + LLVMAddPromoteMemoryToRegisterPass(fpm); + LLVMAddMergedLoadStoreMotionPass(fpm); + LLVMAddConstantPropagationPass(fpm); + LLVMAddEarlyCSEPass(fpm); + LLVMAddConstantPropagationPass(fpm); + LLVMAddMergedLoadStoreMotionPass(fpm); + LLVMAddPromoteMemoryToRegisterPass(fpm); + LLVMAddCFGSimplificationPass(fpm); + + LLVMAddSCCPPass(fpm); + + LLVMAddPromoteMemoryToRegisterPass(fpm); + LLVMAddUnifyFunctionExitNodesPass(fpm); + + LLVMAddCFGSimplificationPass(fpm); + LLVMAddEarlyCSEPass(fpm); + LLVMAddLowerExpectIntrinsicPass(fpm); +#endif +} + +void lb_populate_function_pass_manager_specific(LLVMPassManagerRef fpm, 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 (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);