Skip to content

Commit ce689a9

Browse files
committed
Some changes
1 parent 8045c16 commit ce689a9

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed

src/libasr/asr_utils.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,7 +1570,7 @@ ASR::asr_t* make_Cmpop_util(Allocator &al, const Location& loc, ASR::cmpopType c
15701570

15711571
void make_ArrayBroadcast_t_util(Allocator& al, const Location& loc,
15721572
ASR::expr_t*& expr1, ASR::expr_t*& expr2, ASR::dimension_t* expr1_mdims,
1573-
size_t expr1_ndims) {
1573+
size_t expr1_ndims, bool is_simd_array=false) {
15741574
ASR::ttype_t* expr1_type = ASRUtils::expr_type(expr1);
15751575
Vec<ASR::expr_t*> shape_args;
15761576
shape_args.reserve(al, 1);
@@ -1612,7 +1612,8 @@ void make_ArrayBroadcast_t_util(Allocator& al, const Location& loc,
16121612
dims.push_back(al, dim);
16131613

16141614
if( ASRUtils::is_value_constant(expr2) &&
1615-
ASRUtils::get_fixed_size_of_array(expr1_mdims, expr1_ndims) <= 256 ) {
1615+
ASRUtils::get_fixed_size_of_array(expr1_mdims, expr1_ndims) <= 256 &&
1616+
is_simd_array ) {
16161617
ASR::ttype_t* value_type = ASRUtils::TYPE(ASR::make_Array_t(al, loc,
16171618
ASRUtils::type_get_past_array(ASRUtils::expr_type(expr2)), dims.p, dims.size(),
16181619
is_value_character_array && !ASRUtils::is_value_constant(expr2) ? ASR::array_physical_typeType::StringArraySinglePointer: ASR::array_physical_typeType::FixedSizeArray));
@@ -1654,7 +1655,7 @@ void make_ArrayBroadcast_t_util(Allocator& al, const Location& loc,
16541655
}
16551656

16561657
void make_ArrayBroadcast_t_util(Allocator& al, const Location& loc,
1657-
ASR::expr_t*& expr1, ASR::expr_t*& expr2) {
1658+
ASR::expr_t*& expr1, ASR::expr_t*& expr2, bool is_simd_array) {
16581659
ASR::ttype_t* expr1_type = ASRUtils::expr_type(expr1);
16591660
ASR::ttype_t* expr2_type = ASRUtils::expr_type(expr2);
16601661
ASR::dimension_t *expr1_mdims = nullptr, *expr2_mdims = nullptr;
@@ -1669,12 +1670,12 @@ void make_ArrayBroadcast_t_util(Allocator& al, const Location& loc,
16691670
if( ASR::is_a<ASR::ArrayReshape_t>(*expr2) ) {
16701671
return ;
16711672
}
1672-
make_ArrayBroadcast_t_util(al, loc, expr1, expr2, expr1_mdims, expr1_ndims);
1673+
make_ArrayBroadcast_t_util(al, loc, expr1, expr2, expr1_mdims, expr1_ndims, is_simd_array);
16731674
} else {
16741675
if( ASR::is_a<ASR::ArrayReshape_t>(*expr1) ) {
16751676
return ;
16761677
}
1677-
make_ArrayBroadcast_t_util(al, loc, expr2, expr1, expr2_mdims, expr2_ndims);
1678+
make_ArrayBroadcast_t_util(al, loc, expr2, expr1, expr2_mdims, expr2_ndims, is_simd_array);
16781679
}
16791680
}
16801681

src/libasr/asr_utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5799,7 +5799,7 @@ inline ASR::asr_t* make_ArrayConstructor_t_util(Allocator &al, const Location &a
57995799
}
58005800

58015801
void make_ArrayBroadcast_t_util(Allocator& al, const Location& loc,
5802-
ASR::expr_t*& expr1, ASR::expr_t*& expr2);
5802+
ASR::expr_t*& expr1, ASR::expr_t*& expr2, bool is_simd_array=false);
58035803

58045804
// Wraps argument in stringformat if it's not a single argument of type Character.
58055805
static inline ASR::asr_t* make_print_t_util(Allocator& al, const Location& loc,

src/libasr/pass/intrinsic_functions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3351,7 +3351,7 @@ namespace FloorDiv {
33513351
CastingUtil::perform_casting(args[1], real64, al, loc))));
33523352
body.push_back(al, b.Assignment(tmp, b.r2i_t(r, int64)));
33533353
body.push_back(al, b.If(b.And(b.Lt(r, b.f_t(0.0, real64)), b.NotEq(b.i2r_t(tmp, real64), r)), {
3354-
b.Assignment(tmp, b.Sub(tmp, b.i32(1)))
3354+
b.Assignment(tmp, b.Sub(tmp, b.i64(1)))
33553355
}, {}));
33563356
body.push_back(al, b.Assignment(result, CastingUtil::perform_casting(tmp, return_type, al, loc)));
33573357
ASR::symbol_t *f_sym = make_ASR_Function_t(fn_name, fn_symtab, dep, args,

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8464,8 +8464,10 @@ we will have to use something else.
84648464
throw SemanticError("Function '" + call_name + "' does not accept vector values",
84658465
x.base.base.loc);
84668466
}
8467-
args_.push_back(al,
8468-
make_ConstantWithKind(make_IntegerConstant_t, make_Integer_t, 8, 4, x.base.base.loc));
8467+
if( intrinsic_name == "int" ) {
8468+
args_.push_back(al,
8469+
make_ConstantWithKind(make_IntegerConstant_t, make_Integer_t, 8, 4, x.base.base.loc));
8470+
}
84698471
tmp = create_func(al, x.base.base.loc, args_, diag);
84708472
if( tmp == nullptr ) {
84718473
throw SemanticAbort();
@@ -8630,10 +8632,33 @@ we will have to use something else.
86308632
alloc_args_vec.p, alloc_args_vec.size(),
86318633
nullptr, nullptr, nullptr);
86328634
} else {
8633-
Vec<ASR::expr_t*> arr_args;
8634-
arr_args.reserve(al, 0);
8635-
tmp = ASRUtils::make_ArrayConstructor_t_util(al, x.base.base.loc,
8636-
arr_args.p, arr_args.size(), type, ASR::arraystorageType::RowMajor);
8635+
const Location& loc = x.base.base.loc;
8636+
ASR::ttype_t* el_type = ASRUtils::type_get_past_array(
8637+
ASRUtils::type_get_past_allocatable_pointer(type));
8638+
if( !ASRUtils::is_struct(*el_type) ) {
8639+
ASR::expr_t* zero = ASRUtils::get_constant_zero_with_given_type(al, el_type);
8640+
LCOMPILERS_ASSERT(assign_asr_target)
8641+
ASRUtils::make_ArrayBroadcast_t_util(al, x.base.base.loc, assign_asr_target, zero, false);
8642+
tmp = &(zero->base);
8643+
} else {
8644+
ASR::expr_t* zero = ASRUtils::get_constant_zero_with_given_type(al, int32);
8645+
LCOMPILERS_ASSERT(assign_asr_target)
8646+
size_t rank = ASRUtils::extract_n_dims_from_ttype(type);
8647+
Vec<ASR::array_index_t> array_index; array_index.reserve(al, rank);
8648+
for( size_t i = 0; i < rank; i++ ) {
8649+
ASR::array_index_t idx;
8650+
idx.loc = loc;
8651+
idx.m_left = nullptr;
8652+
idx.m_right = zero;
8653+
idx.m_step = nullptr;
8654+
array_index.push_back(al, idx);
8655+
}
8656+
ASR::expr_t* arrayitem = ASRUtils::EXPR(ASR::make_ArrayItem_t(
8657+
al, loc, assign_asr_target, array_index.p, array_index.size(),
8658+
el_type, ASR::arraystorageType::RowMajor, nullptr));
8659+
ASRUtils::make_ArrayBroadcast_t_util(al, x.base.base.loc, assign_asr_target, arrayitem, false);
8660+
tmp = &(arrayitem->base);
8661+
}
86378662
}
86388663
return;
86398664
} else if (call_name == "c_p_pointer") {

0 commit comments

Comments
 (0)