mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 06:44:46 +00:00
Remove insert_direct_no_semantic in compare eq
This commit is contained in:
parent
7ab044d79f
commit
6139918e3b
7 changed files with 89 additions and 118 deletions
|
@ -34,8 +34,8 @@ pub fn generic_eq<'a, 'ctx>(
|
|||
layout_ids,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
lhs_layout,
|
||||
rhs_layout,
|
||||
layout_interner.get_repr(lhs_layout),
|
||||
layout_interner.get_repr(rhs_layout),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ fn build_eq_builtin<'a, 'ctx>(
|
|||
layout_ids: &mut LayoutIds<'a>,
|
||||
lhs_val: BasicValueEnum<'ctx>,
|
||||
rhs_val: BasicValueEnum<'ctx>,
|
||||
builtin_layout: InLayout<'a>,
|
||||
builtin_layout: LayoutRepr<'a>,
|
||||
builtin: &Builtin<'a>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let int_cmp = |pred, label| {
|
||||
|
@ -130,7 +130,7 @@ fn build_eq_builtin<'a, 'ctx>(
|
|||
layout_interner,
|
||||
layout_ids,
|
||||
builtin_layout,
|
||||
*elem,
|
||||
layout_interner.get_repr(*elem),
|
||||
lhs_val.into_struct_value(),
|
||||
rhs_val.into_struct_value(),
|
||||
),
|
||||
|
@ -143,26 +143,23 @@ fn build_eq<'a, 'ctx>(
|
|||
layout_ids: &mut LayoutIds<'a>,
|
||||
lhs_val: BasicValueEnum<'ctx>,
|
||||
rhs_val: BasicValueEnum<'ctx>,
|
||||
lhs_layout: InLayout<'a>,
|
||||
rhs_layout: InLayout<'a>,
|
||||
lhs_layout: LayoutRepr<'a>,
|
||||
rhs_layout: LayoutRepr<'a>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let lhs_layout = &layout_interner.runtime_representation_in(lhs_layout);
|
||||
let rhs_layout = &layout_interner.runtime_representation_in(rhs_layout);
|
||||
debug_assert!(
|
||||
layout_interner.eq_repr(*lhs_layout, *rhs_layout),
|
||||
debug_assert_eq!(
|
||||
lhs_layout, rhs_layout,
|
||||
"Equality of different layouts; did you have a type mismatch?\n{:?} == {:?}",
|
||||
lhs_layout,
|
||||
rhs_layout
|
||||
lhs_layout, rhs_layout
|
||||
);
|
||||
|
||||
match layout_interner.get_repr(*lhs_layout) {
|
||||
match lhs_layout {
|
||||
LayoutRepr::Builtin(builtin) => build_eq_builtin(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
*lhs_layout,
|
||||
lhs_layout,
|
||||
&builtin,
|
||||
),
|
||||
|
||||
|
@ -170,7 +167,7 @@ fn build_eq<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
*lhs_layout,
|
||||
lhs_layout,
|
||||
field_layouts,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
|
@ -182,7 +179,7 @@ fn build_eq<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
*lhs_layout,
|
||||
lhs_layout,
|
||||
&union_layout,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
|
@ -192,7 +189,7 @@ fn build_eq<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
*lhs_layout,
|
||||
lhs_layout,
|
||||
inner_layout,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
|
@ -228,7 +225,7 @@ fn build_eq<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
rec_layout,
|
||||
layout_interner.get_repr(rec_layout),
|
||||
&union_layout,
|
||||
field1_cast.into(),
|
||||
field2_cast.into(),
|
||||
|
@ -313,8 +310,8 @@ fn build_neq_builtin<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
builtin_layout,
|
||||
*elem,
|
||||
layout_interner.get_repr(builtin_layout),
|
||||
layout_interner.get_repr(*elem),
|
||||
lhs_val.into_struct_value(),
|
||||
rhs_val.into_struct_value(),
|
||||
)
|
||||
|
@ -359,7 +356,7 @@ fn build_neq<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
lhs_layout,
|
||||
layout_interner.get_repr(lhs_layout),
|
||||
field_layouts,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
|
@ -376,7 +373,7 @@ fn build_neq<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
lhs_layout,
|
||||
layout_interner.get_repr(lhs_layout),
|
||||
&union_layout,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
|
@ -393,7 +390,7 @@ fn build_neq<'a, 'ctx>(
|
|||
env,
|
||||
layout_interner,
|
||||
layout_ids,
|
||||
lhs_layout,
|
||||
layout_interner.get_repr(lhs_layout),
|
||||
inner_layout,
|
||||
lhs_val,
|
||||
rhs_val,
|
||||
|
@ -416,8 +413,8 @@ fn build_list_eq<'a, 'ctx>(
|
|||
env: &Env<'a, 'ctx, '_>,
|
||||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout_ids: &mut LayoutIds<'a>,
|
||||
list_layout: InLayout<'a>,
|
||||
element_layout: InLayout<'a>,
|
||||
list_layout: LayoutRepr<'a>,
|
||||
element_layout: LayoutRepr<'a>,
|
||||
list1: StructValue<'ctx>,
|
||||
list2: StructValue<'ctx>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
|
@ -425,21 +422,19 @@ fn build_list_eq<'a, 'ctx>(
|
|||
let di_location = env.builder.get_current_debug_location().unwrap();
|
||||
|
||||
let symbol = Symbol::LIST_EQ;
|
||||
let element_layout =
|
||||
if let LayoutRepr::RecursivePointer(rec) = layout_interner.get_repr(element_layout) {
|
||||
rec
|
||||
} else {
|
||||
element_layout
|
||||
};
|
||||
let element_layout = if let LayoutRepr::RecursivePointer(rec) = element_layout {
|
||||
layout_interner.get_repr(rec)
|
||||
} else {
|
||||
element_layout
|
||||
};
|
||||
let fn_name = layout_ids
|
||||
.get(symbol, &layout_interner.get_repr(element_layout))
|
||||
.get(symbol, &element_layout)
|
||||
.to_symbol_string(symbol, &env.interns);
|
||||
|
||||
let function = match env.module.get_function(fn_name.as_str()) {
|
||||
Some(function_value) => function_value,
|
||||
None => {
|
||||
let arg_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(list_layout));
|
||||
let arg_type = basic_type_from_layout(env, layout_interner, list_layout);
|
||||
|
||||
let function_value = crate::llvm::refcounting::build_header_help(
|
||||
env,
|
||||
|
@ -476,7 +471,7 @@ fn build_list_eq_help<'a, 'ctx>(
|
|||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout_ids: &mut LayoutIds<'a>,
|
||||
parent: FunctionValue<'ctx>,
|
||||
element_layout: InLayout<'a>,
|
||||
element_layout: LayoutRepr<'a>,
|
||||
) {
|
||||
let ctx = env.context;
|
||||
let builder = env.builder;
|
||||
|
@ -535,11 +530,7 @@ fn build_list_eq_help<'a, 'ctx>(
|
|||
env.builder.position_at_end(then_block);
|
||||
|
||||
let builder = env.builder;
|
||||
let element_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
);
|
||||
let element_type = basic_type_from_layout(env, layout_interner, element_layout);
|
||||
let ptr_type = element_type.ptr_type(AddressSpace::default());
|
||||
let ptr1 = load_list_ptr(env.builder, list1, ptr_type);
|
||||
let ptr2 = load_list_ptr(env.builder, list2, ptr_type);
|
||||
|
@ -579,26 +570,14 @@ fn build_list_eq_help<'a, 'ctx>(
|
|||
let elem_ptr = unsafe {
|
||||
builder.new_build_in_bounds_gep(element_type, ptr1, &[curr_index], "load_index")
|
||||
};
|
||||
load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
elem_ptr,
|
||||
"get_elem",
|
||||
)
|
||||
load_roc_value(env, layout_interner, element_layout, elem_ptr, "get_elem")
|
||||
};
|
||||
|
||||
let elem2 = {
|
||||
let elem_ptr = unsafe {
|
||||
builder.new_build_in_bounds_gep(element_type, ptr2, &[curr_index], "load_index")
|
||||
};
|
||||
load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(element_layout),
|
||||
elem_ptr,
|
||||
"get_elem",
|
||||
)
|
||||
load_roc_value(env, layout_interner, element_layout, elem_ptr, "get_elem")
|
||||
};
|
||||
|
||||
let are_equal = build_eq(
|
||||
|
@ -649,7 +628,7 @@ fn build_struct_eq<'a, 'ctx>(
|
|||
env: &Env<'a, 'ctx, '_>,
|
||||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout_ids: &mut LayoutIds<'a>,
|
||||
struct_layout: InLayout<'a>,
|
||||
struct_layout: LayoutRepr<'a>,
|
||||
field_layouts: &'a [InLayout<'a>],
|
||||
struct1: BasicValueEnum<'ctx>,
|
||||
struct2: BasicValueEnum<'ctx>,
|
||||
|
@ -659,17 +638,13 @@ fn build_struct_eq<'a, 'ctx>(
|
|||
|
||||
let symbol = Symbol::GENERIC_EQ;
|
||||
let fn_name = layout_ids
|
||||
.get(symbol, &layout_interner.get_repr(struct_layout))
|
||||
.get(symbol, &struct_layout)
|
||||
.to_symbol_string(symbol, &env.interns);
|
||||
|
||||
let function = match env.module.get_function(fn_name.as_str()) {
|
||||
Some(function_value) => function_value,
|
||||
None => {
|
||||
let arg_type = argument_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
);
|
||||
let arg_type = argument_type_from_layout(env, layout_interner, struct_layout);
|
||||
|
||||
let function_value = crate::llvm::refcounting::build_header_help(
|
||||
env,
|
||||
|
@ -707,7 +682,7 @@ fn build_struct_eq_help<'a, 'ctx>(
|
|||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout_ids: &mut LayoutIds<'a>,
|
||||
parent: FunctionValue<'ctx>,
|
||||
struct_layout: InLayout<'a>,
|
||||
struct_layout: LayoutRepr<'a>,
|
||||
field_layouts: &[InLayout<'a>],
|
||||
) {
|
||||
let ctx = env.context;
|
||||
|
@ -803,8 +778,8 @@ fn build_struct_eq_help<'a, 'ctx>(
|
|||
layout_ids,
|
||||
field1_cast.into(),
|
||||
field2_cast.into(),
|
||||
field_layout,
|
||||
field_layout,
|
||||
layout_interner.get_repr(field_layout),
|
||||
layout_interner.get_repr(field_layout),
|
||||
)
|
||||
.into_int_value()
|
||||
} else {
|
||||
|
@ -814,8 +789,8 @@ fn build_struct_eq_help<'a, 'ctx>(
|
|||
layout_ids,
|
||||
field1,
|
||||
field2,
|
||||
*field_layout,
|
||||
*field_layout,
|
||||
layout_interner.get_repr(*field_layout),
|
||||
layout_interner.get_repr(*field_layout),
|
||||
)
|
||||
.into_int_value()
|
||||
};
|
||||
|
@ -846,7 +821,7 @@ fn build_tag_eq<'a, 'ctx>(
|
|||
env: &Env<'a, 'ctx, '_>,
|
||||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout_ids: &mut LayoutIds<'a>,
|
||||
tag_layout: InLayout<'a>,
|
||||
tag_layout: LayoutRepr<'a>,
|
||||
union_layout: &UnionLayout<'a>,
|
||||
tag1: BasicValueEnum<'ctx>,
|
||||
tag2: BasicValueEnum<'ctx>,
|
||||
|
@ -856,7 +831,7 @@ fn build_tag_eq<'a, 'ctx>(
|
|||
|
||||
let symbol = Symbol::GENERIC_EQ;
|
||||
let fn_name = layout_ids
|
||||
.get(symbol, &layout_interner.get_repr(tag_layout))
|
||||
.get(symbol, &tag_layout)
|
||||
.to_symbol_string(symbol, &env.interns);
|
||||
|
||||
let function = match env.module.get_function(fn_name.as_str()) {
|
||||
|
@ -1002,8 +977,7 @@ fn build_tag_eq_help<'a, 'ctx>(
|
|||
let block = env.context.append_basic_block(parent, "tag_id_modify");
|
||||
env.builder.position_at_end(block);
|
||||
|
||||
let struct_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let struct_layout = LayoutRepr::struct_(field_layouts);
|
||||
|
||||
let answer = eq_ptr_to_struct(
|
||||
env,
|
||||
|
@ -1075,8 +1049,7 @@ fn build_tag_eq_help<'a, 'ctx>(
|
|||
let block = env.context.append_basic_block(parent, "tag_id_modify");
|
||||
env.builder.position_at_end(block);
|
||||
|
||||
let struct_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let struct_layout = LayoutRepr::struct_(field_layouts);
|
||||
|
||||
let answer = eq_ptr_to_struct(
|
||||
env,
|
||||
|
@ -1138,8 +1111,7 @@ fn build_tag_eq_help<'a, 'ctx>(
|
|||
|
||||
env.builder.position_at_end(compare_other);
|
||||
|
||||
let struct_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(other_fields));
|
||||
let struct_layout = LayoutRepr::struct_(other_fields);
|
||||
|
||||
let answer = eq_ptr_to_struct(
|
||||
env,
|
||||
|
@ -1243,8 +1215,7 @@ fn build_tag_eq_help<'a, 'ctx>(
|
|||
let block = env.context.append_basic_block(parent, "tag_id_modify");
|
||||
env.builder.position_at_end(block);
|
||||
|
||||
let struct_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let struct_layout = LayoutRepr::struct_(field_layouts);
|
||||
|
||||
let answer = eq_ptr_to_struct(
|
||||
env,
|
||||
|
@ -1284,8 +1255,7 @@ fn build_tag_eq_help<'a, 'ctx>(
|
|||
|
||||
env.builder.position_at_end(compare_fields);
|
||||
|
||||
let struct_layout =
|
||||
layout_interner.insert_direct_no_semantic(LayoutRepr::struct_(field_layouts));
|
||||
let struct_layout = LayoutRepr::struct_(field_layouts);
|
||||
|
||||
let answer = eq_ptr_to_struct(
|
||||
env,
|
||||
|
@ -1306,16 +1276,12 @@ fn eq_ptr_to_struct<'a, 'ctx>(
|
|||
env: &Env<'a, 'ctx, '_>,
|
||||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout_ids: &mut LayoutIds<'a>,
|
||||
struct_layout: InLayout<'a>,
|
||||
struct_layout: LayoutRepr<'a>,
|
||||
field_layouts: &'a [InLayout<'a>],
|
||||
tag1: PointerValue<'ctx>,
|
||||
tag2: PointerValue<'ctx>,
|
||||
) -> IntValue<'ctx> {
|
||||
let wrapper_type = basic_type_from_layout(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
);
|
||||
let wrapper_type = basic_type_from_layout(env, layout_interner, struct_layout);
|
||||
debug_assert!(wrapper_type.is_struct_type());
|
||||
|
||||
// cast the opaque pointer to a pointer of the correct shape
|
||||
|
@ -1334,14 +1300,14 @@ fn eq_ptr_to_struct<'a, 'ctx>(
|
|||
let struct1 = load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
struct_layout,
|
||||
struct1_ptr,
|
||||
"load_struct1",
|
||||
);
|
||||
let struct2 = load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(struct_layout),
|
||||
struct_layout,
|
||||
struct2_ptr,
|
||||
"load_struct2",
|
||||
);
|
||||
|
@ -1364,7 +1330,7 @@ fn build_box_eq<'a, 'ctx>(
|
|||
env: &Env<'a, 'ctx, '_>,
|
||||
layout_interner: &mut STLayoutInterner<'a>,
|
||||
layout_ids: &mut LayoutIds<'a>,
|
||||
box_layout: InLayout<'a>,
|
||||
box_layout: LayoutRepr<'a>,
|
||||
inner_layout: InLayout<'a>,
|
||||
tag1: BasicValueEnum<'ctx>,
|
||||
tag2: BasicValueEnum<'ctx>,
|
||||
|
@ -1374,14 +1340,13 @@ fn build_box_eq<'a, 'ctx>(
|
|||
|
||||
let symbol = Symbol::GENERIC_EQ;
|
||||
let fn_name = layout_ids
|
||||
.get(symbol, &layout_interner.get_repr(box_layout))
|
||||
.get(symbol, &box_layout)
|
||||
.to_symbol_string(symbol, &env.interns);
|
||||
|
||||
let function = match env.module.get_function(fn_name.as_str()) {
|
||||
Some(function_value) => function_value,
|
||||
None => {
|
||||
let arg_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(box_layout));
|
||||
let arg_type = basic_type_from_layout(env, layout_interner, box_layout);
|
||||
|
||||
let function_value = crate::llvm::refcounting::build_header_help(
|
||||
env,
|
||||
|
@ -1503,8 +1468,8 @@ fn build_box_eq_help<'a, 'ctx>(
|
|||
layout_ids,
|
||||
value1,
|
||||
value2,
|
||||
inner_layout,
|
||||
inner_layout,
|
||||
layout_interner.get_repr(inner_layout),
|
||||
layout_interner.get_repr(inner_layout),
|
||||
);
|
||||
|
||||
env.builder.build_return(Some(&is_equal));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue