mirror of
https://github.com/roc-lang/roc.git
synced 2025-07-24 23:13:47 +00:00
Do not require allocating Layouts in arena before interning
This should reduce memory spend, the interner has its own effective arena anyway
This commit is contained in:
parent
4652661a5c
commit
ce717dca8b
19 changed files with 161 additions and 171 deletions
|
@ -118,8 +118,8 @@ pub(crate) fn list_with_capacity<'a, 'ctx, 'env>(
|
|||
&[],
|
||||
&[
|
||||
capacity.into(),
|
||||
env.alignment_intvalue(layout_interner, element_layout),
|
||||
layout_width(env, layout_interner, element_layout),
|
||||
env.alignment_intvalue(layout_interner, &element_layout),
|
||||
layout_width(env, layout_interner, &element_layout),
|
||||
],
|
||||
BitcodeReturns::List,
|
||||
bitcode::LIST_WITH_CAPACITY,
|
||||
|
@ -137,7 +137,7 @@ pub(crate) fn list_get_unsafe<'a, 'ctx, 'env>(
|
|||
let builder = env.builder;
|
||||
|
||||
let element_layout = layout_interner.get(element_layout);
|
||||
let elem_type = basic_type_from_layout(env, layout_interner, element_layout);
|
||||
let elem_type = basic_type_from_layout(env, layout_interner, &element_layout);
|
||||
let ptr_type = elem_type.ptr_type(AddressSpace::Generic);
|
||||
// Load the pointer to the array data
|
||||
let array_data_ptr = load_list_ptr(builder, wrapper_struct, ptr_type);
|
||||
|
@ -156,12 +156,12 @@ pub(crate) fn list_get_unsafe<'a, 'ctx, 'env>(
|
|||
let result = load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
*element_layout,
|
||||
element_layout,
|
||||
elem_ptr,
|
||||
"list_get_load_element",
|
||||
);
|
||||
|
||||
increment_refcount_layout(env, layout_interner, layout_ids, 1, result, element_layout);
|
||||
increment_refcount_layout(env, layout_interner, layout_ids, 1, result, &element_layout);
|
||||
|
||||
result
|
||||
}
|
||||
|
@ -180,9 +180,9 @@ pub(crate) fn list_reserve<'a, 'ctx, 'env>(
|
|||
env,
|
||||
list.into_struct_value(),
|
||||
&[
|
||||
env.alignment_intvalue(layout_interner, element_layout),
|
||||
env.alignment_intvalue(layout_interner, &element_layout),
|
||||
spare,
|
||||
layout_width(env, layout_interner, element_layout),
|
||||
layout_width(env, layout_interner, &element_layout),
|
||||
pass_update_mode(env, update_mode),
|
||||
],
|
||||
bitcode::LIST_RESERVE,
|
||||
|
@ -243,8 +243,8 @@ pub(crate) fn list_swap<'a, 'ctx, 'env>(
|
|||
env,
|
||||
original_wrapper,
|
||||
&[
|
||||
env.alignment_intvalue(layout_interner, element_layout),
|
||||
layout_width(env, layout_interner, element_layout),
|
||||
env.alignment_intvalue(layout_interner, &element_layout),
|
||||
layout_width(env, layout_interner, &element_layout),
|
||||
index_1.into(),
|
||||
index_2.into(),
|
||||
pass_update_mode(env, update_mode),
|
||||
|
@ -264,13 +264,13 @@ pub(crate) fn list_sublist<'a, 'ctx, 'env>(
|
|||
element_layout: InLayout<'a>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let element_layout = layout_interner.get(element_layout);
|
||||
let dec_element_fn = build_dec_wrapper(env, layout_interner, layout_ids, element_layout);
|
||||
let dec_element_fn = build_dec_wrapper(env, layout_interner, layout_ids, &element_layout);
|
||||
call_list_bitcode_fn_1(
|
||||
env,
|
||||
original_wrapper,
|
||||
&[
|
||||
env.alignment_intvalue(layout_interner, element_layout),
|
||||
layout_width(env, layout_interner, element_layout),
|
||||
env.alignment_intvalue(layout_interner, &element_layout),
|
||||
layout_width(env, layout_interner, &element_layout),
|
||||
start.into(),
|
||||
len.into(),
|
||||
dec_element_fn.as_global_value().as_pointer_value().into(),
|
||||
|
@ -289,13 +289,13 @@ pub(crate) fn list_drop_at<'a, 'ctx, 'env>(
|
|||
element_layout: InLayout<'a>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let element_layout = layout_interner.get(element_layout);
|
||||
let dec_element_fn = build_dec_wrapper(env, layout_interner, layout_ids, element_layout);
|
||||
let dec_element_fn = build_dec_wrapper(env, layout_interner, layout_ids, &element_layout);
|
||||
call_list_bitcode_fn_1(
|
||||
env,
|
||||
original_wrapper,
|
||||
&[
|
||||
env.alignment_intvalue(layout_interner, element_layout),
|
||||
layout_width(env, layout_interner, element_layout),
|
||||
env.alignment_intvalue(layout_interner, &element_layout),
|
||||
layout_width(env, layout_interner, &element_layout),
|
||||
count.into(),
|
||||
dec_element_fn.as_global_value().as_pointer_value().into(),
|
||||
],
|
||||
|
@ -624,8 +624,8 @@ pub(crate) fn list_concat<'a, 'ctx, 'env>(
|
|||
env,
|
||||
&[list1.into_struct_value(), list2.into_struct_value()],
|
||||
&[
|
||||
env.alignment_intvalue(layout_interner, element_layout),
|
||||
layout_width(env, layout_interner, element_layout),
|
||||
env.alignment_intvalue(layout_interner, &element_layout),
|
||||
layout_width(env, layout_interner, &element_layout),
|
||||
],
|
||||
BitcodeReturns::List,
|
||||
bitcode::LIST_CONCAT,
|
||||
|
|
|
@ -435,7 +435,7 @@ fn build_list_eq<'a, 'ctx, 'env>(
|
|||
|
||||
let symbol = Symbol::LIST_EQ;
|
||||
let element_layout = layout_interner.get(element_layout);
|
||||
let element_layout = when_recursive.unwrap_recursive_pointer(*element_layout);
|
||||
let element_layout = when_recursive.unwrap_recursive_pointer(element_layout);
|
||||
let fn_name = layout_ids
|
||||
.get(symbol, &element_layout)
|
||||
.to_symbol_string(symbol, &env.interns);
|
||||
|
@ -1458,8 +1458,8 @@ fn build_box_eq_help<'a, 'ctx, 'env>(
|
|||
|
||||
let inner_layout = layout_interner.get(inner_layout);
|
||||
|
||||
let value1 = load_roc_value(env, layout_interner, *inner_layout, box1, "load_box1");
|
||||
let value2 = load_roc_value(env, layout_interner, *inner_layout, box2, "load_box2");
|
||||
let value1 = load_roc_value(env, layout_interner, inner_layout, box1, "load_box1");
|
||||
let value2 = load_roc_value(env, layout_interner, inner_layout, box2, "load_box2");
|
||||
|
||||
let is_equal = build_eq(
|
||||
env,
|
||||
|
@ -1467,8 +1467,8 @@ fn build_box_eq_help<'a, 'ctx, 'env>(
|
|||
layout_ids,
|
||||
value1,
|
||||
value2,
|
||||
inner_layout,
|
||||
inner_layout,
|
||||
&inner_layout,
|
||||
&inner_layout,
|
||||
when_recursive,
|
||||
);
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ pub fn basic_type_from_layout<'a, 'ctx, 'env>(
|
|||
),
|
||||
Boxed(inner_layout) => {
|
||||
let inner_layout = layout_interner.get(*inner_layout);
|
||||
let inner_type = basic_type_from_layout(env, layout_interner, inner_layout);
|
||||
let inner_type = basic_type_from_layout(env, layout_interner, &inner_layout);
|
||||
|
||||
inner_type.ptr_type(AddressSpace::Generic).into()
|
||||
}
|
||||
|
|
|
@ -353,7 +353,7 @@ fn build_clone<'a, 'ctx, 'env>(
|
|||
|
||||
let source = value.into_pointer_value();
|
||||
let inner_layout = layout_interner.get(inner_layout);
|
||||
let value = load_roc_value(env, layout_interner, *inner_layout, source, "inner");
|
||||
let value = load_roc_value(env, layout_interner, inner_layout, source, "inner");
|
||||
|
||||
let inner_width = env.ptr_int().const_int(
|
||||
inner_layout.stack_size(layout_interner, env.target_info) as u64,
|
||||
|
@ -376,7 +376,7 @@ fn build_clone<'a, 'ctx, 'env>(
|
|||
ptr,
|
||||
cursors,
|
||||
value,
|
||||
*inner_layout,
|
||||
inner_layout,
|
||||
when_recursive,
|
||||
)
|
||||
}
|
||||
|
@ -1063,7 +1063,7 @@ fn build_clone_builtin<'a, 'ctx, 'env>(
|
|||
// We cloned the elements into the extra_offset address.
|
||||
let elements_start_offset = cursors.extra_offset;
|
||||
|
||||
let element_type = basic_type_from_layout(env, layout_interner, elem);
|
||||
let element_type = basic_type_from_layout(env, layout_interner, &elem);
|
||||
let elements = bd.build_pointer_cast(
|
||||
elements,
|
||||
element_type.ptr_type(AddressSpace::Generic),
|
||||
|
@ -1107,7 +1107,7 @@ fn build_clone_builtin<'a, 'ctx, 'env>(
|
|||
ptr,
|
||||
cursors,
|
||||
element,
|
||||
*elem,
|
||||
elem,
|
||||
when_recursive,
|
||||
);
|
||||
|
||||
|
@ -1124,7 +1124,7 @@ fn build_clone_builtin<'a, 'ctx, 'env>(
|
|||
env,
|
||||
layout_interner,
|
||||
parent,
|
||||
*elem,
|
||||
elem,
|
||||
elements,
|
||||
len,
|
||||
"index",
|
||||
|
|
|
@ -2333,7 +2333,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
let element_layout = layout_interner.get(*element_layout);
|
||||
let result_layout = layout_interner.get(*result_layout);
|
||||
|
||||
let argument_layouts = &[*element_layout];
|
||||
let argument_layouts = &[element_layout];
|
||||
|
||||
let roc_function_call = roc_function_call(
|
||||
env,
|
||||
|
@ -2344,7 +2344,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
closure_layout,
|
||||
function_owns_closure_data,
|
||||
argument_layouts,
|
||||
*result_layout,
|
||||
result_layout,
|
||||
);
|
||||
|
||||
list_map(
|
||||
|
@ -2352,8 +2352,8 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
layout_interner,
|
||||
roc_function_call,
|
||||
list,
|
||||
element_layout,
|
||||
result_layout,
|
||||
&element_layout,
|
||||
&result_layout,
|
||||
)
|
||||
}
|
||||
_ => unreachable!("invalid list layout"),
|
||||
|
@ -2375,7 +2375,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
let element2_layout = layout_interner.get(*element2_layout);
|
||||
let result_layout = layout_interner.get(*result_layout);
|
||||
|
||||
let argument_layouts = &[*element1_layout, *element2_layout];
|
||||
let argument_layouts = &[element1_layout, element2_layout];
|
||||
|
||||
let roc_function_call = roc_function_call(
|
||||
env,
|
||||
|
@ -2386,7 +2386,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
closure_layout,
|
||||
function_owns_closure_data,
|
||||
argument_layouts,
|
||||
*result_layout,
|
||||
result_layout,
|
||||
);
|
||||
|
||||
list_map2(
|
||||
|
@ -2396,9 +2396,9 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
roc_function_call,
|
||||
list1,
|
||||
list2,
|
||||
element1_layout,
|
||||
element2_layout,
|
||||
result_layout,
|
||||
&element1_layout,
|
||||
&element2_layout,
|
||||
&result_layout,
|
||||
)
|
||||
}
|
||||
_ => unreachable!("invalid list layout"),
|
||||
|
@ -2423,7 +2423,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
let element3_layout = layout_interner.get(*element3_layout);
|
||||
let result_layout = layout_interner.get(*result_layout);
|
||||
|
||||
let argument_layouts = &[*element1_layout, *element2_layout, *element3_layout];
|
||||
let argument_layouts = &[element1_layout, element2_layout, element3_layout];
|
||||
|
||||
let roc_function_call = roc_function_call(
|
||||
env,
|
||||
|
@ -2434,7 +2434,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
closure_layout,
|
||||
function_owns_closure_data,
|
||||
argument_layouts,
|
||||
*result_layout,
|
||||
result_layout,
|
||||
);
|
||||
|
||||
list_map3(
|
||||
|
@ -2445,10 +2445,10 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
list1,
|
||||
list2,
|
||||
list3,
|
||||
element1_layout,
|
||||
element2_layout,
|
||||
element3_layout,
|
||||
result_layout,
|
||||
&element1_layout,
|
||||
&element2_layout,
|
||||
&element3_layout,
|
||||
&result_layout,
|
||||
)
|
||||
}
|
||||
_ => unreachable!("invalid list layout"),
|
||||
|
@ -2483,10 +2483,10 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
let result_layout = layout_interner.get(*result_layout);
|
||||
|
||||
let argument_layouts = &[
|
||||
*element1_layout,
|
||||
*element2_layout,
|
||||
*element3_layout,
|
||||
*element4_layout,
|
||||
element1_layout,
|
||||
element2_layout,
|
||||
element3_layout,
|
||||
element4_layout,
|
||||
];
|
||||
|
||||
let roc_function_call = roc_function_call(
|
||||
|
@ -2498,7 +2498,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
closure_layout,
|
||||
function_owns_closure_data,
|
||||
argument_layouts,
|
||||
*result_layout,
|
||||
result_layout,
|
||||
);
|
||||
|
||||
list_map4(
|
||||
|
@ -2510,11 +2510,11 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
list2,
|
||||
list3,
|
||||
list4,
|
||||
element1_layout,
|
||||
element2_layout,
|
||||
element3_layout,
|
||||
element4_layout,
|
||||
result_layout,
|
||||
&element1_layout,
|
||||
&element2_layout,
|
||||
&element3_layout,
|
||||
&element4_layout,
|
||||
&result_layout,
|
||||
)
|
||||
}
|
||||
_ => unreachable!("invalid list layout"),
|
||||
|
@ -2532,14 +2532,14 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
|
||||
let element_layout = layout_interner.get(*element_layout);
|
||||
|
||||
let argument_layouts = &[*element_layout, *element_layout];
|
||||
let argument_layouts = &[element_layout, element_layout];
|
||||
|
||||
let compare_wrapper = build_compare_wrapper(
|
||||
env,
|
||||
layout_interner,
|
||||
function,
|
||||
closure_layout,
|
||||
element_layout,
|
||||
&element_layout,
|
||||
)
|
||||
.as_global_value()
|
||||
.as_pointer_value();
|
||||
|
@ -2562,7 +2562,7 @@ pub(crate) fn run_higher_order_low_level<'a, 'ctx, 'env>(
|
|||
roc_function_call,
|
||||
compare_wrapper,
|
||||
list,
|
||||
element_layout,
|
||||
&element_layout,
|
||||
)
|
||||
}
|
||||
_ => unreachable!("invalid list layout"),
|
||||
|
|
|
@ -682,8 +682,8 @@ fn modify_refcount_list<'a, 'ctx, 'env>(
|
|||
let di_location = env.builder.get_current_debug_location().unwrap();
|
||||
|
||||
let element_layout = layout_interner.get(element_layout);
|
||||
let element_layout = when_recursive.unwrap_recursive_pointer(*element_layout);
|
||||
let element_layout = layout_interner.insert(env.arena.alloc(element_layout));
|
||||
let element_layout = when_recursive.unwrap_recursive_pointer(element_layout);
|
||||
let element_layout = layout_interner.insert(element_layout);
|
||||
let list_layout = &Layout::Builtin(Builtin::List(element_layout));
|
||||
let (_, fn_name) = function_name_from_mode(
|
||||
layout_ids,
|
||||
|
@ -777,7 +777,7 @@ fn modify_refcount_list_help<'a, 'ctx, 'env>(
|
|||
|
||||
let element_layout = layout_interner.get(element_layout);
|
||||
if element_layout.contains_refcounted(layout_interner) {
|
||||
let ptr_type = basic_type_from_layout(env, layout_interner, element_layout)
|
||||
let ptr_type = basic_type_from_layout(env, layout_interner, &element_layout)
|
||||
.ptr_type(AddressSpace::Generic);
|
||||
|
||||
let (len, ptr) = load_list(env.builder, original_wrapper, ptr_type);
|
||||
|
@ -790,7 +790,7 @@ fn modify_refcount_list_help<'a, 'ctx, 'env>(
|
|||
mode.to_call_mode(fn_val),
|
||||
when_recursive,
|
||||
element,
|
||||
element_layout,
|
||||
&element_layout,
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -798,7 +798,7 @@ fn modify_refcount_list_help<'a, 'ctx, 'env>(
|
|||
env,
|
||||
layout_interner,
|
||||
parent,
|
||||
*element_layout,
|
||||
element_layout,
|
||||
ptr,
|
||||
len,
|
||||
"modify_rc_index",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue