Skip to content

Commit 2293972

Browse files
authored
Merge pull request #2334 from Shaikh-Ubaid/changes_from_lf
Dftatom: Changes from lfortran LibASR
2 parents 0d9fff9 + 58da39c commit 2293972

File tree

4 files changed

+49
-46
lines changed

4 files changed

+49
-46
lines changed

src/libasr/asr_utils.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,8 +698,7 @@ static inline ASR::symbol_t *get_asr_owner(const ASR::expr_t *expr) {
698698
return ASRUtils::get_asr_owner(ASR::down_cast<ASR::FunctionCall_t>(expr)->m_name);
699699
}
700700
default: {
701-
throw LCompilersException("Cannot find the ASR owner of underlying symbol of expression "
702-
+ std::to_string(expr->type));
701+
return nullptr;
703702
}
704703
}
705704
return nullptr;

src/libasr/pass/array_op.cpp

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,47 +1460,39 @@ class ArrayOpVisitor : public ASR::CallReplacerOnExpressionsVisitor<ArrayOpVisit
14601460
}
14611461

14621462
void visit_Assignment(const ASR::Assignment_t &x) {
1463-
bool is_target_struct_member_array_and_value_array =
1464-
(ASR::is_a<ASR::StructInstanceMember_t>(*x.m_target) &&
1465-
ASRUtils::is_array(ASRUtils::expr_type(x.m_value)) &&
1466-
ASRUtils::is_array(ASRUtils::expr_type(x.m_target)) &&
1467-
!ASR::is_a<ASR::FunctionCall_t>(*x.m_value));
14681463
if( (ASR::is_a<ASR::Pointer_t>(*ASRUtils::expr_type(x.m_target)) &&
14691464
ASR::is_a<ASR::GetPointer_t>(*x.m_value)) ||
1470-
(ASR::is_a<ASR::ArrayConstant_t>(*x.m_value)) ||
1471-
is_target_struct_member_array_and_value_array) { // TODO: fix for StructInstanceMember targets
1472-
if( is_target_struct_member_array_and_value_array ) {
1473-
if (realloc_lhs && ASRUtils::is_allocatable(x.m_target)) { // Add realloc-lhs later
1474-
Vec<ASR::alloc_arg_t> vec_alloc;
1475-
vec_alloc.reserve(al, 1);
1476-
ASR::alloc_arg_t alloc_arg;
1477-
alloc_arg.m_len_expr = nullptr;
1478-
alloc_arg.m_type = nullptr;
1479-
alloc_arg.loc = x.m_target->base.loc;
1480-
alloc_arg.m_a = x.m_target;
1481-
1482-
1483-
ASR::dimension_t* m_dims = nullptr;
1484-
size_t n_dims = ASRUtils::extract_dimensions_from_ttype(
1485-
ASRUtils::expr_type(x.m_value), m_dims);
1486-
Vec<ASR::dimension_t> vec_dims;
1487-
vec_dims.reserve(al, n_dims);
1488-
for( size_t i = 0; i < n_dims; i++ ) {
1489-
ASR::dimension_t dim;
1490-
dim.loc = x.m_value->base.loc;
1491-
dim.m_start = PassUtils::get_bound(x.m_value, i + 1, "lbound", al);
1492-
dim.m_length = ASRUtils::get_size(x.m_value, i + 1, al);
1493-
vec_dims.push_back(al, dim);
1494-
}
1465+
(ASR::is_a<ASR::ArrayConstant_t>(*x.m_value)) ) {
1466+
if( realloc_lhs && ASRUtils::is_allocatable(x.m_target)) { // Add realloc-lhs later
1467+
Vec<ASR::alloc_arg_t> vec_alloc;
1468+
vec_alloc.reserve(al, 1);
1469+
ASR::alloc_arg_t alloc_arg;
1470+
alloc_arg.m_len_expr = nullptr;
1471+
alloc_arg.m_type = nullptr;
1472+
alloc_arg.loc = x.m_target->base.loc;
1473+
alloc_arg.m_a = x.m_target;
1474+
1475+
1476+
ASR::dimension_t* m_dims = nullptr;
1477+
size_t n_dims = ASRUtils::extract_dimensions_from_ttype(
1478+
ASRUtils::expr_type(x.m_value), m_dims);
1479+
Vec<ASR::dimension_t> vec_dims;
1480+
vec_dims.reserve(al, n_dims);
1481+
for( size_t i = 0; i < n_dims; i++ ) {
1482+
ASR::dimension_t dim;
1483+
dim.loc = x.m_value->base.loc;
1484+
dim.m_start = PassUtils::get_bound(x.m_value, i + 1, "lbound", al);
1485+
dim.m_length = ASRUtils::get_size(x.m_value, i + 1, al);
1486+
vec_dims.push_back(al, dim);
1487+
}
14951488

14961489

1497-
alloc_arg.m_dims = vec_dims.p;
1498-
alloc_arg.n_dims = vec_dims.n;
1499-
vec_alloc.push_back(al, alloc_arg);
1500-
pass_result.push_back(al, ASRUtils::STMT(ASR::make_Allocate_t(
1501-
al, x.base.base.loc, vec_alloc.p, 1, nullptr, nullptr, nullptr)));
1502-
remove_original_statement = false;
1503-
}
1490+
alloc_arg.m_dims = vec_dims.p;
1491+
alloc_arg.n_dims = vec_dims.n;
1492+
vec_alloc.push_back(al, alloc_arg);
1493+
pass_result.push_back(al, ASRUtils::STMT(ASR::make_Allocate_t(
1494+
al, x.base.base.loc, vec_alloc.p, 1, nullptr, nullptr, nullptr)));
1495+
remove_original_statement = false;
15041496
}
15051497
return ;
15061498
}

src/libasr/pass/pass_utils.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,25 @@ namespace LCompilers {
560560

561561
ASR::expr_t* get_bound(ASR::expr_t* arr_expr, int dim, std::string bound,
562562
Allocator& al) {
563+
ASR::ttype_t* x_mv_type = ASRUtils::expr_type(arr_expr);
564+
ASR::dimension_t* m_dims;
565+
int n_dims = ASRUtils::extract_dimensions_from_ttype(x_mv_type, m_dims);
566+
bool is_data_only_array = ASRUtils::is_fixed_size_array(m_dims, n_dims) && ASRUtils::get_asr_owner(arr_expr) &&
567+
ASR::is_a<ASR::StructType_t>(*ASRUtils::get_asr_owner(arr_expr));
563568
ASR::ttype_t* int32_type = ASRUtils::TYPE(ASR::make_Integer_t(al, arr_expr->base.loc, 4));
569+
if (is_data_only_array) {
570+
const Location& loc = arr_expr->base.loc;
571+
ASR::expr_t* zero = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, loc, 0, int32_type));
572+
ASR::expr_t* one = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, loc, 1, int32_type));
573+
if( bound == "ubound" ) {
574+
return ASRUtils::EXPR(ASR::make_IntegerBinOp_t(
575+
al, arr_expr->base.loc, m_dims[dim - 1].m_length, ASR::binopType::Sub, one, int32_type, nullptr));
576+
}
577+
if ( m_dims[dim - 1].m_start != nullptr ) {
578+
return m_dims[dim - 1].m_start;
579+
}
580+
return zero;
581+
}
564582
ASR::expr_t* dim_expr = ASRUtils::EXPR(ASR::make_IntegerConstant_t(al, arr_expr->base.loc, dim, int32_type));
565583
ASR::arrayboundType bound_type = ASR::arrayboundType::LBound;
566584
if( bound == "ubound" ) {

src/libasr/pass/subroutine_from_function.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,9 @@ class ReplaceFunctionCallWithSubroutineCallVisitor:
318318
}
319319

320320
void visit_Assignment(const ASR::Assignment_t &x) {
321-
bool is_target_struct_member_array_and_value_array =
322-
(ASR::is_a<ASR::StructInstanceMember_t>(*x.m_target) &&
323-
ASRUtils::is_array(ASRUtils::expr_type(x.m_value)) &&
324-
ASRUtils::is_array(ASRUtils::expr_type(x.m_target)) &&
325-
!ASR::is_a<ASR::FunctionCall_t>(*x.m_value));
326321
if( (ASR::is_a<ASR::Pointer_t>(*ASRUtils::expr_type(x.m_target)) &&
327322
ASR::is_a<ASR::GetPointer_t>(*x.m_value)) ||
328-
(ASR::is_a<ASR::ArrayConstant_t>(*x.m_value)) ||
329-
is_target_struct_member_array_and_value_array) { // TODO: fix for StructInstanceMember targets
323+
(ASR::is_a<ASR::ArrayConstant_t>(*x.m_value))) {
330324
return ;
331325
}
332326

0 commit comments

Comments
 (0)