mie: ir: op: add functions to check what an Op is, and add successors with args
This commit is contained in:
@@ -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(
|
||||
|
||||
48
mie/ir/op.c
48
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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user