diff --git a/nac3artiq/src/codegen.rs b/nac3artiq/src/codegen.rs index f9e73d0c..47108c4e 100644 --- a/nac3artiq/src/codegen.rs +++ b/nac3artiq/src/codegen.rs @@ -40,7 +40,7 @@ use std::{ mem, sync::Arc, }; -use nac3core::codegen::classes::{ProxyType, TypedArrayLikeMutator}; +use nac3core::codegen::classes::{ProxyType, ProxyValue, TypedArrayLikeMutator}; /// The parallelism mode within a block. #[derive(Copy, Clone, Eq, PartialEq)] @@ -567,127 +567,41 @@ fn format_rpc_ret<'ctx>( let llvm_ret_ty = ctx.get_llvm_abi_type(generator, ret_ty); let result = match &*ctx.unifier.get_ty_immutable(ret_ty) { - // TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id() => { - // let llvm_i1 = ctx.ctx.bool_type(); - // let llvm_usize = generator.get_size_type(ctx.ctx); - // - // let (elem_ty, ndims) = unpack_ndarray_var_tys(&mut ctx.unifier, ret_ty); - // let llvm_ret_ty = - // NDArrayType::new(generator, ctx.ctx, ctx.get_llvm_type(generator, elem_ty)); - // - // let llvm_usize_sizeof = ctx - // .builder - // .build_int_truncate_or_bit_cast(llvm_ret_ty.size_type().size_of(), llvm_usize, "") - // .unwrap(); - // let llvm_pdata_sizeof = ctx - // .builder - // .build_int_truncate_or_bit_cast( - // llvm_ret_ty.element_type().ptr_type(AddressSpace::default()).size_of(), - // llvm_usize, - // "", - // ) - // .unwrap(); - // - // let slot_addr = ctx.builder.build_alloca(llvm_ret_ty.as_base_type(), "rpc.ret.slot.addr").unwrap(); - // let slot = ctx.builder.build_load(slot_addr, "rpc.ret.slot").map(BasicValueEnum::into_pointer_value).unwrap(); - // let llvm_ndarray = NDArrayValue::from_ptr_val(slot, llvm_usize, None); - // - // let ndims = if let TypeEnum::TLiteral { values, .. } = &*ctx.unifier.get_ty_immutable(ndims) { - // assert_eq!(values.len(), 1); - // - // u64::try_from(values[0].clone()).unwrap() - // } else { - // unreachable!(); - // }; - // llvm_ndarray.store_ndims(ctx, generator, llvm_usize.const_int(ndims, false)); - // llvm_ndarray.create_dim_sizes(ctx, llvm_usize, llvm_ndarray.load_ndims(ctx)); - // - // unsafe { - // llvm_ndarray.dim_sizes().set_typed_unchecked(ctx, generator, &llvm_usize.const_zero(), llvm_usize.const_int(1, false)); - // } - // - // ctx.builder.build_unconditional_branch(tail_bb).unwrap(); - // - // // let dims_buf_sz = - // // ctx.builder.build_int_mul(llvm_ndarray.load_ndims(ctx), llvm_usize_sizeof, "").unwrap(); - // // - // // let buffer_size = - // // ctx.builder.build_int_add(dims_buf_sz, llvm_pdata_sizeof, "").unwrap(); - // // - // // let buffer = ctx.builder.build_array_alloca(llvm_i8, buffer_size, "rpc.buffer").unwrap(); - // // let buffer = ArraySliceValue::from_ptr_val(buffer, buffer_size, Some("rpc.buffer")); - // // - // // // recv [*data, dim_sz[..]] - // // let alloc_size = ctx - // // .build_call_or_invoke(rpc_recv, &[buffer.base_ptr(ctx, generator).into()], "rpc.size.next") - // // .map(BasicValueEnum::into_int_value) - // // .unwrap(); - // // - // // let ppdata = generator.gen_var_alloc(ctx, llvm_ret_ty.element_type(), None).unwrap(); - // // ctx.builder.build_store(ppdata, llvm_ndarray.data().base_ptr(ctx, generator)).unwrap(); - // // call_memcpy_generic( - // // ctx, - // // ppdata, - // // buffer.base_ptr(ctx, generator), - // // llvm_pdata_sizeof, - // // llvm_i1.const_zero(), - // // ); - // // - // // let pbuffer_dims_begin = - // // unsafe { buffer.ptr_offset_unchecked(ctx, generator, &llvm_pdata_sizeof, None) }; - // // call_memcpy_generic( - // // ctx, - // // llvm_ndarray.dim_sizes().base_ptr(ctx, generator), - // // pbuffer_dims_begin, - // // dims_buf_sz, - // // llvm_i1.const_zero(), - // // ); - // // - // // let is_done = ctx - // // .builder - // // .build_int_compare(IntPredicate::EQ, llvm_i32.const_zero(), alloc_size, "rpc.done") - // // .unwrap(); - // // - // // let alloc_ptr = ctx.builder.build_array_alloca(llvm_pi8, alloc_size, "rpc.alloc").unwrap(); - // // let alloc_ptr = ctx.builder.build_bitcast(alloc_ptr, llvm_pi8, "rpc.alloc.ptr").map(BasicValueEnum::into_pointer_value).unwrap(); - // // - // // ctx.builder.build_conditional_branch(is_done, tail_bb, head_bb).unwrap(); - // // - // ctx.builder.position_at_end(head_bb); - // ctx.builder.build_unreachable().unwrap(); - // // let phi = ctx.builder.build_phi(llvm_pi8, "rpc.ptr").unwrap(); - // // phi.add_incoming(&[(&alloc_ptr, prehead_bb)]); - // // let alloc_size = ctx - // // .build_call_or_invoke(rpc_recv, &[phi.as_basic_value()], "rpc.size.next") - // // .unwrap() - // // .into_int_value(); - // // let is_done = ctx - // // .builder - // // .build_int_compare(IntPredicate::EQ, llvm_i32.const_zero(), alloc_size, "rpc.done") - // // .unwrap(); - // // ctx.builder.build_conditional_branch(is_done, tail_bb, alloc_bb).unwrap(); - // // - // ctx.builder.position_at_end(alloc_bb); - // ctx.builder.build_unreachable().unwrap(); - // // let alloc_ptr = ctx.builder.build_array_alloca(llvm_pi8, alloc_size, "rpc.alloc").unwrap(); - // // let alloc_ptr = ctx.builder.build_bitcast(alloc_ptr, llvm_pi8, "rpc.alloc.ptr").unwrap(); - // // phi.add_incoming(&[(&alloc_ptr, alloc_bb)]); - // // ctx.builder.build_unconditional_branch(head_bb).unwrap(); - // // - // ctx.builder.position_at_end(tail_bb); - // - // ctx.builder.build_load(slot_addr, "rpc.result").unwrap() - // } - - _ => { + TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id() => { let llvm_usize = generator.get_size_type(ctx.ctx); - let _slot = ctx.builder.build_alloca(llvm_ret_ty, "rpc.ret.slot").unwrap(); - let slot = if matches!(&*ctx.unifier.get_ty_immutable(ret_ty), TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id()) { - ctx.builder.build_array_alloca(llvm_i8, llvm_usize.const_int(8, false), "").unwrap() - } else { - _slot - }; + let slot = ctx.builder.build_alloca(llvm_ret_ty, "rpc.ret.slot").unwrap(); + let slot = NDArrayValue::from_ptr_val(slot, llvm_usize, None); + let slotgen = ctx.builder.build_bitcast(slot.as_base_value(), llvm_pi8, "rpc.ret.ptr").unwrap(); + ctx.builder.build_unconditional_branch(head_bb).unwrap(); + ctx.builder.position_at_end(head_bb); + + let phi = ctx.builder.build_phi(llvm_pi8, "rpc.ptr").unwrap(); + phi.add_incoming(&[(&slotgen, prehead_bb)]); + let alloc_size = ctx + .build_call_or_invoke(rpc_recv, &[phi.as_basic_value()], "rpc.size.next") + .unwrap() + .into_int_value(); + let is_done = ctx + .builder + .build_int_compare(IntPredicate::EQ, llvm_i32.const_zero(), alloc_size, "rpc.done") + .unwrap(); + + ctx.builder.build_conditional_branch(is_done, tail_bb, alloc_bb).unwrap(); + ctx.builder.position_at_end(alloc_bb); + + let alloc_ptr = ctx.builder.build_array_alloca(llvm_pi8, alloc_size, "rpc.alloc").unwrap(); + let alloc_ptr = ctx.builder.build_bitcast(alloc_ptr, llvm_pi8, "rpc.alloc.ptr").unwrap(); + phi.add_incoming(&[(&alloc_ptr, alloc_bb)]); + ctx.builder.build_unconditional_branch(head_bb).unwrap(); + + ctx.builder.position_at_end(tail_bb); + + ctx.builder.build_load(slot.as_base_value(), "rpc.result").unwrap() + } + + _ => { + let slot = ctx.builder.build_alloca(llvm_ret_ty, "rpc.ret.slot").unwrap(); let slotgen = ctx.builder.build_bitcast(slot, llvm_pi8, "rpc.ret.ptr").unwrap(); ctx.builder.build_unconditional_branch(head_bb).unwrap(); ctx.builder.position_at_end(head_bb); @@ -713,7 +627,7 @@ fn format_rpc_ret<'ctx>( ctx.builder.position_at_end(tail_bb); - ctx.builder.build_load(_slot, "rpc.result").unwrap() + ctx.builder.build_load(slot, "rpc.result").unwrap() } };