From 7fcd5ecbd52c6488043dc0344e175f0e6535eea1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 22 Apr 2021 12:35:01 +0100 Subject: Change how `lb_populate_function_pass_manager` works by using the default LLVM passes when not using minimal optimizations --- src/llvm_backend_opt.cpp | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) (limited to 'src/llvm_backend_opt.cpp') 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); -- cgit v1.2.3 From 1c9f48031deb4a214735de4b5206b4837a0cacfc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 22 Apr 2021 13:54:26 +0100 Subject: Change function pass manager passes --- src/llvm_backend.cpp | 6 +++--- src/llvm_backend_opt.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-) (limited to 'src/llvm_backend_opt.cpp') 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); -- cgit v1.2.3