WIP - [artiq] Revert to unified
This commit is contained in:
parent
4522077644
commit
b3d86f7187
|
@ -568,157 +568,157 @@ fn format_rpc_ret<'ctx>(
|
||||||
let llvm_ret_ty = ctx.get_llvm_abi_type(generator, ret_ty);
|
let llvm_ret_ty = ctx.get_llvm_abi_type(generator, ret_ty);
|
||||||
|
|
||||||
let result = match &*ctx.unifier.get_ty_immutable(ret_ty) {
|
let result = match &*ctx.unifier.get_ty_immutable(ret_ty) {
|
||||||
TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id() => {
|
// TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id() => {
|
||||||
let llvm_i1 = ctx.ctx.bool_type();
|
// let llvm_i1 = ctx.ctx.bool_type();
|
||||||
let llvm_usize = generator.get_size_type(ctx.ctx);
|
// let llvm_usize = generator.get_size_type(ctx.ctx);
|
||||||
|
//
|
||||||
let slot = ctx.builder.build_alloca(llvm_ret_ty, "rpc.ret.slot").unwrap();
|
// let slot = ctx.builder.build_alloca(llvm_ret_ty, "rpc.ret.slot").unwrap();
|
||||||
let (elem_ty, ndims) = unpack_ndarray_var_tys(&mut ctx.unifier, ret_ty);
|
// let (elem_ty, ndims) = unpack_ndarray_var_tys(&mut ctx.unifier, ret_ty);
|
||||||
let llvm_ret_ty =
|
// let llvm_ret_ty =
|
||||||
NDArrayType::new(generator, ctx.ctx, ctx.get_llvm_type(generator, elem_ty));
|
// NDArrayType::new(generator, ctx.ctx, ctx.get_llvm_type(generator, elem_ty));
|
||||||
let ndarray = llvm_ret_ty.new_value(generator, ctx, None);
|
// let ndarray = llvm_ret_ty.new_value(generator, ctx, None);
|
||||||
ctx.builder.build_store(slot, ndarray.as_base_value()).unwrap();
|
// ctx.builder.build_store(slot, ndarray.as_base_value()).unwrap();
|
||||||
|
//
|
||||||
let ndims =
|
// let ndims =
|
||||||
if let TypeEnum::TLiteral { values, .. } = &*ctx.unifier.get_ty_immutable(ndims) {
|
// if let TypeEnum::TLiteral { values, .. } = &*ctx.unifier.get_ty_immutable(ndims) {
|
||||||
assert_eq!(values.len(), 1);
|
// assert_eq!(values.len(), 1);
|
||||||
|
//
|
||||||
u64::try_from(values[0].clone()).unwrap()
|
// u64::try_from(values[0].clone()).unwrap()
|
||||||
} else {
|
// } else {
|
||||||
unreachable!();
|
// unreachable!();
|
||||||
};
|
// };
|
||||||
ndarray.store_ndims(ctx, generator, llvm_usize.const_int(ndims, false));
|
// ndarray.store_ndims(ctx, generator, llvm_usize.const_int(ndims, false));
|
||||||
ndarray.create_dim_sizes(ctx, llvm_usize, ndarray.load_ndims(ctx));
|
// ndarray.create_dim_sizes(ctx, llvm_usize, ndarray.load_ndims(ctx));
|
||||||
|
//
|
||||||
let llvm_usize_sizeof = ctx
|
// let llvm_usize_sizeof = ctx
|
||||||
.builder
|
// .builder
|
||||||
.build_int_truncate_or_bit_cast(llvm_ret_ty.size_type().size_of(), llvm_usize, "")
|
// .build_int_truncate_or_bit_cast(llvm_ret_ty.size_type().size_of(), llvm_usize, "")
|
||||||
.unwrap();
|
// .unwrap();
|
||||||
let llvm_pdata_sizeof = ctx
|
// let llvm_pdata_sizeof = ctx
|
||||||
.builder
|
// .builder
|
||||||
.build_int_truncate_or_bit_cast(
|
// .build_int_truncate_or_bit_cast(
|
||||||
llvm_ret_ty.element_type().size_of().unwrap(),
|
// llvm_ret_ty.element_type().size_of().unwrap(),
|
||||||
llvm_usize,
|
// llvm_usize,
|
||||||
"",
|
// "",
|
||||||
)
|
// )
|
||||||
.unwrap();
|
// .unwrap();
|
||||||
|
//
|
||||||
let dims_buf_sz =
|
// let dims_buf_sz =
|
||||||
ctx.builder.build_int_mul(ndarray.load_ndims(ctx), llvm_usize_sizeof, "").unwrap();
|
// ctx.builder.build_int_mul(ndarray.load_ndims(ctx), llvm_usize_sizeof, "").unwrap();
|
||||||
|
//
|
||||||
let buffer_size =
|
// let buffer_size =
|
||||||
ctx.builder.build_int_add(dims_buf_sz, llvm_pdata_sizeof, "").unwrap();
|
// ctx.builder.build_int_add(dims_buf_sz, llvm_pdata_sizeof, "").unwrap();
|
||||||
let buffer_size = ctx.builder.build_left_shift(
|
// let buffer_size = ctx.builder.build_left_shift(
|
||||||
ctx.builder.build_int_add(
|
// ctx.builder.build_int_add(
|
||||||
ctx.builder.build_right_shift(
|
// ctx.builder.build_right_shift(
|
||||||
buffer_size,
|
// buffer_size,
|
||||||
llvm_usize.const_int(2, false),
|
// llvm_usize.const_int(2, false),
|
||||||
false,
|
// false,
|
||||||
"",
|
// "",
|
||||||
).unwrap(),
|
// ).unwrap(),
|
||||||
llvm_usize.const_int(1, false),
|
// llvm_usize.const_int(1, false),
|
||||||
"",
|
// "",
|
||||||
).unwrap(),
|
// ).unwrap(),
|
||||||
llvm_usize.const_int(2, false),
|
// llvm_usize.const_int(2, false),
|
||||||
"",
|
// "",
|
||||||
).unwrap();
|
// ).unwrap();
|
||||||
|
//
|
||||||
let buffer =
|
// let buffer =
|
||||||
ctx.builder.build_array_alloca(llvm_i8, buffer_size, "rpc.buffer").unwrap();
|
// ctx.builder.build_array_alloca(llvm_i8, buffer_size, "rpc.buffer").unwrap();
|
||||||
let buffer = ArraySliceValue::from_ptr_val(buffer, buffer_size, Some("rpc.buffer"));
|
// let buffer = ArraySliceValue::from_ptr_val(buffer, buffer_size, Some("rpc.buffer"));
|
||||||
|
//
|
||||||
let i_addr = ctx.builder.build_alloca(llvm_usize, "i.addr").unwrap();
|
// let i_addr = ctx.builder.build_alloca(llvm_usize, "i.addr").unwrap();
|
||||||
ctx.builder.build_unconditional_branch(head_bb).unwrap();
|
// ctx.builder.build_unconditional_branch(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();
|
// let phi = ctx.builder.build_phi(llvm_pi8, "rpc.ptr").unwrap();
|
||||||
phi.add_incoming(&[(&buffer.base_ptr(ctx, generator), prehead_bb)]);
|
// phi.add_incoming(&[(&buffer.base_ptr(ctx, generator), prehead_bb)]);
|
||||||
let alloc_size = ctx
|
// let alloc_size = ctx
|
||||||
.build_call_or_invoke(rpc_recv, &[phi.as_basic_value()], "rpc.size.next")
|
// .build_call_or_invoke(rpc_recv, &[phi.as_basic_value()], "rpc.size.next")
|
||||||
.map(BasicValueEnum::into_int_value)
|
// .map(BasicValueEnum::into_int_value)
|
||||||
.unwrap();
|
// .unwrap();
|
||||||
|
//
|
||||||
// Parse metadata block(s) for ndarrays
|
// // Parse metadata block(s) for ndarrays
|
||||||
gen_if_callback(
|
// gen_if_callback(
|
||||||
generator,
|
// generator,
|
||||||
ctx,
|
// ctx,
|
||||||
|_, ctx| {
|
// |_, ctx| {
|
||||||
let i = ctx
|
// let i = ctx
|
||||||
.builder
|
// .builder
|
||||||
.build_load(i_addr, "")
|
// .build_load(i_addr, "")
|
||||||
.map(BasicValueEnum::into_int_value)
|
// .map(BasicValueEnum::into_int_value)
|
||||||
.unwrap();
|
// .unwrap();
|
||||||
|
//
|
||||||
Ok(ctx
|
// Ok(ctx
|
||||||
.builder
|
// .builder
|
||||||
.build_int_compare(IntPredicate::EQ, i, llvm_usize.const_zero(), "")
|
// .build_int_compare(IntPredicate::EQ, i, llvm_usize.const_zero(), "")
|
||||||
.unwrap())
|
// .unwrap())
|
||||||
},
|
// },
|
||||||
|generator, ctx| {
|
// |generator, ctx| {
|
||||||
let ppdata =
|
// let ppdata =
|
||||||
generator.gen_var_alloc(ctx, llvm_ret_ty.element_type(), None).unwrap();
|
// generator.gen_var_alloc(ctx, llvm_ret_ty.element_type(), None).unwrap();
|
||||||
ctx.builder
|
// ctx.builder
|
||||||
.build_store(ppdata, ndarray.data().base_ptr(ctx, generator))
|
// .build_store(ppdata, ndarray.data().base_ptr(ctx, generator))
|
||||||
.unwrap();
|
// .unwrap();
|
||||||
call_memcpy_generic(
|
// call_memcpy_generic(
|
||||||
ctx,
|
// ctx,
|
||||||
ppdata,
|
// ppdata,
|
||||||
buffer.base_ptr(ctx, generator),
|
// buffer.base_ptr(ctx, generator),
|
||||||
llvm_pdata_sizeof,
|
// llvm_pdata_sizeof,
|
||||||
llvm_i1.const_zero(),
|
// llvm_i1.const_zero(),
|
||||||
);
|
// );
|
||||||
|
//
|
||||||
let pbuffer_dims_begin = unsafe {
|
// let pbuffer_dims_begin = unsafe {
|
||||||
buffer.ptr_offset_unchecked(ctx, generator, &llvm_pdata_sizeof, None)
|
// buffer.ptr_offset_unchecked(ctx, generator, &llvm_pdata_sizeof, None)
|
||||||
};
|
// };
|
||||||
call_memcpy_generic(
|
// call_memcpy_generic(
|
||||||
ctx,
|
// ctx,
|
||||||
ndarray.dim_sizes().base_ptr(ctx, generator),
|
// ndarray.dim_sizes().base_ptr(ctx, generator),
|
||||||
pbuffer_dims_begin,
|
// pbuffer_dims_begin,
|
||||||
dims_buf_sz,
|
// dims_buf_sz,
|
||||||
llvm_i1.const_zero(),
|
// llvm_i1.const_zero(),
|
||||||
);
|
// );
|
||||||
|
//
|
||||||
Ok(())
|
// Ok(())
|
||||||
},
|
// },
|
||||||
|_, _| Ok(()),
|
// |_, _| Ok(()),
|
||||||
)
|
// )
|
||||||
.unwrap();
|
// .unwrap();
|
||||||
|
//
|
||||||
let is_done = ctx
|
// let is_done = ctx
|
||||||
.builder
|
// .builder
|
||||||
.build_int_compare(IntPredicate::EQ, llvm_i32.const_zero(), alloc_size, "rpc.done")
|
// .build_int_compare(IntPredicate::EQ, llvm_i32.const_zero(), alloc_size, "rpc.done")
|
||||||
.unwrap();
|
// .unwrap();
|
||||||
|
//
|
||||||
ctx.builder.build_conditional_branch(is_done, tail_bb, alloc_bb).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_size = ctx.builder.build_left_shift(
|
// let alloc_size = ctx.builder.build_left_shift(
|
||||||
ctx.builder.build_int_add(
|
// ctx.builder.build_int_add(
|
||||||
ctx.builder.build_right_shift(
|
// ctx.builder.build_right_shift(
|
||||||
alloc_size,
|
// alloc_size,
|
||||||
llvm_usize.const_int(2, false),
|
// llvm_usize.const_int(2, false),
|
||||||
false,
|
// false,
|
||||||
"",
|
// "",
|
||||||
).unwrap(),
|
// ).unwrap(),
|
||||||
llvm_usize.const_int(1, false),
|
// llvm_usize.const_int(1, false),
|
||||||
"",
|
// "",
|
||||||
).unwrap(),
|
// ).unwrap(),
|
||||||
llvm_usize.const_int(2, false),
|
// llvm_usize.const_int(2, false),
|
||||||
"",
|
// "",
|
||||||
).unwrap();
|
// ).unwrap();
|
||||||
let alloc_ptr =
|
// let alloc_ptr =
|
||||||
ctx.builder.build_array_alloca(llvm_i8, alloc_size, "rpc.alloc").unwrap();
|
// ctx.builder.build_array_alloca(llvm_i8, alloc_size, "rpc.alloc").unwrap();
|
||||||
phi.add_incoming(&[(&alloc_ptr, alloc_bb)]);
|
// phi.add_incoming(&[(&alloc_ptr, alloc_bb)]);
|
||||||
let i =
|
// let i =
|
||||||
ctx.builder.build_load(i_addr, "i").map(BasicValueEnum::into_int_value).unwrap();
|
// ctx.builder.build_load(i_addr, "i").map(BasicValueEnum::into_int_value).unwrap();
|
||||||
let i = ctx.builder.build_int_add(i, llvm_usize.const_int(1, false), "").unwrap();
|
// let i = ctx.builder.build_int_add(i, llvm_usize.const_int(1, false), "").unwrap();
|
||||||
ctx.builder.build_store(i_addr, i).unwrap();
|
// ctx.builder.build_store(i_addr, i).unwrap();
|
||||||
ctx.builder.build_unconditional_branch(head_bb).unwrap();
|
// 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, "rpc.result").unwrap()
|
// ctx.builder.build_load(slot, "rpc.result").unwrap()
|
||||||
}
|
// }
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
let slot = ctx.builder.build_alloca(llvm_ret_ty, "rpc.ret.slot").unwrap();
|
let slot = ctx.builder.build_alloca(llvm_ret_ty, "rpc.ret.slot").unwrap();
|
||||||
|
|
Loading…
Reference in New Issue