aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_opt.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2022-07-24 22:27:45 +0100
committerGitHub <noreply@github.com>2022-07-24 22:27:45 +0100
commit02a8bba02e6d5a499781dcb362803533c34ab1f1 (patch)
tree5aa0c61eed5fc1f6ed25d735641fb56246f6c806 /src/llvm_backend_opt.cpp
parent6ea68869c934807f1ecdc411e58bdce6b64ee7e2 (diff)
parenta3afe617c218736563723fd1ab343f403bdd33f0 (diff)
Merge branch 'master' into fix/freebsd-syscall
Diffstat (limited to 'src/llvm_backend_opt.cpp')
-rw-r--r--src/llvm_backend_opt.cpp78
1 files changed, 54 insertions, 24 deletions
diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp
index de925655f..6b80b21d6 100644
--- a/src/llvm_backend_opt.cpp
+++ b/src/llvm_backend_opt.cpp
@@ -48,12 +48,6 @@ LLVMBool lb_must_preserve_predicate_callback(LLVMValueRef value, void *user_data
return LLVMIsAAllocaInst(value) != nullptr;
}
-void lb_add_must_preserve_predicate_pass(lbModule *m, LLVMPassManagerRef fpm, i32 optimization_level) {
- if (false && optimization_level == 0 && m->debug_builder) {
- // LLVMAddInternalizePassWithMustPreservePredicate(fpm, m, lb_must_preserve_predicate_callback);
- }
-}
-
#if LLVM_VERSION_MAJOR < 12
#define LLVM_ADD_CONSTANT_VALUE_PASS(fpm) LLVMAddConstantPropagationPass(fpm)
@@ -61,16 +55,15 @@ void lb_add_must_preserve_predicate_pass(lbModule *m, LLVMPassManagerRef fpm, i3
#define LLVM_ADD_CONSTANT_VALUE_PASS(fpm)
#endif
-void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm) {
- LLVMAddPromoteMemoryToRegisterPass(fpm);
- LLVMAddMergedLoadStoreMotionPass(fpm);
- LLVM_ADD_CONSTANT_VALUE_PASS(fpm);
- LLVMAddEarlyCSEPass(fpm);
-
- // LLVM_ADD_CONSTANT_VALUE_PASS(fpm);
- // LLVMAddMergedLoadStoreMotionPass(fpm);
- // LLVMAddPromoteMemoryToRegisterPass(fpm);
- // LLVMAddCFGSimplificationPass(fpm);
+void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) {
+ if (false && optimization_level == 0 && build_context.ODIN_DEBUG) {
+ LLVMAddMergedLoadStoreMotionPass(fpm);
+ } else {
+ LLVMAddPromoteMemoryToRegisterPass(fpm);
+ LLVMAddMergedLoadStoreMotionPass(fpm);
+ LLVM_ADD_CONSTANT_VALUE_PASS(fpm);
+ LLVMAddEarlyCSEPass(fpm);
+ }
}
void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) {
@@ -78,14 +71,12 @@ void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool
// TODO(bill): Determine which opt definitions should exist in the first place
optimization_level = gb_clamp(optimization_level, 0, 2);
- lb_add_must_preserve_predicate_pass(m, fpm, optimization_level);
-
if (ignore_memcpy_pass) {
- lb_basic_populate_function_pass_manager(fpm);
+ lb_basic_populate_function_pass_manager(fpm, optimization_level);
return;
} else if (optimization_level == 0) {
LLVMAddMemCpyOptPass(fpm);
- lb_basic_populate_function_pass_manager(fpm);
+ lb_basic_populate_function_pass_manager(fpm, optimization_level);
return;
}
@@ -96,7 +87,7 @@ void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool
LLVMPassManagerBuilderPopulateFunctionPassManager(pmb, fpm);
#else
LLVMAddMemCpyOptPass(fpm);
- lb_basic_populate_function_pass_manager(fpm);
+ lb_basic_populate_function_pass_manager(fpm, optimization_level);
LLVMAddSCCPPass(fpm);
@@ -114,11 +105,9 @@ void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPassManagerRef
// TODO(bill): Determine which opt definitions should exist in the first place
optimization_level = gb_clamp(optimization_level, 0, 2);
- lb_add_must_preserve_predicate_pass(m, fpm, optimization_level);
-
if (optimization_level == 0) {
LLVMAddMemCpyOptPass(fpm);
- lb_basic_populate_function_pass_manager(fpm);
+ lb_basic_populate_function_pass_manager(fpm, optimization_level);
return;
}
@@ -191,6 +180,9 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa
// 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) {
+ return;
+ }
LLVMAddAlwaysInlinerPass(mpm);
LLVMAddStripDeadPrototypesPass(mpm);
@@ -388,6 +380,43 @@ void llvm_delete_function(LLVMValueRef func) {
LLVMDeleteFunction(func);
}
+void lb_append_to_compiler_used(lbModule *m, LLVMValueRef func) {
+ LLVMValueRef global = LLVMGetNamedGlobal(m->mod, "llvm.compiler.used");
+
+ LLVMValueRef *constants;
+ int operands = 1;
+
+ if (global != NULL) {
+ GB_ASSERT(LLVMIsAGlobalVariable(global));
+ LLVMValueRef initializer = LLVMGetInitializer(global);
+
+ GB_ASSERT(LLVMIsAConstantArray(initializer));
+ operands = LLVMGetNumOperands(initializer) + 1;
+ constants = gb_alloc_array(temporary_allocator(), LLVMValueRef, operands);
+
+ for (int i = 0; i < operands - 1; i++) {
+ LLVMValueRef operand = LLVMGetOperand(initializer, i);
+ GB_ASSERT(LLVMIsAConstant(operand));
+ constants[i] = operand;
+ }
+
+ LLVMDeleteGlobal(global);
+ } else {
+ constants = gb_alloc_array(temporary_allocator(), LLVMValueRef, 1);
+ }
+
+ LLVMTypeRef Int8PtrTy = LLVMPointerType(LLVMInt8TypeInContext(m->ctx), 0);
+ LLVMTypeRef ATy = LLVMArrayType(Int8PtrTy, operands);
+
+ constants[operands - 1] = LLVMConstBitCast(func, Int8PtrTy);
+ LLVMValueRef initializer = LLVMConstArray(Int8PtrTy, constants, operands);
+
+ global = LLVMAddGlobal(m->mod, ATy, "llvm.compiler.used");
+ LLVMSetLinkage(global, LLVMAppendingLinkage);
+ LLVMSetSection(global, "llvm.metadata");
+ LLVMSetInitializer(global, initializer);
+}
+
void lb_run_remove_unused_function_pass(lbModule *m) {
isize removal_count = 0;
isize pass_count = 0;
@@ -423,6 +452,7 @@ void lb_run_remove_unused_function_pass(lbModule *m) {
Entity *e = *found;
bool is_required = (e->flags & EntityFlag_Require) == EntityFlag_Require;
if (is_required) {
+ lb_append_to_compiler_used(m, curr_func);
continue;
}
}