From c08809e29d1a7acc7b158b5620f414034c2bcd7b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 17 Feb 2023 14:48:50 +0000 Subject: Improve handling of passing constants to implicit immutable const ref parameters --- src/llvm_backend_proc.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/llvm_backend_proc.cpp') diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index b2ba4a864..b9ee0eeb5 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1045,9 +1045,25 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } else if (is_odin_cc) { // NOTE(bill): Odin parameters are immutable so the original value can be passed if possible // i.e. `T const &` in C++ - ptr = lb_address_from_load_or_generate_local(p, x); + if (LLVMIsConstant(x.value)) { + // NOTE(bill): if the value is already constant, then just it as a global variable + // and pass it by pointer + lbAddr addr = lb_add_global_generated(p->module, original_type, x); + lb_make_global_private_const(addr); + ptr = addr.addr; + } else { + ptr = lb_address_from_load_or_generate_local(p, x); + } } else { - ptr = lb_copy_value_to_ptr(p, x, original_type, 16); + if (LLVMIsConstant(x.value)) { + // NOTE(bill): if the value is already constant, then just it as a global variable + // and pass it by pointer + lbAddr addr = lb_add_global_generated(p->module, original_type, x); + lb_make_global_private_const(addr); + ptr = addr.addr; + } else { + ptr = lb_copy_value_to_ptr(p, x, original_type, 16); + } } array_add(&processed_args, ptr); } -- cgit v1.2.3 From 233f47cc995fe11f5c3207dbcc3584df3eabc2fd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 19 Feb 2023 12:47:14 +0000 Subject: Fix #2329 --- src/llvm_backend_proc.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src/llvm_backend_proc.cpp') diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index b9ee0eeb5..b9f2c2db2 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2304,7 +2304,15 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu break; case BuiltinProc_volatile_store: LLVMSetVolatile(instr, true); break; case BuiltinProc_atomic_store: LLVMSetOrdering(instr, LLVMAtomicOrderingSequentiallyConsistent); break; - case BuiltinProc_atomic_store_explicit: LLVMSetOrdering(instr, llvm_atomic_ordering_from_odin(ce->args[2])); break; + case BuiltinProc_atomic_store_explicit: + { + auto ordering = llvm_atomic_ordering_from_odin(ce->args[2]); + LLVMSetOrdering(instr, ordering); + if (ordering == LLVMAtomicOrderingUnordered) { + LLVMSetVolatile(instr, true); + } + } + break; } LLVMSetAlignment(instr, cast(unsigned)type_align_of(type_deref(dst.type))); @@ -2330,7 +2338,15 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu break; case BuiltinProc_volatile_load: LLVMSetVolatile(instr, true); break; case BuiltinProc_atomic_load: LLVMSetOrdering(instr, LLVMAtomicOrderingSequentiallyConsistent); break; - case BuiltinProc_atomic_load_explicit: LLVMSetOrdering(instr, llvm_atomic_ordering_from_odin(ce->args[1])); break; + case BuiltinProc_atomic_load_explicit: + { + auto ordering = llvm_atomic_ordering_from_odin(ce->args[1]); + LLVMSetOrdering(instr, ordering); + if (ordering == LLVMAtomicOrderingUnordered) { + LLVMSetVolatile(instr, true); + } + } + break; } LLVMSetAlignment(instr, cast(unsigned)type_align_of(type_deref(dst.type))); @@ -2400,6 +2416,9 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu lbValue res = {}; res.value = LLVMBuildAtomicRMW(p->builder, op, dst.value, val.value, ordering, false); res.type = tv.type; + if (ordering == LLVMAtomicOrderingUnordered) { + LLVMSetVolatile(res.value, true); + } return res; } @@ -2425,7 +2444,6 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu case BuiltinProc_atomic_compare_exchange_weak_explicit: success_ordering = llvm_atomic_ordering_from_odin(ce->args[3]); failure_ordering = llvm_atomic_ordering_from_odin(ce->args[4]); weak = true; break; } - // TODO(bill): Figure out how to make it weak LLVMBool single_threaded = false; LLVMValueRef value = LLVMBuildAtomicCmpXchg( @@ -2436,6 +2454,9 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu single_threaded ); LLVMSetWeak(value, weak); + if (success_ordering == LLVMAtomicOrderingUnordered || failure_ordering == LLVMAtomicOrderingUnordered) { + LLVMSetVolatile(value, true); + } if (is_type_tuple(tv.type)) { Type *fix_typed = alloc_type_tuple(); -- cgit v1.2.3