From 19ae6122c774d16c3b6cc851debf14a437e71e57 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Sep 2022 16:11:03 +0100 Subject: Fix #2002 (allow `array *= matrix`) --- src/llvm_backend_stmt.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/llvm_backend_stmt.cpp') diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 175c4c537..9ea4ad34b 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1959,8 +1959,18 @@ void lb_build_assign_stmt(lbProcedure *p, AstAssignStmt *as) { } else { lbAddr lhs = lb_build_addr(p, as->lhs[0]); lbValue value = lb_build_expr(p, as->rhs[0]); - Type *lhs_type = lb_addr_type(lhs); + + // NOTE(bill): Allow for the weird edge case of: + // array *= matrix + if (op == Token_Mul && is_type_matrix(value.type) && is_type_array(lhs_type)) { + lbValue old_value = lb_addr_load(p, lhs); + Type *type = old_value.type; + lbValue new_value = lb_emit_vector_mul_matrix(p, old_value, value, type); + lb_addr_store(p, lhs, new_value); + return; + } + if (is_type_array(lhs_type)) { lb_build_assign_stmt_array(p, op, lhs, value); return; -- cgit v1.2.3 From 902a6db0e1e5304e687dbf71ef2a099ed7c52cd7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Sep 2022 16:15:09 +0100 Subject: Fix #2000 - allow #soa array iteration by pointer --- src/llvm_backend_stmt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/llvm_backend_stmt.cpp') diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 9ea4ad34b..a080fc09d 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -646,7 +646,7 @@ void lb_build_range_stmt_struct_soa(lbProcedure *p, AstRangeStmt *rs, Scope *sco lbAddr array = lb_build_addr(p, expr); - if (is_type_pointer(type_deref(lb_addr_type(array)))) { + if (is_type_pointer(lb_addr_type(array))) { array = lb_addr(lb_addr_load(p, array)); } lbValue count = lb_soa_struct_len(p, lb_addr_load(p, array)); -- cgit v1.2.3