mie: ir: op: add functions to check what an Op is, and add successors with args

This commit is contained in:
2026-01-25 15:01:36 +00:00
parent 0a791fdfb2
commit a22e95d88d
2 changed files with 52 additions and 1 deletions

View File

@@ -79,8 +79,13 @@ MIE_API void mie_op_cleanup(struct mie_op *op);
MIE_API struct mie_op_arg *mie_op_add_arg(struct mie_op *op); MIE_API struct mie_op_arg *mie_op_add_arg(struct mie_op *op);
MIE_API struct mie_register *mie_op_add_result( MIE_API struct mie_register *mie_op_add_result(
struct mie_op *op, const struct mie_type *ty); struct mie_op *op, const struct mie_type *ty);
MIE_API struct mie_op_successor *mie_op_add_successor(
struct mie_op *op, struct mie_block *block, struct mie_register **args,
size_t nr_args);
MIE_API struct mie_region *mie_op_add_region(struct mie_op *op); MIE_API struct mie_region *mie_op_add_region(struct mie_op *op);
MIE_API bool mie_op_is(
const struct mie_op *op, const char *dialect_name, const char *op_name);
MIE_API bool mie_op_has_trait( MIE_API bool mie_op_has_trait(
const struct mie_op *op, const char *dialect_name, const char *trait_name); const struct mie_op *op, const char *dialect_name, const char *trait_name);
MIE_API bool mie_op_has_interface( MIE_API bool mie_op_has_interface(

View File

@@ -83,6 +83,29 @@ struct mie_register *mie_op_add_result(struct mie_op *op, const struct mie_type
return result; return result;
} }
struct mie_op_successor *mie_op_add_successor(
struct mie_op *op, struct mie_block *block, struct mie_register **args,
size_t nr_args)
{
struct mie_op_successor *s
= mie_vector_emplace_back(op->op_successors, NULL);
s->s_flags = MIE_OP_F_SUCCESSOR_RESOLVED;
s->s_block = block;
for (size_t i = 0; i < nr_args; i++) {
struct mie_op_arg *arg
= mie_vector_emplace_back(s->s_args, &op_arg_vector_ops);
arg->arg_flags = MIE_OP_F_ARG_RESOLVED;
arg->arg_value.u_reg = args[i];
arg->arg_value.u_user = op;
b_queue_push_back(&args[i]->reg_use, &arg->arg_value.u_entry);
}
return s;
}
static bool is_isolated(const struct mie_op *op) static bool is_isolated(const struct mie_op *op)
{ {
const struct mie_trait *isolated = mie_trait_table_get_unique( const struct mie_trait *isolated = mie_trait_table_get_unique(
@@ -94,16 +117,39 @@ struct mie_region *mie_op_add_region(struct mie_op *op)
{ {
bool isolated = is_isolated(op); bool isolated = is_isolated(op);
struct mie_region *region = mie_vector_emplace_back(op->op_regions, NULL); struct mie_region *region = malloc(sizeof *region);
if (!region) {
return NULL;
}
region->r_parent = op; region->r_parent = op;
if (isolated) { if (isolated) {
region->r_names = mie_name_map_create(NULL); region->r_names = mie_name_map_create(NULL);
} }
b_queue_push_back(&op->op_regions, &region->r_entry);
return region; return region;
} }
bool mie_op_is(const struct mie_op *op, const char *dialect_name, const char *op_name)
{
if (!op->op_info || !op->op_dialect) {
return false;
}
if (strcmp(op->op_dialect->d_name, dialect_name) != 0) {
return false;
}
if (strcmp(op->op_info->op_name, op_name) != 0) {
return false;
}
return true;
}
bool mie_op_has_trait( bool mie_op_has_trait(
const struct mie_op *op, const char *dialect_name, const char *trait_name) const struct mie_op *op, const char *dialect_name, const char *trait_name)
{ {