From a22e95d88d94fafa541b7d443af5ef762738b047 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 25 Jan 2026 15:01:36 +0000 Subject: [PATCH] mie: ir: op: add functions to check what an Op is, and add successors with args --- mie/include/mie/ir/op.h | 5 +++++ mie/ir/op.c | 48 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/mie/include/mie/ir/op.h b/mie/include/mie/ir/op.h index 127fa6f..52b1a11 100644 --- a/mie/include/mie/ir/op.h +++ b/mie/include/mie/ir/op.h @@ -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_register *mie_op_add_result( 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 bool mie_op_is( + const struct mie_op *op, const char *dialect_name, const char *op_name); MIE_API bool mie_op_has_trait( const struct mie_op *op, const char *dialect_name, const char *trait_name); MIE_API bool mie_op_has_interface( diff --git a/mie/ir/op.c b/mie/ir/op.c index ca1a90c..b8aede7 100644 --- a/mie/ir/op.c +++ b/mie/ir/op.c @@ -83,6 +83,29 @@ struct mie_register *mie_op_add_result(struct mie_op *op, const struct mie_type 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) { 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); - 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; if (isolated) { region->r_names = mie_name_map_create(NULL); } + b_queue_push_back(&op->op_regions, ®ion->r_entry); + 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( const struct mie_op *op, const char *dialect_name, const char *trait_name) {