static void _risc_rcg_node_printf(risc_rcg_node_t* rn, scf_function_t* f)
{
- if (rn->dag_node) {
- scf_variable_t* v = rn->dag_node->var;
+ if (rn->dn) {
+ scf_variable_t* v = rn->dn->var;
if (v->w) {
scf_logw("v_%d_%d/%s, %p,%p, ",
v->w->line, v->w->pos, v->w->text->data,
- v, rn->dag_node);
+ v, rn->dn);
if (v->bp_offset < 0)
printf("bp_offset: -%#x, ", -v->bp_offset);
printf("bp_offset: %#x, ", v->bp_offset);
printf("color: %ld, type: %ld, id: %ld, mask: %ld",
- rn->dag_node->color,
- RISC_COLOR_TYPE(rn->dag_node->color),
- RISC_COLOR_ID(rn->dag_node->color),
- RISC_COLOR_MASK(rn->dag_node->color));
+ rn->dn->color,
+ RISC_COLOR_TYPE(rn->dn->color),
+ RISC_COLOR_ID(rn->dn->color),
+ RISC_COLOR_MASK(rn->dn->color));
} else {
scf_logw("v_%#lx, %p,%p, color: %ld, type: %ld, id: %ld, mask: %ld",
- (uintptr_t)v & 0xffff, v, rn->dag_node,
- rn->dag_node->color,
- RISC_COLOR_TYPE(rn->dag_node->color),
- RISC_COLOR_ID(rn->dag_node->color),
- RISC_COLOR_MASK(rn->dag_node->color));
+ (uintptr_t)v & 0xffff, v, rn->dn,
+ rn->dn->color,
+ RISC_COLOR_TYPE(rn->dn->color),
+ RISC_COLOR_ID(rn->dn->color),
+ RISC_COLOR_MASK(rn->dn->color));
}
- if (rn->dag_node->color > 0) {
- scf_register_t* r = f->rops->find_register_color(rn->dag_node->color);
+ if (rn->dn->color > 0) {
+ scf_register_t* r = f->rops->find_register_color(rn->dn->color);
printf(", reg: %s\n", r->name);
} else {
printf("\n");
int i;
for (i = 0; i < g->nodes->size; i++) {
scf_graph_node_t* gn = g->nodes->data[i];
- risc_rcg_node_t* rn = gn->data;
- scf_dag_node_t* dn = rn->dag_node;
+ risc_rcg_node_t* rn = gn->data;
+ scf_dag_node_t* dn = rn->dn;
scf_dn_status_t* ds;
if (!dn) {
} scf_risc_context_t;
typedef struct {
- scf_dag_node_t* dag_node;
-
- scf_register_t* reg;
-
- scf_risc_OpCode_t* OpCode;
+ scf_dag_node_t* dn;
+ scf_register_t* reg;
} risc_rcg_node_t;
{
risc_rcg_node_t* rn = node->data;
- if (!rn->dag_node) {
+ if (!rn->dn) {
assert(rn->reg);
return rn->reg->color;
}
int bytes = RISC_COLOR_BYTES(c);
uint32_t type = RISC_COLOR_TYPE(c);
- if (bytes == f->rops->variable_size (rn->dag_node->var)
- && type == scf_variable_float(rn->dag_node->var))
+ if (bytes == f->rops->variable_size (rn->dn->var)
+ && type == scf_variable_float(rn->dn->var))
return c;
}
scf_logd("graph->nodes->size: %d, neighbors: %d, k: %d, node: %p, rn->reg: %p\n",
graph->nodes->size, node->neighbors->size, k, node, rn->reg);
- if (!rn->dag_node) {
+ if (!rn->dn) {
assert(rn->reg);
assert(node->color > 0);
i++;
scf_logd("graph->nodes->size: %d, neighbors: %d, k: %d, node: %p, rn->reg: %p\n",
graph->nodes->size, node->neighbors->size, k, node, rn->reg);
- if (0 != scf_graph_delete_node(graph, node)) {
- scf_loge("scf_graph_delete_node\n");
+ if (0 != scf_graph_del_node(graph, node)) {
+ scf_loge("scf_graph_del_node\n");
return -1;
}
if (0 != scf_vector_add(deleted_nodes, node)) {
- scf_loge("scf_graph_delete_node\n");
+ scf_loge("scf_graph_del_node\n");
return -1;
}
nb_deleted++;
scf_vector_t* colors2 = NULL;
for (i = deleted_nodes->size - 1; i >= 0; i--) {
- scf_graph_node_t* node = deleted_nodes->data[i];
+ scf_graph_node_t* node = deleted_nodes->data[i];
risc_rcg_node_t* rn = node->data;
if (node->neighbors->size >= k)
if (f->rops->color_conflict(node->color, neighbor->color)) {
scf_logd("node: %p, neighbor: %p, color: %#lx:%#lx\n", node, neighbor, node->color, neighbor->color);
- scf_logd("node: %p, dn: %p, reg: %p\n", node, rn->dag_node, rn->reg);
+ scf_logd("node: %p, dn: %p, reg: %p\n", node, rn->dn, rn->reg);
//assert(!rn->reg);
- assert(rn->dag_node);
+ assert(rn->dn);
node->color = 0;
}
}
node0 = graph->nodes->data[i];
rn0 = node0->data;
- dn0 = rn0->dag_node;
+ dn0 = rn0->dn;
if (!dn0) {
assert(rn0->reg);
node1 = graph->nodes->data[j];
rn1 = node1->data;
- dn1 = rn1->dag_node;
+ dn1 = rn1->dn;
if (!dn1) {
assert(rn1->reg);
int max = 0;
int i;
for (i = 0; i < graph->nodes->size; i++) {
- scf_graph_node_t* node = graph->nodes->data[i];
+ scf_graph_node_t* node = graph->nodes->data[i];
risc_rcg_node_t* rn = node->data;
if (rn->reg) {
risc_rcg_node_t* rn = node_max->data;
- if (rn->dag_node->var->w)
- scf_logi("max_neighbors: %d, %s\n", max, rn->dag_node->var->w->text->data);
+ if (rn->dn->var->w)
+ scf_logi("max_neighbors: %d, %s\n", max, rn->dn->var->w->text->data);
else
- scf_logi("max_neighbors: %d, v_%p\n", max, rn->dag_node->var);
+ scf_logi("max_neighbors: %d, v_%p\n", max, rn->dn->var);
return node_max;
}
for (i = 0; i < graph->nodes->size - 1; i++) {
- scf_graph_node_t* gn0 = graph->nodes->data[i];
+ scf_graph_node_t* gn0 = graph->nodes->data[i];
risc_rcg_node_t* rn0 = gn0->data;
- scf_logd("i: %d, rn0->dag_node: %p, rn0->reg: %p\n", i, rn0->dag_node, rn0->reg);
+ scf_logd("i: %d, rn0->dn: %p, rn0->reg: %p\n", i, rn0->dn, rn0->reg);
if (0 == gn0->color)
continue;
for (j = i + 1; j < graph->nodes->size; j++) {
- scf_graph_node_t* gn1 = graph->nodes->data[j];
+ scf_graph_node_t* gn1 = graph->nodes->data[j];
risc_rcg_node_t* rn1 = gn1->data;
- scf_logd("j: %d, rn1->dag_node: %p, rn1->reg: %p\n", j, rn1->dag_node, rn1->reg);
+ scf_logd("j: %d, rn1->dn: %p, rn1->reg: %p\n", j, rn1->dn, rn1->reg);
if (0 == gn1->color)
continue;
if (!f->rops->color_conflict(gn0->color, gn1->color))
continue;
- if (!rn0->dag_node) {
- if (!rn1->dag_node) {
+ if (!rn0->dn) {
+ if (!rn1->dn) {
continue;
}
rn1->reg = NULL;
- rn1->OpCode = NULL;
gn1->color = 0;
- } else if (!rn1->dag_node) {
+ } else if (!rn1->dn) {
rn0->reg = NULL;
- rn0->OpCode = NULL;
gn0->color = 0;
} else {
- int nb_parents0 = rn0->dag_node->parents ? rn0->dag_node->parents->size : 0;
- int nb_parents1 = rn1->dag_node->parents ? rn1->dag_node->parents->size : 0;
+ int nb_parents0 = rn0->dn->parents ? rn0->dn->parents->size : 0;
+ int nb_parents1 = rn1->dn->parents ? rn1->dn->parents->size : 0;
if (nb_parents0 > nb_parents1) {
rn1->reg = NULL;
- rn1->OpCode = NULL;
gn1->color = 0;
} else {
rn0->reg = NULL;
- rn0->OpCode = NULL;
gn0->color = 0;
}
}
goto error;
}
- int reg_size0 = f->rops->variable_size(rn0->dag_node->var);
- int reg_size1 = f->rops->variable_size(rn1->dag_node->var);
+ int reg_size0 = f->rops->variable_size(rn0->dn->var);
+ int reg_size1 = f->rops->variable_size(rn1->dn->var);
if (reg_size0 > reg_size1) {
assert(!scf_vector_find(colors2, (void*)node0->color));
}
- ret = scf_graph_delete_node(graph, node0);
+ ret = scf_graph_del_node(graph, node0);
if (ret < 0)
goto error;
- ret = scf_graph_delete_node(graph, node1);
+ ret = scf_graph_del_node(graph, node1);
if (ret < 0)
goto error;
node_max = _risc_max_neighbors(graph);
assert(node_max);
- ret = scf_graph_delete_node(graph, node_max);
+ ret = scf_graph_del_node(graph, node_max);
if (ret < 0)
goto error;
node_max->color = -1;
static int _risc_rcg_node_cmp(const void* v0, const void* v1)
{
const scf_graph_node_t* gn1 = v1;
- const risc_rcg_node_t* rn1 = gn1->data;
- const risc_rcg_node_t* rn0 = v0;
+ const risc_rcg_node_t* rn1 = gn1->data;
+ const risc_rcg_node_t* rn0 = v0;
- if (rn0->dag_node || rn1->dag_node)
- return rn0->dag_node != rn1->dag_node;
+ if (rn0->dn || rn1->dn)
+ return rn0->dn != rn1->dn;
return rn0->reg != rn1->reg;
}
int risc_rcg_find_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg)
{
- risc_rcg_node_t* rn = calloc(1, sizeof(risc_rcg_node_t));
- if (!rn)
- return -ENOMEM;
-
- rn->dag_node = dn;
- rn->reg = reg;
+ risc_rcg_node_t tmp;
- scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, rn, _risc_rcg_node_cmp);
- free(rn);
- rn = NULL;
+ tmp.dn = dn;
+ tmp.reg = reg;
+ scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, &tmp, _risc_rcg_node_cmp);
if (!gn)
return -1;
int _risc_rcg_make_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg)
{
- risc_rcg_node_t* rn = calloc(1, sizeof(risc_rcg_node_t));
- if (!rn)
- return -ENOMEM;
+ risc_rcg_node_t* rn;
+ risc_rcg_node_t tmp;
- rn->dag_node = dn;
- rn->reg = reg;
- rn->OpCode = NULL;
+ tmp.dn = dn;
+ tmp.reg = reg;
- scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, rn, _risc_rcg_node_cmp);
+ scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, &tmp, _risc_rcg_node_cmp);
if (!gn) {
+ rn = calloc(1, sizeof(risc_rcg_node_t));
+ if (!rn)
+ return -ENOMEM;
gn = scf_graph_node_alloc();
if (!gn) {
return -ENOMEM;
}
+ rn->dn = dn;
+ rn->reg = reg;
gn->data = rn;
if (reg)
} else {
if (reg)
gn->color = reg->color;
-
- free(rn);
- rn = NULL;
}
*pp = gn;
for (j = 0; j < neighbors->size; j++) {
scf_graph_node_t* neighbor = neighbors->data[j];
- risc_rcg_node_t* rn = neighbor->data;
+ risc_rcg_node_t* rn = neighbor->data;
- if (rn->dag_node) {
- if (rn->dag_node->color <= 0)
+ if (rn->dn) {
+ if (rn->dn->color <= 0)
continue;
- if (arm32_color_conflict(r->color, rn->dag_node->color))
+ if (arm32_color_conflict(r->color, rn->dn->color))
break;
} else {
assert(rn->reg);
for (j = 0; j < neighbors->size; j++) {
scf_graph_node_t* neighbor = neighbors->data[j];
- risc_rcg_node_t* rn = neighbor->data;
+ risc_rcg_node_t* rn = neighbor->data;
- if (rn->dag_node) {
- if (rn->dag_node->color <= 0)
+ if (rn->dn) {
+ if (rn->dn->color <= 0)
continue;
- if (arm64_color_conflict(r->color, rn->dag_node->color))
+ if (arm64_color_conflict(r->color, rn->dn->color))
break;
} else {
assert(rn->reg);
scf_graph_node_t* neighbor = neighbors->data[j];
risc_rcg_node_t* rn = neighbor->data;
- if (rn->dag_node) {
- if (rn->dag_node->color <= 0)
+ if (rn->dn) {
+ if (rn->dn->color <= 0)
continue;
- if (naja_color_conflict(r->color, rn->dag_node->color))
+ if (naja_color_conflict(r->color, rn->dn->color))
break;
} else {
assert(rn->reg);
static void _x64_rcg_node_printf(x64_rcg_node_t* rn)
{
- if (rn->dag_node) {
- scf_variable_t* v = rn->dag_node->var;
+ if (rn->dn) {
+ scf_variable_t* v = rn->dn->var;
if (v->w) {
scf_logw("v_%d_%d/%s, ",
printf("bp_offset: %#x, ", v->bp_offset);
printf("color: %ld, type: %ld, id: %ld, mask: %ld",
- rn->dag_node->color,
- X64_COLOR_TYPE(rn->dag_node->color),
- X64_COLOR_ID(rn->dag_node->color),
- X64_COLOR_MASK(rn->dag_node->color));
+ rn->dn->color,
+ X64_COLOR_TYPE(rn->dn->color),
+ X64_COLOR_ID(rn->dn->color),
+ X64_COLOR_MASK(rn->dn->color));
} else {
scf_logw("v_%#lx, %p,%p, color: %ld, type: %ld, id: %ld, mask: %ld",
- (uintptr_t)v & 0xffff, v, rn->dag_node,
- rn->dag_node->color,
- X64_COLOR_TYPE(rn->dag_node->color),
- X64_COLOR_ID(rn->dag_node->color),
- X64_COLOR_MASK(rn->dag_node->color));
+ (uintptr_t)v & 0xffff, v, rn->dn,
+ rn->dn->color,
+ X64_COLOR_TYPE(rn->dn->color),
+ X64_COLOR_ID(rn->dn->color),
+ X64_COLOR_MASK(rn->dn->color));
}
- if (rn->dag_node->color > 0) {
- scf_register_t* r = x64_find_register_color(rn->dag_node->color);
+ if (rn->dn->color > 0) {
+ scf_register_t* r = x64_find_register_color(rn->dn->color);
printf(", reg: %s\n", r->name);
} else {
printf("\n");
if (l == scf_list_sentinel(&f->dag_list_head))
continue;
- int ret = _x64_rcg_make_node(&gn, g, dn, v->rabi, NULL);
+ int ret = _x64_rcg_make_node(&gn, g, dn, v->rabi);
if (ret < 0)
return ret;
for (i = 0; i < g->nodes->size; i++) {
scf_graph_node_t* gn = g->nodes->data[i];
x64_rcg_node_t* rn = gn->data;
- scf_dag_node_t* dn = rn->dag_node;
+ scf_dag_node_t* dn = rn->dn;
scf_dn_status_t* ds;
if (!dn) {
} scf_x64_context_t;
typedef struct {
- scf_dag_node_t* dag_node;
-
+ scf_dag_node_t* dn;
scf_register_t* reg;
- scf_x64_OpCode_t* OpCode;
-
} x64_rcg_node_t;
x64_rcg_handler_pt scf_x64_find_rcg_handler (const int op_type);
x64_inst_handler_pt scf_x64_find_inst_handler(const int op_type);
-int x64_rcg_find_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg);
-int _x64_rcg_make_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg, scf_x64_OpCode_t* OpCode);
+int x64_rcg_find_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg);
+int _x64_rcg_make_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg);
int scf_x64_open (scf_native_t* ctx, const char* arch);
int scf_x64_close (scf_native_t* ctx);
{
x64_rcg_node_t* rn = node->data;
- if (!rn->dag_node) {
+ if (!rn->dn) {
assert(rn->reg);
return rn->reg->color;
}
int bytes = X64_COLOR_BYTES(c);
uint32_t type = X64_COLOR_TYPE(c);
- if (bytes == x64_variable_size(rn->dag_node->var)
- && type == scf_variable_float(rn->dag_node->var))
+ if (bytes == x64_variable_size(rn->dn->var)
+ && type == scf_variable_float(rn->dn->var))
return c;
}
scf_logd("graph->nodes->size: %d, neighbors: %d, k: %d, node: %p, rn->reg: %p\n",
graph->nodes->size, node->neighbors->size, k, node, rn->reg);
- if (!rn->dag_node) {
+ if (!rn->dn) {
assert(rn->reg);
assert(node->color > 0);
i++;
scf_logd("graph->nodes->size: %d, neighbors: %d, k: %d, node: %p, rn->reg: %p\n",
graph->nodes->size, node->neighbors->size, k, node, rn->reg);
- if (0 != scf_graph_delete_node(graph, node)) {
- scf_loge("scf_graph_delete_node\n");
+ if (0 != scf_graph_del_node(graph, node)) {
+ scf_loge("scf_graph_del_node\n");
return -1;
}
if (0 != scf_vector_add(deleted_nodes, node)) {
- scf_loge("scf_graph_delete_node\n");
+ scf_loge("scf_graph_del_node\n");
return -1;
}
nb_deleted++;
if (X64_COLOR_CONFLICT(node->color, neighbor->color)) {
scf_logd("node: %p, neighbor: %p, color: %#lx:%#lx\n", node, neighbor, node->color, neighbor->color);
- scf_logd("node: %p, dn: %p, reg: %p\n", node, rn->dag_node, rn->reg);
+ scf_logd("node: %p, dn: %p, reg: %p\n", node, rn->dn, rn->reg);
//assert(!rn->reg);
- assert(rn->dag_node);
+ assert(rn->dn);
node->color = 0;
}
}
node0 = graph->nodes->data[i];
rn0 = node0->data;
- dn0 = rn0->dag_node;
+ dn0 = rn0->dn;
if (!dn0) {
assert(rn0->reg);
node1 = graph->nodes->data[j];
rn1 = node1->data;
- dn1 = rn1->dag_node;
+ dn1 = rn1->dn;
if (!dn1) {
assert(rn1->reg);
static scf_graph_node_t* _x64_max_neighbors(scf_graph_t* graph)
{
- scf_graph_node_t* node_max = NULL;
+ scf_graph_node_t* node_max = NULL;
+ scf_graph_node_t* node;
+ x64_rcg_node_t* rn;
+
int max = 0;
int i;
+
for (i = 0; i < graph->nodes->size; i++) {
- scf_graph_node_t* node = graph->nodes->data[i];
- x64_rcg_node_t* rn = node->data;
+ node = graph->nodes->data[i];
+ rn = node->data;
if (rn->reg) {
assert(node->color > 0);
}
}
- x64_rcg_node_t* rn = node_max->data;
+ rn = node_max->data;
- if (rn->dag_node->var->w)
- scf_logd("max_neighbors: %d, %s\n", max, rn->dag_node->var->w->text->data);
+ if (rn->dn->var->w)
+ scf_logd("max_neighbors: %d, %s\n", max, rn->dn->var->w->text->data);
else
- scf_logd("max_neighbors: %d, v_%p\n", max, rn->dag_node->var);
+ scf_logd("max_neighbors: %d, v_%p\n", max, rn->dn->var);
return node_max;
}
scf_graph_node_t* gn0 = graph->nodes->data[i];
x64_rcg_node_t* rn0 = gn0->data;
- scf_logd("i: %d, rn0->dag_node: %p, rn0->reg: %p\n", i, rn0->dag_node, rn0->reg);
+ scf_logd("i: %d, rn0->dn: %p, rn0->reg: %p\n", i, rn0->dn, rn0->reg);
if (0 == gn0->color)
continue;
scf_graph_node_t* gn1 = graph->nodes->data[j];
x64_rcg_node_t* rn1 = gn1->data;
- scf_logd("j: %d, rn1->dag_node: %p, rn1->reg: %p\n", j, rn1->dag_node, rn1->reg);
+ scf_logd("j: %d, rn1->dn: %p, rn1->reg: %p\n", j, rn1->dn, rn1->reg);
if (0 == gn1->color)
continue;
if (!X64_COLOR_CONFLICT(gn0->color, gn1->color))
continue;
- if (!rn0->dag_node) {
- if (!rn1->dag_node) {
+ if (!rn0->dn) {
+ if (!rn1->dn) {
continue;
}
rn1->reg = NULL;
- rn1->OpCode = NULL;
gn1->color = 0;
- } else if (!rn1->dag_node) {
+ } else if (!rn1->dn) {
rn0->reg = NULL;
- rn0->OpCode = NULL;
gn0->color = 0;
} else {
- int nb_parents0 = rn0->dag_node->parents ? rn0->dag_node->parents->size : 0;
- int nb_parents1 = rn1->dag_node->parents ? rn1->dag_node->parents->size : 0;
+ int nb_parents0 = rn0->dn->parents ? rn0->dn->parents->size : 0;
+ int nb_parents1 = rn1->dn->parents ? rn1->dn->parents->size : 0;
if (nb_parents0 > nb_parents1) {
rn1->reg = NULL;
- rn1->OpCode = NULL;
gn1->color = 0;
} else {
rn0->reg = NULL;
- rn0->OpCode = NULL;
gn0->color = 0;
}
}
goto error;
}
- int reg_size0 = x64_variable_size(rn0->dag_node->var);
- int reg_size1 = x64_variable_size(rn1->dag_node->var);
+ int reg_size0 = x64_variable_size(rn0->dn->var);
+ int reg_size1 = x64_variable_size(rn1->dn->var);
if (reg_size0 > reg_size1) {
assert(!scf_vector_find(colors2, (void*)node0->color));
}
- ret = scf_graph_delete_node(graph, node0);
+ ret = scf_graph_del_node(graph, node0);
if (ret < 0)
goto error;
- ret = scf_graph_delete_node(graph, node1);
+ ret = scf_graph_del_node(graph, node1);
if (ret < 0)
goto error;
node_max = _x64_max_neighbors(graph);
assert(node_max);
- ret = scf_graph_delete_node(graph, node_max);
+ ret = scf_graph_del_node(graph, node_max);
if (ret < 0)
goto error;
node_max->color = -1;
const x64_rcg_node_t* rn1 = gn1->data;
const x64_rcg_node_t* rn0 = v0;
- if (rn0->dag_node || rn1->dag_node)
- return rn0->dag_node != rn1->dag_node;
+ if (rn0->dn || rn1->dn)
+ return rn0->dn != rn1->dn;
return rn0->reg != rn1->reg;
}
int x64_rcg_find_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg)
{
- x64_rcg_node_t* rn = calloc(1, sizeof(x64_rcg_node_t));
- if (!rn)
- return -ENOMEM;
-
- rn->dag_node = dn;
- rn->reg = reg;
+ x64_rcg_node_t tmp;
- scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, rn, _x64_rcg_node_cmp);
- free(rn);
- rn = NULL;
+ tmp.dn = dn;
+ tmp.reg = reg;
+ scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, &tmp, _x64_rcg_node_cmp);
if (!gn)
return -1;
return 0;
}
-int _x64_rcg_make_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg, scf_x64_OpCode_t* OpCode)
+int _x64_rcg_make_node(scf_graph_node_t** pp, scf_graph_t* g, scf_dag_node_t* dn, scf_register_t* reg)
{
- x64_rcg_node_t* rn = calloc(1, sizeof(x64_rcg_node_t));
- if (!rn)
- return -ENOMEM;
+ x64_rcg_node_t* rn;
+ x64_rcg_node_t tmp;
- rn->dag_node = dn;
- rn->reg = reg;
- rn->OpCode = OpCode;
+ tmp.dn = dn;
+ tmp.reg = reg;
- scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, rn, _x64_rcg_node_cmp);
+ scf_graph_node_t* gn = scf_vector_find_cmp(g->nodes, &tmp, _x64_rcg_node_cmp);
if (!gn) {
+ rn = calloc(1, sizeof(x64_rcg_node_t));
+ if (!rn)
+ return -ENOMEM;
gn = scf_graph_node_alloc();
if (!gn) {
return -ENOMEM;
}
+ rn->dn = dn;
+ rn->reg = reg;
gn->data = rn;
if (reg)
} else {
if (reg)
gn->color = reg->color;
-
- free(rn);
- rn = NULL;
}
*pp = gn;
if (!ds0->active)
continue;
- ret = _x64_rcg_make_node(&gn0, g, dn0, NULL, NULL);
+ ret = _x64_rcg_make_node(&gn0, g, dn0, NULL);
if (ret < 0)
return ret;
if (!ds1->active)
continue;
- ret = _x64_rcg_make_node(&gn1, g, dn1, NULL, NULL);
+ ret = _x64_rcg_make_node(&gn1, g, dn1, NULL);
if (ret < 0)
return ret;
if (scf_variable_const(dn0->var))
continue;
- int ret = _x64_rcg_make_node(&gn0, g, dn0, NULL, NULL);
+ int ret = _x64_rcg_make_node(&gn0, g, dn0, NULL);
if (ret < 0)
return ret;
if (scf_variable_const(dn1->var))
continue;
- ret = _x64_rcg_make_node(&gn1, g, dn1, NULL, NULL);
+ ret = _x64_rcg_make_node(&gn1, g, dn1, NULL);
if (ret < 0)
return ret;
if (!ds1->active)
continue;
- ret = _x64_rcg_make_node(&gn1, g, dn1, NULL, NULL);
+ ret = _x64_rcg_make_node(&gn1, g, dn1, NULL);
if (ret < 0)
return ret;
int i;
if (dn || reg) {
- ret = _x64_rcg_make_node(&gn0, g, dn, reg, OpCode);
+ ret = _x64_rcg_make_node(&gn0, g, dn, reg);
if (ret < 0) {
scf_loge("\n");
return ret;
r = NULL;
gn = NULL;
- ret = _x64_rcg_make_node(&gn, g, dn, r, NULL);
+ ret = _x64_rcg_make_node(&gn, g, dn, r);
if (ret < 0) {
scf_loge("\n");
return ret;
continue;
gn = NULL;
- ret = _x64_rcg_make_node(&gn, g, dn, dn->rabi2, NULL);
+ ret = _x64_rcg_make_node(&gn, g, dn, dn->rabi2);
if (ret < 0) {
scf_loge("\n");
return ret;
if (!dn_pf->var->const_literal_flag) {
- ret = _x64_rcg_make_node(&gn_pf, g, dn_pf, NULL, NULL);
+ ret = _x64_rcg_make_node(&gn_pf, g, dn_pf, NULL);
if (ret < 0) {
scf_loge("\n");
return ret;
rabi = x64_find_register_type_id_bytes(0, x64_abi_regs[i], dn_pf->var->size);
- ret = _x64_rcg_make_node(&gn_rabi, g, NULL, rabi, NULL);
+ ret = _x64_rcg_make_node(&gn_rabi, g, NULL, rabi);
if (ret < 0) {
scf_loge("\n");
return ret;
if (scf_variable_const(count->dag_node->var))
return _x64_rcg_make(c, g, dn, NULL, NULL);
- int ret = _x64_rcg_make_node(&gn, g, count->dag_node, cl, NULL);
+ int ret = _x64_rcg_make_node(&gn, g, count->dag_node, cl);
if (ret < 0)
return ret;
if (ret < 0)
return ret;
- ret = _x64_rcg_make_node(&gn_cl, g, NULL, cl, NULL);
+ ret = _x64_rcg_make_node(&gn_cl, g, NULL, cl);
if (ret < 0)
return ret;
if (dn) {
- ret = _x64_rcg_make_node(&gn, g, dn, NULL, NULL);
+ ret = _x64_rcg_make_node(&gn, g, dn, NULL);
if (ret < 0)
return ret;
scf_3ac_operand_t* src = c->srcs->data[i];
scf_graph_node_t* gn_src = NULL;
- ret = _x64_rcg_make_node(&gn_src, g, src->dag_node, NULL, NULL);
+ ret = _x64_rcg_make_node(&gn_src, g, src->dag_node, NULL);
if (ret < 0)
return ret;
} else
r = x64_find_register_type_id_bytes(is_float, x64_abi_ret_regs[i], size);
- ret = _x64_rcg_make_node(&gn, g, dn, r, NULL);
+ ret = _x64_rcg_make_node(&gn, g, dn, r);
if (ret < 0)
return ret;
}
else
return -EINVAL;
- ret = _x64_rcg_make_node(&gn, g, dn, r, NULL);
+ ret = _x64_rcg_make_node(&gn, g, dn, r);
if (ret < 0)
return ret;
}
scf_graph_node_t* neighbor = neighbors->data[j];
x64_rcg_node_t* rn = neighbor->data;
- if (rn->dag_node) {
- if (rn->dag_node->color <= 0)
+ if (rn->dn) {
+ if (rn->dn->color <= 0)
continue;
- if (X64_COLOR_CONFLICT(r->color, rn->dag_node->color))
+ if (X64_COLOR_CONFLICT(r->color, rn->dn->color))
break;
} else {
assert(rn->reg);
graph->nodes = scf_vector_alloc();
if (!graph->nodes) {
free(graph);
- graph = NULL;
return NULL;
}
+
return graph;
}
void scf_graph_free(scf_graph_t* graph)
{
if (graph) {
- int i;
- for (i = 0; i < graph->nodes->size; i++) {
-
- scf_graph_node_t* node = graph->nodes->data[i];
-
- scf_graph_node_free(node);
- }
-
- scf_vector_free(graph->nodes);
+ scf_vector_clear(graph->nodes, ( void (*)(void*) )scf_graph_node_free);
+ scf_vector_free (graph->nodes);
free(graph);
- graph = NULL;
}
}
node->neighbors = scf_vector_alloc();
if (!node->neighbors) {
free(node);
- node = NULL;
return NULL;
}
+
return node;
}
if (node) {
scf_vector_free(node->neighbors);
free(node);
- node = NULL;
}
}
{
if (node) {
printf("node: %p, color: %d\n", node, (int)node->color);
+
+ scf_graph_node_t* neighbor;
int j;
+
for (j = 0; j < node->neighbors->size; j++) {
- scf_graph_node_t* neighbor = node->neighbors->data[j];
+ neighbor = node->neighbors->data[j];
+
printf("neighbor: %p, color: %d\n", neighbor, (int)neighbor->color);
}
+
printf("\n");
}
}
return scf_vector_add(node1->neighbors, node2);
}
-int scf_graph_delete_node(scf_graph_t* graph, scf_graph_node_t* node)
+int scf_graph_del_node(scf_graph_t* graph, scf_graph_node_t* node)
{
if (!graph || !node)
return -EINVAL;
- scf_graph_node_t* neighbor;
+ scf_graph_node_t* neighbor;
int j;
for (j = 0; j < node->neighbors->size; j++) {
neighbor = node->neighbors->data[j];
- scf_logd("node %p, neighbor: %p, %d\n", node, neighbor, neighbor->neighbors->size);
-
// it may be not 2 side graph
scf_vector_del(neighbor->neighbors, node);
}
- if (0 != scf_vector_del(graph->nodes, node))
- return -1;
- return 0;
+ return scf_vector_del(graph->nodes, node);
}
int scf_graph_add_node(scf_graph_t* graph, scf_graph_node_t* node)
{
+ scf_graph_node_t* neighbor;
int j;
- for (j = 0; j < node->neighbors->size; j++) {
-
- scf_graph_node_t* neighbor = node->neighbors->data[j];
-
- if (scf_vector_find(graph->nodes, neighbor)) {
-
- if (!scf_vector_find(neighbor->neighbors, node)) {
-
- if (0 != scf_vector_add(neighbor->neighbors, node))
- return -1;
- } else
- scf_logw("node %p already in neighbor: %p\n", node, neighbor);
- } else
- scf_logw("neighbor: %p of node: %p not in graph\n", neighbor, node);
- }
-
- if (0 != scf_vector_add(graph->nodes, node))
- return -1;
- return 0;
-}
-
-static int _kcolor_delete(scf_graph_t* graph, int k, scf_vector_t* deleted_nodes)
-{
- while (graph->nodes->size > 0) {
-
- int nb_deleted = 0;
- int i = 0;
- while (i < graph->nodes->size) {
-
- scf_graph_node_t* node = graph->nodes->data[i];
-
- if (node->neighbors->size >= k) {
- i++;
- continue;
- }
-
- if (0 != scf_graph_delete_node(graph, node)) {
- scf_loge("scf_graph_delete_node\n");
- return -1;
- }
-
- if (0 != scf_vector_add(deleted_nodes, node)) {
- scf_loge("scf_graph_delete_node\n");
- return -1;
- }
- nb_deleted++;
- }
-
- if (0 == nb_deleted)
- break;
- }
- return 0;
-}
-
-static int _kcolor_fill(scf_graph_t* graph, scf_vector_t* colors, scf_vector_t* deleted_nodes)
-{
- int k = colors->size;
- int i;
- int j;
- scf_vector_t* colors2 = NULL;
-
- for (i = deleted_nodes->size - 1; i >= 0; i--) {
- scf_graph_node_t* node = deleted_nodes->data[i];
-
- assert(node->neighbors->size < k);
-
- colors2 = scf_vector_clone(colors);
- if (!colors2)
- return -ENOMEM;
-
- scf_logd("node: %p, neighbor: %d, k: %d\n", node, node->neighbors->size, k);
-
- for (j = 0; j < node->neighbors->size; j++) {
- scf_graph_node_t* neighbor = node->neighbors->data[j];
-
- if (neighbor->color > 0)
- scf_vector_del(colors2, (void*)neighbor->color);
-
- if (0 != scf_vector_add(neighbor->neighbors, node))
- goto error;
- }
-
- assert(colors2->size >= 0);
- if (0 == colors2->size)
- goto error;
-
- node->color = (intptr_t)(colors2->data[0]);
- if (0 != scf_vector_add(graph->nodes, node))
- goto error;
-
- scf_vector_free(colors2);
- colors2 = NULL;
- }
-
- return 0;
-
-error:
- scf_vector_free(colors2);
- colors2 = NULL;
- return -1;
-}
-
-static int _kcolor_find_not_neighbor(scf_graph_t* graph, int k, scf_graph_node_t** pp0, scf_graph_node_t** pp1)
-{
- assert(graph->nodes->size >= k);
-
- int i;
- for (i = 0; i < graph->nodes->size; i++) {
- scf_graph_node_t* node0 = graph->nodes->data[i];
+ for (j = 0; j < node->neighbors->size; j++) {
+ neighbor = node->neighbors->data[j];
- if (node0->neighbors->size > k)
+ if (!scf_vector_find(graph->nodes, neighbor)) {
+ scf_logd("neighbor: %p of node: %p not in graph\n", neighbor, node);
continue;
-
- scf_graph_node_t* node1 = NULL;
- int j;
- for (j = i + 1; j < graph->nodes->size; j++) {
- node1 = graph->nodes->data[j];
-
- if (!scf_vector_find(node0->neighbors, node1)) {
- assert(!scf_vector_find(node1->neighbors, node0));
- break;
- }
-
- node1 = NULL;
- }
-
- if (node1) {
- *pp0 = node0;
- *pp1 = node1;
- return 0;
- }
- }
- return -1;
-}
-
-static scf_graph_node_t* _max_neighbors(scf_graph_t* graph)
-{
- scf_graph_node_t* node_max = NULL;
- int max = 0;
- int i;
- for (i = 0; i < graph->nodes->size; i++) {
- scf_graph_node_t* node = graph->nodes->data[i];
-
- if (!node_max || max < node->neighbors->size) {
- node_max = node;
- max = node->neighbors->size;
- }
- }
-
- scf_logi("max_neighbors: %d\n", max);
-
- return node_max;
-}
-
-int scf_graph_kcolor(scf_graph_t* graph, scf_vector_t* colors)
-{
- if (!graph || !colors || 0 == colors->size)
- return -EINVAL;
-
- int k = colors->size;
- int ret = -1;
-
- scf_vector_t* colors2 = NULL;
- scf_vector_t* deleted_nodes = scf_vector_alloc();
- if (!deleted_nodes)
- return -ENOMEM;
-
- scf_logd("graph->nodes->size: %d, k: %d\n", graph->nodes->size, k);
-
- ret = _kcolor_delete(graph, k, deleted_nodes);
- if (ret < 0)
- goto error;
-
- if (0 == graph->nodes->size) {
- ret = _kcolor_fill(graph, colors, deleted_nodes);
- if (ret < 0)
- goto error;
-
- scf_vector_free(deleted_nodes);
- deleted_nodes = NULL;
-
- scf_logd("graph->nodes->size: %d\n", graph->nodes->size);
- return 0;
- }
-
- assert(graph->nodes->size > 0);
- assert(graph->nodes->size >= k);
-
- scf_graph_node_t* node0 = NULL;
- scf_graph_node_t* node1 = NULL;
-
- if (0 == _kcolor_find_not_neighbor(graph, k, &node0, &node1)) {
- assert(node0);
- assert(node1);
-
- node0->color = (intptr_t)(colors->data[0]);
- node1->color = node0->color;
-
- ret = scf_graph_delete_node(graph, node0);
- if (ret < 0)
- goto error;
-
- ret = scf_graph_delete_node(graph, node1);
- if (ret < 0)
- goto error;
-
- assert(!colors2);
- colors2 = scf_vector_clone(colors);
- if (!colors2) {
- ret = -ENOMEM;
- goto error;
}
- ret = scf_vector_del(colors2, (void*)node0->color);
- if (ret < 0)
- goto error;
-
- ret = scf_graph_kcolor(graph, colors2);
- if (ret < 0)
- goto error;
-
- ret = scf_graph_add_node(graph, node0);
- if (ret < 0)
- goto error;
-
- ret = scf_graph_add_node(graph, node1);
- if (ret < 0)
- goto error;
-
- scf_vector_free(colors2);
- colors2 = NULL;
- } else {
- scf_graph_node_t* node_max = _max_neighbors(graph);
- assert(node_max);
-
- ret = scf_graph_delete_node(graph, node_max);
- if (ret < 0)
- goto error;
- node_max->color = -1;
-
- ret = scf_graph_kcolor(graph, colors);
- if (ret < 0)
- goto error;
+ if (scf_vector_find(neighbor->neighbors, node))
+ continue;
- ret = scf_graph_add_node(graph, node_max);
+ int ret = scf_vector_add(neighbor->neighbors, node);
if (ret < 0)
- goto error;
+ return ret;
}
- ret = _kcolor_fill(graph, colors, deleted_nodes);
- if (ret < 0)
- goto error;
-
- scf_vector_free(deleted_nodes);
- deleted_nodes = NULL;
-
- scf_logd("graph->nodes->size: %d\n", graph->nodes->size);
- return 0;
-
-error:
- if (colors2)
- scf_vector_free(colors2);
-
- scf_vector_free(deleted_nodes);
- return ret;
+ return scf_vector_add(graph->nodes, node);
}
-
#include"scf_vector.h"
typedef struct {
- scf_vector_t* neighbors;
+ scf_vector_t* neighbors;
intptr_t color;
- void* data;
+ void* data;
} scf_graph_node_t;
typedef struct {
- scf_vector_t* nodes;
+ scf_vector_t* nodes;
} scf_graph_t;
-scf_graph_t* scf_graph_alloc();
-void scf_graph_free(scf_graph_t* graph);
+scf_graph_t* scf_graph_alloc();
+void scf_graph_free(scf_graph_t* graph);
-scf_graph_node_t* scf_graph_node_alloc();
-void scf_graph_node_free(scf_graph_node_t* node);
-void scf_graph_node_print(scf_graph_node_t* node);
+scf_graph_node_t* scf_graph_node_alloc();
+void scf_graph_node_free (scf_graph_node_t* node);
+void scf_graph_node_print(scf_graph_node_t* node);
int scf_graph_make_edge(scf_graph_node_t* node1, scf_graph_node_t* node2);
-int scf_graph_delete_node(scf_graph_t* graph, scf_graph_node_t* node);
+int scf_graph_del_node(scf_graph_t* graph, scf_graph_node_t* node);
int scf_graph_add_node(scf_graph_t* graph, scf_graph_node_t* node);
// color = 0, not colored
int scf_graph_kcolor(scf_graph_t* graph, scf_vector_t* colors);
#endif
-