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_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(
|
||||||
|
|||||||
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;
|
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, ®ion->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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user