Skip to content

Commit

Permalink
Merge pull request #2453 from anutosh491/certik/dont_load_cptr
Browse files Browse the repository at this point in the history
Don't load CPtr if the variable under consideration is an argument
  • Loading branch information
certik authored Jan 7, 2024
2 parents 25dfb85 + 91e6bd2 commit 1652163
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 1 deletion.
1 change: 1 addition & 0 deletions integration_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions integration_tests/symbolics_14.py
Original file line number Diff line number Diff line change
@@ -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()
20 changes: 20 additions & 0 deletions src/libasr/asr_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<ASR::CPtr_t>(*expr_type(var))) {
if (ASR::is_a<ASR::Var_t>(*var)) {
ASR::symbol_t *var_sym = ASR::down_cast<ASR::Var_t>(var)->m_v;
if (ASR::is_a<ASR::Variable_t>(*var_sym)) {
ASR::Variable_t *v = ASR::down_cast<ASR::Variable_t>(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
Expand Down
7 changes: 6 additions & 1 deletion src/libasr/codegen/asr_to_llvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -1245,8 +1246,12 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
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 (is_argument_of_type_CPtr(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));
Expand Down

0 comments on commit 1652163

Please sign in to comment.