aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-04-22 12:35:01 +0100
committergingerBill <bill@gingerbill.org>2021-04-22 12:35:01 +0100
commit7fcd5ecbd52c6488043dc0344e175f0e6535eea1 (patch)
treef1ef45d3862271aa917e6e7fefae4c078a281b0d
parentb68b090f136d43c3501c4c9772bd4dd68399eb37 (diff)
Change how `lb_populate_function_pass_manager` works by using the default LLVM passes when not using minimal optimizations
-rw-r--r--src/llvm_backend.cpp37
-rw-r--r--src/llvm_backend_opt.cpp42
2 files changed, 67 insertions, 12 deletions
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);