diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index 4e447b242c..26677dd641 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -1245,8 +1245,32 @@ 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]))) { + 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; + } this->visit_expr(*x.m_args[i]); llvm::Value* item = tmp; llvm::Value* pos = llvm::ConstantInt::get(context, llvm::APInt(32, i));