From 73953d69faf0f3e75ae6b484955b8144e851957d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= Date: Wed, 6 Dec 2023 11:20:36 -0700 Subject: [PATCH 1/2] Do not load CPtr --- src/libasr/codegen/asr_to_llvm.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index 4e447b242c..11ccdf1932 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -1245,8 +1245,12 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor llvm::Value* const_list = builder->CreateAlloca(const_list_type, nullptr, "const_list"); list_api->list_init(type_code, const_list, *module, x.n_args, x.n_args); int64_t ptr_loads_copy = ptr_loads; - ptr_loads = 1; for( size_t i = 0; i < x.n_args; i++ ) { + if (ASR::is_a(*ASRUtils::expr_type(x.m_args[i]))) { + ptr_loads = 0; + } else { + ptr_loads = 1; + } this->visit_expr(*x.m_args[i]); llvm::Value* item = tmp; llvm::Value* pos = llvm::ConstantInt::get(context, llvm::APInt(32, i)); From 84d73e7d63db80643fe78b5205184a876c2bb269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= Date: Wed, 3 Jan 2024 11:46:44 -0700 Subject: [PATCH 2/2] Only use ptr_loads = 0 if it is an argument The solution in this commit should be simplified. --- src/libasr/codegen/asr_to_llvm.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index 11ccdf1932..26677dd641 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -1247,7 +1247,27 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor int64_t ptr_loads_copy = ptr_loads; for( size_t i = 0; i < x.n_args; i++ ) { if (ASR::is_a(*ASRUtils::expr_type(x.m_args[i]))) { - ptr_loads = 0; + bool is_argument = false; + ASR::expr_t *var = x.m_args[i]; + if (is_a(*var)) { + ASR::symbol_t *var_sym = ASR::down_cast(var) + ->m_v; + if (is_a(*var_sym)) { + ASR::Variable_t *v = down_cast(var_sym); + if (v->m_intent == intent_local || + v->m_intent == intent_return_var || + !v->m_intent) { + is_argument = false; + } else { + is_argument = true; + } + } + } + if (is_argument) { + ptr_loads = 0; + } else { + ptr_loads = 1; + } } else { ptr_loads = 1; }