WIP - [artiq] Constants

This commit is contained in:
David Mak 2024-08-14 18:10:16 +08:00
parent c55ee08e4c
commit 2b2cc06776
1 changed files with 69 additions and 61 deletions

View File

@ -40,7 +40,7 @@ use std::{
mem, mem,
sync::Arc, sync::Arc,
}; };
use nac3core::codegen::classes::ProxyType; use nac3core::codegen::classes::{ProxyType, TypedArrayLikeMutator};
/// The parallelism mode within a block. /// The parallelism mode within a block.
#[derive(Copy, Clone, Eq, PartialEq)] #[derive(Copy, Clone, Eq, PartialEq)]
@ -602,70 +602,78 @@ fn format_rpc_ret<'ctx>(
llvm_ndarray.store_ndims(ctx, generator, llvm_usize.const_int(ndims, false)); 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)); llvm_ndarray.create_dim_sizes(ctx, llvm_usize, llvm_ndarray.load_ndims(ctx));
let dims_buf_sz = unsafe {
ctx.builder.build_int_mul(llvm_ndarray.load_ndims(ctx), llvm_usize_sizeof, "").unwrap(); llvm_ndarray.dim_sizes().set_typed_unchecked(ctx, generator, &llvm_usize.const_zero(), llvm_usize.const_int(1, false));
}
let buffer_size = ctx.builder.build_unconditional_branch(tail_bb).unwrap();
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();
// 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.position_at_end(head_bb);
let phi = ctx.builder.build_phi(llvm_pi8, "rpc.ptr").unwrap(); ctx.builder.build_unreachable().unwrap();
phi.add_incoming(&[(&alloc_ptr, prehead_bb)]); // let phi = ctx.builder.build_phi(llvm_pi8, "rpc.ptr").unwrap();
let alloc_size = ctx // phi.add_incoming(&[(&alloc_ptr, prehead_bb)]);
.build_call_or_invoke(rpc_recv, &[phi.as_basic_value()], "rpc.size.next") // let alloc_size = ctx
.unwrap() // .build_call_or_invoke(rpc_recv, &[phi.as_basic_value()], "rpc.size.next")
.into_int_value(); // .unwrap()
let is_done = ctx // .into_int_value();
.builder // let is_done = ctx
.build_int_compare(IntPredicate::EQ, llvm_i32.const_zero(), alloc_size, "rpc.done") // .builder
.unwrap(); // .build_int_compare(IntPredicate::EQ, llvm_i32.const_zero(), alloc_size, "rpc.done")
ctx.builder.build_conditional_branch(is_done, tail_bb, alloc_bb).unwrap(); // .unwrap();
// ctx.builder.build_conditional_branch(is_done, tail_bb, alloc_bb).unwrap();
//
ctx.builder.position_at_end(alloc_bb); ctx.builder.position_at_end(alloc_bb);
let alloc_ptr = ctx.builder.build_array_alloca(llvm_pi8, alloc_size, "rpc.alloc").unwrap(); ctx.builder.build_unreachable().unwrap();
let alloc_ptr = ctx.builder.build_bitcast(alloc_ptr, llvm_pi8, "rpc.alloc.ptr").unwrap(); // let alloc_ptr = ctx.builder.build_array_alloca(llvm_pi8, alloc_size, "rpc.alloc").unwrap();
phi.add_incoming(&[(&alloc_ptr, alloc_bb)]); // let alloc_ptr = ctx.builder.build_bitcast(alloc_ptr, llvm_pi8, "rpc.alloc.ptr").unwrap();
ctx.builder.build_unconditional_branch(head_bb).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.position_at_end(tail_bb);
ctx.builder.build_load(slot_addr, "rpc.result").unwrap() ctx.builder.build_load(slot_addr, "rpc.result").unwrap()