aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
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 /src/llvm_backend.cpp
parentb68b090f136d43c3501c4c9772bd4dd68399eb37 (diff)
Change how `lb_populate_function_pass_manager` works by using the default LLVM passes when not using minimal optimizations
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp37
1 files changed, 36 insertions, 1 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);
+ }
}
}
}