From fb5bb1cd83df0b41c68ea7a2427a57df1a82e3ca Mon Sep 17 00:00:00 2001 From: Morten Hauke Solvang Date: Fri, 13 Oct 2023 21:21:54 +0200 Subject: [PATCH] llvm: specify calling convention on call Looks like the compiler only was specifying the calling convention on function declarations, but not on function calls. But LLVM seems to produce "bad" code when optimizing with level -O2 unless you specify the same calling convention on the call too. --- src/llvm_backend_proc.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 7c0fbd0b9..ba920c042 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -891,6 +891,9 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue LLVMValueRef ret = LLVMBuildCall2(p->builder, fnp, fn, args, arg_count, ""); + auto llvm_cc = lb_calling_convention_map[proc_type->Proc.calling_convention]; + LLVMSetInstructionCallConv(ret, llvm_cc); + LLVMAttributeIndex param_offset = LLVMAttributeIndex_FirstArgIndex; if (return_ptr.value != nullptr) { param_offset += 1;