aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_opt.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2023-06-23 14:33:01 +0100
committerGitHub <noreply@github.com>2023-06-23 14:33:01 +0100
commit26a5614572afd39fc35fc32b47d5f7e5e9771e56 (patch)
treeed94ed8589d3d0e32a5a8e494319bfcf292d27cd /src/llvm_backend_opt.cpp
parentf36e19e86fe88198fc1d17426afea577920efbf8 (diff)
parent19ea0906332e6185cd0eefe873179b9058ccd725 (diff)
Merge branch 'master' into skytrias-vendor-additions
Diffstat (limited to 'src/llvm_backend_opt.cpp')
-rw-r--r--src/llvm_backend_opt.cpp103
1 files changed, 64 insertions, 39 deletions
diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp
index e2f51b868..141ee88c7 100644
--- a/src/llvm_backend_opt.cpp
+++ b/src/llvm_backend_opt.cpp
@@ -32,21 +32,21 @@
**************************************************************************/
-void lb_populate_function_pass_manager(lbModule *m, 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(lbModule *m, LLVMPassManagerRef fpm, i32 optimization_level);
-
-LLVMBool lb_must_preserve_predicate_callback(LLVMValueRef value, void *user_data) {
- lbModule *m = cast(lbModule *)user_data;
- if (m == nullptr) {
- return false;
- }
- if (value == nullptr) {
- return false;
- }
- return LLVMIsAAllocaInst(value) != nullptr;
-}
+gb_internal void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level);
+gb_internal void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level);
+gb_internal void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, i32 optimization_level);
+gb_internal void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPassManagerRef fpm, i32 optimization_level);
+
+// gb_internal LLVMBool lb_must_preserve_predicate_callback(LLVMValueRef value, void *user_data) {
+// lbModule *m = cast(lbModule *)user_data;
+// if (m == nullptr) {
+// return false;
+// }
+// if (value == nullptr) {
+// return false;
+// }
+// return LLVMIsAAllocaInst(value) != nullptr;
+// }
#if LLVM_VERSION_MAJOR < 12
@@ -55,8 +55,17 @@ LLVMBool lb_must_preserve_predicate_callback(LLVMValueRef value, void *user_data
#define LLVM_ADD_CONSTANT_VALUE_PASS(fpm)
#endif
-void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) {
- if (false && optimization_level == 0 && build_context.ODIN_DEBUG) {
+gb_internal bool lb_opt_ignore(i32 optimization_level) {
+ optimization_level = gb_clamp(optimization_level, -1, 2);
+ return optimization_level == -1;
+}
+
+gb_internal void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) {
+ if (lb_opt_ignore(optimization_level)) {
+ return;
+ }
+
+ if (false && optimization_level <= 0 && build_context.ODIN_DEBUG) {
LLVMAddMergedLoadStoreMotionPass(fpm);
} else {
LLVMAddPromoteMemoryToRegisterPass(fpm);
@@ -68,15 +77,15 @@ void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimiz
}
}
-void lb_populate_function_pass_manager(lbModule *m, 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);
+gb_internal void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) {
+ if (lb_opt_ignore(optimization_level)) {
+ return;
+ }
if (ignore_memcpy_pass) {
lb_basic_populate_function_pass_manager(fpm, optimization_level);
return;
- } else if (optimization_level == 0) {
+ } else if (optimization_level <= 0) {
LLVMAddMemCpyOptPass(fpm);
lb_basic_populate_function_pass_manager(fpm, optimization_level);
return;
@@ -102,12 +111,12 @@ void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool
#endif
}
-void lb_populate_function_pass_manager_specific(lbModule *m, 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);
+gb_internal void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPassManagerRef fpm, i32 optimization_level) {
+ if (lb_opt_ignore(optimization_level)) {
+ return;
+ }
- if (optimization_level == 0) {
+ if (optimization_level <= 0) {
LLVMAddMemCpyOptPass(fpm);
lb_basic_populate_function_pass_manager(fpm, optimization_level);
return;
@@ -141,7 +150,7 @@ void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPassManagerRef
#endif
}
-void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level) {
+gb_internal void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimization_level) {
LLVMAddCFGSimplificationPass(mpm);
LLVMAddJumpThreadingPass(mpm);
@@ -177,12 +186,11 @@ void lb_add_function_simplifcation_passes(LLVMPassManagerRef mpm, i32 optimizati
}
-void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, i32 optimization_level) {
+gb_internal void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPassManagerRef mpm, 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 && build_context.ODIN_DEBUG) {
+ if (optimization_level <= 0 && build_context.ODIN_DEBUG) {
return;
}
@@ -190,7 +198,7 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
LLVMAddStripDeadPrototypesPass(mpm);
LLVMAddAnalysisPasses(target_machine, mpm);
LLVMAddPruneEHPass(mpm);
- if (optimization_level == 0) {
+ if (optimization_level <= 0) {
return;
}
@@ -266,7 +274,10 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
optimization of Odin programs
**************************************************************************/
-void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
+gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
+ unsigned debug_declare_id = LLVMLookupIntrinsicID("llvm.dbg.declare", 16);
+ GB_ASSERT(debug_declare_id != 0);
+
isize removal_count = 0;
isize pass_count = 0;
isize const max_pass_count = 10;
@@ -302,6 +313,8 @@ void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
// NOTE(bill): Explicit instructions are set here because some instructions could have side effects
switch (LLVMGetInstructionOpcode(curr_instr)) {
+ // case LLVMAlloca:
+
case LLVMFNeg:
case LLVMAdd:
case LLVMFAdd:
@@ -321,7 +334,6 @@ void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
case LLVMAnd:
case LLVMOr:
case LLVMXor:
- case LLVMAlloca:
case LLVMLoad:
case LLVMGetElementPtr:
case LLVMTrunc:
@@ -358,8 +370,21 @@ void lb_run_remove_dead_instruction_pass(lbProcedure *p) {
}
-void lb_run_function_pass_manager(LLVMPassManagerRef fpm, lbProcedure *p) {
+gb_internal void lb_run_function_pass_manager(LLVMPassManagerRef fpm, lbProcedure *p, lbFunctionPassManagerKind pass_manager_kind) {
+ if (p == nullptr) {
+ return;
+ }
LLVMRunFunctionPassManager(fpm, p->value);
+ switch (pass_manager_kind) {
+ case lbFunctionPassManager_none:
+ return;
+ case lbFunctionPassManager_default:
+ case lbFunctionPassManager_default_without_memcpy:
+ if (build_context.optimization_level < 0) {
+ return;
+ }
+ break;
+ }
// NOTE(bill): LLVMAddDCEPass doesn't seem to be exported in the official DLL's for LLVM
// which means we cannot rely upon it
// This is also useful for read the .ll for debug purposes because a lot of instructions
@@ -367,7 +392,7 @@ void lb_run_function_pass_manager(LLVMPassManagerRef fpm, lbProcedure *p) {
lb_run_remove_dead_instruction_pass(p);
}
-void llvm_delete_function(LLVMValueRef func) {
+gb_internal void llvm_delete_function(LLVMValueRef func) {
// for (LLVMBasicBlockRef block = LLVMGetFirstBasicBlock(func); block != nullptr; /**/) {
// LLVMBasicBlockRef curr_block = block;
// block = LLVMGetNextBasicBlock(block);
@@ -382,7 +407,7 @@ void llvm_delete_function(LLVMValueRef func) {
LLVMDeleteFunction(func);
}
-void lb_append_to_compiler_used(lbModule *m, LLVMValueRef func) {
+gb_internal void lb_append_to_compiler_used(lbModule *m, LLVMValueRef func) {
LLVMValueRef global = LLVMGetNamedGlobal(m->mod, "llvm.compiler.used");
LLVMValueRef *constants;
@@ -419,7 +444,7 @@ void lb_append_to_compiler_used(lbModule *m, LLVMValueRef func) {
LLVMSetInitializer(global, initializer);
}
-void lb_run_remove_unused_function_pass(lbModule *m) {
+gb_internal void lb_run_remove_unused_function_pass(lbModule *m) {
isize removal_count = 0;
isize pass_count = 0;
isize const max_pass_count = 10;
@@ -470,7 +495,7 @@ void lb_run_remove_unused_function_pass(lbModule *m) {
}
-void lb_run_remove_unused_globals_pass(lbModule *m) {
+gb_internal void lb_run_remove_unused_globals_pass(lbModule *m) {
isize removal_count = 0;
isize pass_count = 0;
isize const max_pass_count = 10;