do the same reuse of the computed irtree for array-index expr extensions

This commit is contained in:
Ryan Fleury
2025-02-13 08:13:53 -08:00
parent 50b195deb3
commit 863d98c43e
6 changed files with 63 additions and 32 deletions
+53 -2
View File
@@ -491,7 +491,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
U64 read_range_count = dim_1u64(idx_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx);
exprs[idx] = e_expr_irext_array_index(arena, lhs, &lhs_irtree, idx_range.min + idx);
}
}
}
@@ -2291,7 +2291,7 @@ e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtre
E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location);
E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root);
lhs_bytecode->string = lhs->string;
lhs_bytecode->string = e_string_from_expr(arena, lhs);
lhs_bytecode->space = lhs->space;
lhs_bytecode->mode = lhs_irtree->mode;
lhs_bytecode->type_key = lhs_irtree->type_key;
@@ -2303,6 +2303,57 @@ e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtre
return root;
}
internal E_Expr *
e_expr_irext_array_index(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, U64 index)
{
E_Expr *root = e_push_expr(arena, E_ExprKind_ArrayIndex, 0);
E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location);
E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root);
lhs_bytecode->string = e_string_from_expr(arena, lhs);
lhs_bytecode->space = lhs->space;
lhs_bytecode->mode = lhs_irtree->mode;
lhs_bytecode->type_key = lhs_irtree->type_key;
lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist);
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafU64, 0);
rhs->value.u64 = index;
e_expr_push_child(root, lhs_bytecode);
e_expr_push_child(root, rhs);
return root;
}
internal E_Expr *
e_expr_irext_deref(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree)
{
E_Expr *root = e_push_expr(arena, E_ExprKind_Deref, 0);
E_Expr *rhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, rhs->location);
E_OpList rhs_oplist = e_oplist_from_irtree(arena, rhs_irtree->root);
rhs_bytecode->string = e_string_from_expr(arena, rhs);
rhs_bytecode->space = rhs->space;
rhs_bytecode->mode = rhs_irtree->mode;
rhs_bytecode->type_key = rhs_irtree->type_key;
rhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &rhs_oplist);
e_expr_push_child(root, rhs_bytecode);
return root;
}
internal E_Expr *
e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_TypeKey type_key)
{
E_Expr *root = e_push_expr(arena, E_ExprKind_Cast, 0);
E_Expr *rhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, rhs->location);
E_OpList rhs_oplist = e_oplist_from_irtree(arena, rhs_irtree->root);
rhs_bytecode->string = e_string_from_expr(arena, rhs);
rhs_bytecode->space = rhs->space;
rhs_bytecode->mode = rhs_irtree->mode;
rhs_bytecode->type_key = rhs_irtree->type_key;
rhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &rhs_oplist);
E_Expr *lhs = e_push_expr(arena, E_ExprKind_TypeIdent, 0);
lhs->type_key = type_key;
e_expr_push_child(root, lhs);
e_expr_push_child(root, rhs_bytecode);
return root;
}
////////////////////////////////
//~ rjf: IRified Expression Cache
+3
View File
@@ -422,6 +422,9 @@ internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);
//- rjf: leaf-bytecode expression extensions
internal E_Expr *e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name);
internal E_Expr *e_expr_irext_array_index(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, U64 index);
internal E_Expr *e_expr_irext_deref(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree);
internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_TypeKey type_key);
////////////////////////////////
//~ rjf: IRified Expression Cache
-24
View File
@@ -698,30 +698,6 @@ e_expr_ref(Arena *arena, E_Expr *ref)
return expr;
}
internal E_Expr *
e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name)
{
E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
E_Expr *lhs_ref = e_expr_ref(arena, lhs);
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafMember, 0);
rhs->string = push_str8_copy(arena, member_name);
e_expr_push_child(root, lhs_ref);
e_expr_push_child(root, rhs);
return root;
}
internal E_Expr *
e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index)
{
E_Expr *root = e_push_expr(arena, E_ExprKind_ArrayIndex, 0);
E_Expr *lhs_ref = e_expr_ref(arena, lhs);
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafU64, 0);
rhs->value.u64 = index;
e_expr_push_child(root, lhs_ref);
e_expr_push_child(root, rhs);
return root;
}
internal E_Expr *
e_expr_ref_deref(Arena *arena, E_Expr *rhs)
{
-2
View File
@@ -269,8 +269,6 @@ internal void e_expr_push_child(E_Expr *parent, E_Expr *child);
internal void e_expr_remove_child(E_Expr *parent, E_Expr *child);
internal void e_expr_push_tag(E_Expr *parent, E_Expr *child);
internal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref);
internal E_Expr *e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name);
internal E_Expr *e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index);
internal E_Expr *e_expr_ref_deref(Arena *arena, E_Expr *rhs);
internal E_Expr *e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs);
internal E_Expr *e_expr_copy(Arena *arena, E_Expr *src);
@@ -427,7 +427,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr)
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
expr = e_expr_ref_cast(arena, ptr_to_derived_type_key, expr);
expr = e_expr_irext_cast(arena, ptr_to_derived_type_key);
}
}
}
+6 -3
View File
@@ -8544,17 +8544,19 @@ E_LOOKUP_RANGE_FUNCTION_DEF(top_level_cfg)
Rng1U64 cmds_idx_range = accel->cmds_idx_range;
Rng1U64 cfgs_idx_range = accel->cfgs_idx_range;
U64 dst_idx = 0;
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
// rjf: fill commands
{
Rng1U64 read_range = intersect_1u64(cmds_idx_range, idx_range);
U64 read_count = dim_1u64(read_range);
E_Expr *commands = e_parse_expr_from_text(arena, str8_lit("query:commands"));
E_IRTreeAndType commands_irtree = e_irtree_and_type_from_expr(arena, commands);
for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1)
{
String8 cmd_name = accel->cmds.v[idx + read_range.min - cmds_idx_range.min];
RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name);
exprs[dst_idx] = e_expr_ref_array_index(arena, commands, (U64)cmd_kind-1);
exprs[dst_idx] = e_expr_irext_array_index(arena, commands, &commands_irtree, (U64)cmd_kind-1);
}
}
@@ -8564,7 +8566,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(top_level_cfg)
U64 read_count = dim_1u64(read_range);
for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1)
{
exprs[dst_idx] = e_expr_ref_array_index(arena, lhs, idx + read_range.min - cfgs_idx_range.min);
exprs[dst_idx] = e_expr_irext_array_index(arena, lhs, &lhs_irtree, idx + read_range.min - cfgs_idx_range.min);
}
}
}
@@ -8813,6 +8815,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(environment)
E_LOOKUP_RANGE_FUNCTION_DEF(environment)
{
RD_CfgArray *cfgs = (RD_CfgArray *)user_data;
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
Rng1U64 legal_idx_range = r1u64(0, cfgs->count);
Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);
U64 read_range_count = dim_1u64(read_range);
@@ -8821,7 +8824,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(environment)
U64 cfg_idx = read_range.min + idx;
if(cfg_idx < cfgs->count)
{
exprs[idx] = e_expr_ref_array_index(arena, lhs, cfg_idx);
exprs[idx] = e_expr_irext_array_index(arena, lhs, &lhs_irtree, cfg_idx);
}
}
}