be_pbqp_alloc_env_t pbqp_alloc_env;
unsigned col;
unsigned row;
-
+ pbqp_matrix_t *ife_matrix;
+ num solution;
+#if KAPS_DUMP
+ FILE *file_before;
+#endif
#if TIMER
ir_timer_t *t_ra_pbqp_alloc_create = ir_timer_new();
ir_timer_t *t_ra_pbqp_alloc_solve = ir_timer_new();
/* create costs matrix template for interference edges */
- pbqp_matrix_t *ife_matrix = pbqp_matrix_alloc(pbqp_alloc_env.pbqp_inst, colors_n, colors_n);
+ ife_matrix = pbqp_matrix_alloc(pbqp_alloc_env.pbqp_inst, colors_n, colors_n);
/* set costs */
for (row = 0, col = 0; row < colors_n; row++, col++)
pbqp_matrix_set(ife_matrix, row, col, INF_COSTS);
#if KAPS_DUMP
// dump graph before solving pbqp
- FILE *file_before = my_open(env, "", "-pbqp_coloring.html");
+ file_before = my_open(env, "", "-pbqp_coloring.html");
set_dumpfile(pbqp_alloc_env.pbqp_inst, file_before);
#endif
- /* print out reverse perfect eleminiation order */
+ /* print out reverse perfect elimination order */
#if PRINT_RPEO
- plist_element_t *elements;
- foreach_plist(pbqp_alloc_env.rpeo, elements) {
- pbqp_node_t *node = elements->data;
- printf(" %d(%lu);", node->index, get_idx_irn(irg, node->index)->node_nr);
+ {
+ plist_element_t *elements;
+ foreach_plist(pbqp_alloc_env.rpeo, elements) {
+ pbqp_node_t *node = elements->data;
+ printf(" %d(%ld);", node->index, get_idx_irn(irg, node->index)->node_nr);
+ }
+ printf("\n");
}
- printf("\n");
#endif
/* solve pbqp instance */
#endif
- num solution = get_solution(pbqp_alloc_env.pbqp_inst);
+ solution = get_solution(pbqp_alloc_env.pbqp_inst);
if (solution == INF_COSTS)
panic("No PBQP solution found");
ir_mode *mode_gp = mode_Iu;
if (!layout->sp_relative) {
- layout->initial_bias = -4;
-
/* push ebp */
ir_node *mem = get_irg_initial_mem(irg);
ir_node *noreg = ia32_new_NoReg_gp(irg);
ir_node *initial_bp = be_abi_get_ignore_irn(irg, bp);
ir_node *curr_bp = initial_bp;
- ir_node *push
- = new_bd_ia32_Push(NULL, block, noreg, noreg, mem, curr_bp, curr_sp);
+ ir_node *push = new_bd_ia32_Push(NULL, block, noreg, noreg, mem, curr_bp, curr_sp);
+ ir_node *incsp;
+
curr_sp = new_r_Proj(push, mode_gp, pn_ia32_Push_stack);
mem = new_r_Proj(push, mode_M, pn_ia32_Push_M);
arch_set_irn_register(curr_sp, sp);
edges_reroute(initial_bp, curr_bp);
set_irn_n(push, n_ia32_Push_val, initial_bp);
- ir_node *incsp = be_new_IncSP(sp, block, curr_sp, frame_size, 0);
+ incsp = be_new_IncSP(sp, block, curr_sp, frame_size, 0);
edges_reroute(initial_sp, incsp);
set_irn_n(push, n_ia32_Push_stack, initial_sp);
sched_add_after(curr_sp, incsp);
+
+ layout->initial_bias = -4;
} else {
ir_node *incsp = be_new_IncSP(sp, block, curr_sp, frame_size, 0);
edges_reroute(initial_sp, incsp);
static void dump_vector(FILE *f, vector_t *vec)
{
unsigned index;
+ unsigned len = vec->len;
fprintf(f, "<span class=\"vector\">( ");
- unsigned len = vec->len;
assert(len > 0);
for (index = 0; index < len; ++index) {
#if KAPS_ENABLE_VECTOR_NAMES
fputs("<p>", pbqp->dump_file);
for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
pbqp_node_t *src_node = get_node(pbqp, src_index);
+ unsigned edge_index;
+ unsigned len;
if (!src_node)
continue;
- unsigned edge_index;
- unsigned len = ARR_LEN(src_node->edges);
+ len = ARR_LEN(src_node->edges);
for (edge_index = 0; edge_index < len; ++edge_index) {
pbqp_edge_t *edge = src_node->edges[edge_index];
unsigned tgt_index = edge->tgt->index;
for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
pbqp_node_t *node = get_node(pbqp, src_index);
+ unsigned len;
+ unsigned edge_index;
if (!node)
continue;
if (node_is_reduced(node))
continue;
- unsigned len = ARR_LEN(node->edges);
- unsigned edge_index;
+ len = ARR_LEN(node->edges);
for (edge_index = 0; edge_index < len; ++edge_index) {
pbqp_node_t *tgt_node = node->edges[edge_index]->tgt;
unsigned tgt_index = tgt_node->index;
{
int i;
int len;
+ pbqp_node_t *src_node;
+ pbqp_node_t *tgt_node;
if (tgt_index < src_index) {
unsigned tmp = src_index;
tgt_index = tmp;
}
- pbqp_node_t *src_node = get_node(pbqp, src_index);
- pbqp_node_t *tgt_node = get_node(pbqp, tgt_index);
+ src_node = get_node(pbqp, src_index);
+ tgt_node = get_node(pbqp, tgt_index);
assert(tgt_node);
len = ARR_LEN(src_node->edges);
pbqp_matrix_t *pbqp_matrix_alloc(pbqp_t *pbqp, unsigned rows, unsigned cols)
{
- assert(cols > 0);
- assert(rows > 0);
-
unsigned length = rows * cols;
-
pbqp_matrix_t *mat = (pbqp_matrix_t*)obstack_alloc(&pbqp->obstack, sizeof(*mat) + sizeof(*mat->entries) * length);
+ assert(cols > 0);
+ assert(rows > 0);
+
mat->cols = cols;
mat->rows = rows;
memset(mat->entries, 0, sizeof(*mat->entries) * length);
void pbqp_matrix_transpose(pbqp_t *pbqp, pbqp_matrix_t *mat)
{
unsigned len;
+ pbqp_matrix_t *tmp;
len = mat->rows * mat->cols;
- pbqp_matrix_t *tmp = pbqp_matrix_copy_and_transpose(pbqp, mat);
+ tmp = pbqp_matrix_copy_and_transpose(pbqp, mat);
memcpy(mat, tmp, sizeof(*mat) + sizeof(*mat->entries) * len);
unsigned row_index;
num min = INF_COSTS;
- assert(matrix->rows == flags->len);
-
unsigned col_len = matrix->cols;
unsigned row_len = matrix->rows;
+ assert(matrix->rows == flags->len);
+
for (row_index = 0; row_index < row_len; ++row_index) {
+ num elem;
+
/* Ignore virtual deleted columns. */
if (flags->entries[row_index].data == INF_COSTS) continue;
- num elem = matrix->entries[row_index * col_len + col_index];
+ elem = matrix->entries[row_index * col_len + col_index];
if (elem < min) {
min = elem;
unsigned min_index = 0;
num min = INF_COSTS;
- assert(matrix->rows == flags->len);
-
unsigned col_len = matrix->cols;
unsigned row_len = matrix->rows;
+ assert(matrix->rows == flags->len);
+
for (row_index = 0; row_index < row_len; ++row_index) {
+ num elem;
+
/* Ignore virtual deleted columns. */
if (flags->entries[row_index].data == INF_COSTS) continue;
- num elem = matrix->entries[row_index * col_len + col_index];
+ elem = matrix->entries[row_index * col_len + col_index];
if (elem < min) {
min = elem;
unsigned col_index;
num min = INF_COSTS;
- assert(matrix->cols == flags->len);
-
unsigned len = flags->len;
+ assert(matrix->cols == len);
+
for (col_index = 0; col_index < len; ++col_index) {
+ num elem;
+
/* Ignore virtual deleted columns. */
if (flags->entries[col_index].data == INF_COSTS) continue;
- num elem = matrix->entries[row_index * len + col_index];
+ elem = matrix->entries[row_index * len + col_index];
if (elem < min) {
min = elem;
unsigned min_index = 0;
num min = INF_COSTS;
- assert(matrix->cols == flags->len);
-
unsigned len = flags->len;
+ assert(matrix->cols == len);
+
for (col_index = 0; col_index < len; ++col_index) {
+ num elem;
+
/* Ignore virtual deleted columns. */
if (flags->entries[col_index].data == INF_COSTS) continue;
- num elem = matrix->entries[row_index * len + col_index];
+ elem = matrix->entries[row_index * len + col_index];
if (elem < min) {
min = elem;
pbqp_matrix_t *tgt_mat;
pbqp_node_t *src_node;
pbqp_node_t *tgt_node;
+ pbqp_edge_t *edge;
pbqp_matrix_t *mat;
vector_t *vec;
vector_t *node_vec;
}
}
- pbqp_edge_t *edge = get_edge(pbqp, src_node->index, tgt_node->index);
+ edge = get_edge(pbqp, src_node->index, tgt_node->index);
/* Disconnect node. */
disconnect_edge(src_node, src_edge);
pbqp_matrix_t *costs)
{
int transpose = 0;
+ pbqp_edge_t *edge = OALLOC(&pbqp->obstack, pbqp_edge_t);
+ pbqp_node_t *src_node;
+ pbqp_node_t *tgt_node;
if (tgt_index < src_index) {
int tmp = src_index;
transpose = 1;
}
- pbqp_edge_t *edge = OALLOC(&pbqp->obstack, pbqp_edge_t);
-
- pbqp_node_t *src_node = get_node(pbqp, src_index);
+ src_node = get_node(pbqp, src_index);
- pbqp_node_t *tgt_node = get_node(pbqp, tgt_index);
+ tgt_node = get_node(pbqp, tgt_index);
if (transpose) {
edge->costs = pbqp_matrix_copy_and_transpose(pbqp, costs);
num pbqp_add(num x, num y)
{
+ num res;
+
if (x == INF_COSTS || y == INF_COSTS) return INF_COSTS;
- num res = x + y;
+ res = x + y;
#if !KAPS_USE_UNSIGNED
/* No positive overflow. */
vector_t *vector_alloc(pbqp_t *pbqp, unsigned length)
{
- assert(length > 0);
vector_t *vec = (vector_t*)obstack_alloc(&pbqp->obstack, sizeof(*vec) + sizeof(*vec->entries) * length);
+ assert(length > 0);
vec->len = length;
memset(vec->entries, 0, sizeof(*vec->entries) * length);