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/4] 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/4] 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; } From 6573353d9618071f1646f7d59fce96dd1a382100 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Sun, 7 Jan 2024 16:20:23 +0530 Subject: [PATCH 3/4] Refactored code and added test --- integration_tests/CMakeLists.txt | 1 + integration_tests/symbolics_14.py | 15 +++++++++++++++ src/libasr/asr_utils.h | 20 ++++++++++++++++++++ src/libasr/codegen/asr_to_llvm.cpp | 6 ++++++ 4 files changed, 42 insertions(+) create mode 100644 integration_tests/symbolics_14.py diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index d5a477f006..694f5bd14e 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -717,6 +717,7 @@ RUN(NAME symbolics_10 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_11 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_12 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_13 LABELS cpython_sym c_sym llvm_sym NOFAST) +RUN(NAME symbolics_14 LABELS cpython_sym llvm_sym NOFAST) RUN(NAME test_gruntz LABELS cpython_sym llvm_sym NOFAST) RUN(NAME sizeof_01 LABELS llvm c diff --git a/integration_tests/symbolics_14.py b/integration_tests/symbolics_14.py new file mode 100644 index 0000000000..f99ad7aa39 --- /dev/null +++ b/integration_tests/symbolics_14.py @@ -0,0 +1,15 @@ +from lpython import S +from sympy import Symbol + +def mmrv(x: S) -> list[S]: + l1: list[S] = [x] + return l1 + +def test_mrv1(): + x: S = Symbol("x") + ans: list[S] = mmrv(x) + element_1: S = ans[0] + print(element_1) + assert element_1 == x + +test_mrv1() \ No newline at end of file diff --git a/src/libasr/asr_utils.h b/src/libasr/asr_utils.h index 51337784d5..31e7d0dba1 100644 --- a/src/libasr/asr_utils.h +++ b/src/libasr/asr_utils.h @@ -4737,6 +4737,26 @@ static inline bool is_simd_array(ASR::expr_t *v) { == ASR::array_physical_typeType::SIMDArray); } +static inline bool is_argument_of_type_CPtr(ASR::expr_t *var) { + bool is_argument = false; + if (ASR::is_a(*expr_type(var))) { + if (ASR::is_a(*var)) { + ASR::symbol_t *var_sym = ASR::down_cast(var)->m_v; + if (ASR::is_a(*var_sym)) { + ASR::Variable_t *v = ASR::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; + } + } + } + } + return is_argument; +} + } // namespace ASRUtils } // namespace LCompilers diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index 26677dd641..c12c511dae 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -63,6 +63,7 @@ using ASRUtils::intent_local; using ASRUtils::intent_return_var; using ASRUtils::determine_module_dependencies; using ASRUtils::is_arg_dummy; +using ASRUtils::is_argument_of_type_CPtr; void string_init(llvm::LLVMContext &context, llvm::Module &module, llvm::IRBuilder<> &builder, llvm::Value* arg_size, llvm::Value* arg_string) { @@ -1246,6 +1247,11 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor list_api->list_init(type_code, const_list, *module, x.n_args, x.n_args); int64_t ptr_loads_copy = ptr_loads; for( size_t i = 0; i < x.n_args; i++ ) { + if (is_argument_of_type_CPtr(x.m_args[i])) { + ptr_loads = 0; + } else { + ptr_loads = 1; + } if (ASR::is_a(*ASRUtils::expr_type(x.m_args[i]))) { bool is_argument = false; ASR::expr_t *var = x.m_args[i]; From 91e6bd2d55da304a9899116d1af7f0ea3523aa45 Mon Sep 17 00:00:00 2001 From: Anutosh Bhat <87052487+anutosh491@users.noreply.github.com> Date: Sun, 7 Jan 2024 18:19:20 +0530 Subject: [PATCH 4/4] Update asr_to_llvm.cpp --- src/libasr/codegen/asr_to_llvm.cpp | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index c12c511dae..a625d6f60b 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -1252,31 +1252,6 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor } else { ptr_loads = 1; } - 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));