Skip to content

Commit 6733b67

Browse files
committed
PASS: Use array_op on struct_inst_mem
Also simplify the condition
1 parent 0d9fff9 commit 6733b67

File tree

1 file changed

+29
-37
lines changed

1 file changed

+29
-37
lines changed

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
}

0 commit comments

Comments
 (0)