aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-02-27 17:47:57 +0000
committergingerBill <bill@gingerbill.org>2021-02-27 17:47:57 +0000
commit6ffb4d268304fc098b05cd38a4adc9207256e16b (patch)
tree6dd54d1a3d791f93d38ed34c87029391c8a314f8 /src/llvm_backend.cpp
parent4f298a53142e33c2f0a0f2545f9148326fb0248b (diff)
Minor changes to function pass manager in llvm_backend.cpp
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp60
1 files changed, 33 insertions, 27 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 73f6420a7..872ea3281 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -11535,8 +11535,7 @@ void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup type_info da
for_array(type_info_type_index, info->type_info_types) {
Type *t = info->type_info_types[type_info_type_index];
- t = default_type(t);
- if (t == t_invalid) {
+ if (t == nullptr || t == t_invalid) {
continue;
}
@@ -12568,6 +12567,8 @@ void lb_generate_code(lbGenerator *gen) {
LLVMPassManagerRef default_function_pass_manager = LLVMCreateFunctionPassManagerForModule(mod);
defer (LLVMDisposePassManager(default_function_pass_manager));
+
+ LLVMInitializeFunctionPassManager(default_function_pass_manager);
{
auto dfpm = default_function_pass_manager;
@@ -12632,10 +12633,12 @@ void lb_generate_code(lbGenerator *gen) {
} while (repeat_count --> 0);
}
}
+ LLVMFinalizeFunctionPassManager(default_function_pass_manager);
LLVMPassManagerRef default_function_pass_manager_without_memcpy = LLVMCreateFunctionPassManagerForModule(mod);
defer (LLVMDisposePassManager(default_function_pass_manager_without_memcpy));
+ LLVMInitializeFunctionPassManager(default_function_pass_manager_without_memcpy);
{
auto dfpm = default_function_pass_manager_without_memcpy;
LLVMAddPromoteMemoryToRegisterPass(dfpm);
@@ -12648,8 +12651,9 @@ void lb_generate_code(lbGenerator *gen) {
LLVMAddCFGSimplificationPass(dfpm);
// LLVMAddUnifyFunctionExitNodesPass(dfpm);
}
+ LLVMFinalizeFunctionPassManager(default_function_pass_manager_without_memcpy);
- TIME_SECTION("LLVM Runtime Creation");
+ TIME_SECTION("LLVM Runtime Type Information Creation");
lbProcedure *startup_type_info = nullptr;
lbProcedure *startup_runtime = nullptr;
@@ -12678,6 +12682,7 @@ void lb_generate_code(lbGenerator *gen) {
LLVMRunFunctionPassManager(default_function_pass_manager, p->value);
}
+ TIME_SECTION("LLVM Runtime Startup Creation (Global Variables)");
{ // Startup Runtime
Type *params = alloc_type_tuple();
Type *results = alloc_type_tuple();
@@ -12780,6 +12785,7 @@ void lb_generate_code(lbGenerator *gen) {
}
if (!(build_context.build_mode == BuildMode_DynamicLibrary && !has_dll_main)) {
+ TIME_SECTION("LLVM DLL main");
Type *params = alloc_type_tuple();
@@ -12880,30 +12886,30 @@ void lb_generate_code(lbGenerator *gen) {
TIME_SECTION("LLVM Function Pass");
-
- for_array(i, m->procedures_to_generate) {
- lbProcedure *p = m->procedures_to_generate[i];
- if (p->body != nullptr) { // Build Procedure
- for (i32 i = 0; i <= build_context.optimization_level; i++) {
- if (p->flags & lbProcedureFlag_WithoutMemcpyPass) {
- LLVMRunFunctionPassManager(default_function_pass_manager_without_memcpy, p->value);
- } else {
- LLVMRunFunctionPassManager(default_function_pass_manager, p->value);
+ {
+ for_array(i, m->procedures_to_generate) {
+ lbProcedure *p = m->procedures_to_generate[i];
+ if (p->body != nullptr) { // Build Procedure
+ for (i32 i = 0; i <= build_context.optimization_level; i++) {
+ if (p->flags & lbProcedureFlag_WithoutMemcpyPass) {
+ LLVMRunFunctionPassManager(default_function_pass_manager_without_memcpy, p->value);
+ } else {
+ LLVMRunFunctionPassManager(default_function_pass_manager, p->value);
+ }
}
}
}
- }
- for_array(i, m->equal_procs.entries) {
- lbProcedure *p = m->equal_procs.entries[i].value;
- LLVMRunFunctionPassManager(default_function_pass_manager, p->value);
- }
- for_array(i, m->hasher_procs.entries) {
- lbProcedure *p = m->hasher_procs.entries[i].value;
- LLVMRunFunctionPassManager(default_function_pass_manager, p->value);
+ for_array(i, m->equal_procs.entries) {
+ lbProcedure *p = m->equal_procs.entries[i].value;
+ LLVMRunFunctionPassManager(default_function_pass_manager, p->value);
+ }
+ for_array(i, m->hasher_procs.entries) {
+ lbProcedure *p = m->hasher_procs.entries[i].value;
+ LLVMRunFunctionPassManager(default_function_pass_manager, p->value);
+ }
}
-
TIME_SECTION("LLVM Module Pass");
LLVMPassManagerRef module_pass_manager = LLVMCreatePassManager();
@@ -12911,12 +12917,12 @@ void lb_generate_code(lbGenerator *gen) {
LLVMAddAlwaysInlinerPass(module_pass_manager);
LLVMAddStripDeadPrototypesPass(module_pass_manager);
LLVMAddAnalysisPasses(target_machine, module_pass_manager);
- // if (build_context.optimization_level >= 2) {
- // LLVMAddArgumentPromotionPass(module_pass_manager);
- // LLVMAddConstantMergePass(module_pass_manager);
- // LLVMAddGlobalDCEPass(module_pass_manager);
- // LLVMAddDeadArgEliminationPass(module_pass_manager);
- // }
+ if (build_context.optimization_level >= 2) {
+ LLVMAddArgumentPromotionPass(module_pass_manager);
+ LLVMAddConstantMergePass(module_pass_manager);
+ LLVMAddGlobalDCEPass(module_pass_manager);
+ LLVMAddDeadArgEliminationPass(module_pass_manager);
+ }
LLVMPassManagerBuilderRef pass_manager_builder = LLVMPassManagerBuilderCreate();
defer (LLVMPassManagerBuilderDispose(pass_manager_builder));