X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fkaps%2Foptimal.c;h=802534c589e22e653ba10f93d2290502aa86ee16;hb=2b84102b8f003a13d083330fbc6aaff92b6563e9;hp=fe82844fff96f5b1b36cf3c3defad657b0996db2;hpb=1a3b7d363474ab544c13093a2f0b578718d37c7a;p=libfirm diff --git a/ir/kaps/optimal.c b/ir/kaps/optimal.c index fe82844ff..802534c58 100644 --- a/ir/kaps/optimal.c +++ b/ir/kaps/optimal.c @@ -22,7 +22,6 @@ * @brief Optimal reductions and helper functions. * @date 28.12.2009 * @author Sebastian Buchwald - * @version $Id$ */ #include "config.h" @@ -31,7 +30,7 @@ #include "error.h" #include "bucket.h" -#if KAPS_DUMP +#if KAPS_DUMP #include "html_dumper.h" #endif #include "kaps.h" @@ -47,7 +46,7 @@ #include "timing.h" pbqp_edge_t **edge_bucket; -pbqp_edge_t **rm_bucket; +static pbqp_edge_t **rm_bucket; pbqp_node_t **node_buckets[4]; pbqp_node_t **reduced_bucket = NULL; pbqp_node_t *merged_node = NULL; @@ -106,7 +105,6 @@ void fill_node_buckets(pbqp_t *pbqp) unsigned node_index; unsigned node_len; - assert(pbqp); node_len = pbqp->num_nodes; #if KAPS_TIMING @@ -150,17 +148,11 @@ static void normalize_towards_source(pbqp_edge_t *edge) unsigned src_index; unsigned new_infinity = 0; - assert(edge); - src_node = edge->src; tgt_node = edge->tgt; - assert(src_node); - assert(tgt_node); src_vec = src_node->costs; tgt_vec = tgt_node->costs; - assert(src_vec); - assert(tgt_vec); src_len = src_vec->len; tgt_len = tgt_vec->len; @@ -168,7 +160,6 @@ static void normalize_towards_source(pbqp_edge_t *edge) assert(tgt_len > 0); mat = edge->costs; - assert(mat); /* Normalize towards source node. */ for (src_index = 0; src_index < src_len; ++src_index) { @@ -216,17 +207,11 @@ static void normalize_towards_target(pbqp_edge_t *edge) unsigned tgt_index; unsigned new_infinity = 0; - assert(edge); - src_node = edge->src; tgt_node = edge->tgt; - assert(src_node); - assert(tgt_node); src_vec = src_node->costs; tgt_vec = tgt_node->costs; - assert(src_vec); - assert(tgt_vec); src_len = src_vec->len; tgt_len = tgt_vec->len; @@ -234,7 +219,6 @@ static void normalize_towards_target(pbqp_edge_t *edge) assert(tgt_len > 0); mat = edge->costs; - assert(mat); /* Normalize towards target node. */ for (tgt_index = 0; tgt_index < tgt_len; ++tgt_index) { @@ -286,23 +270,15 @@ static void merge_source_into_target(pbqp_t *pbqp, pbqp_edge_t *edge) unsigned *mapping; unsigned src_len; unsigned tgt_len; - unsigned src_index; unsigned tgt_index; unsigned edge_index; unsigned edge_len; - assert(pbqp); - assert(edge); - src_node = edge->src; tgt_node = edge->tgt; - assert(src_node); - assert(tgt_node); src_vec = src_node->costs; tgt_vec = tgt_node->costs; - assert(src_vec); - assert(tgt_vec); src_len = src_vec->len; tgt_len = tgt_vec->len; @@ -312,13 +288,13 @@ static void merge_source_into_target(pbqp_t *pbqp, pbqp_edge_t *edge) assert(tgt_len > 1); mat = edge->costs; - assert(mat); mapping = NEW_ARR_F(unsigned, tgt_len); /* Check that each column has at most one zero entry. */ for (tgt_index = 0; tgt_index < tgt_len; ++tgt_index) { unsigned onlyOneZero = 0; + unsigned src_index; if (tgt_vec->entries[tgt_index].data == INF_COSTS) continue; @@ -348,11 +324,11 @@ static void merge_source_into_target(pbqp_t *pbqp, pbqp_edge_t *edge) pbqp->num_rm++; #endif -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { char txt[100]; sprintf(txt, "Merging n%d into n%d", src_node->index, tgt_node->index); - dump_section(pbqp->dump_file, 3, txt); + pbqp_dump_section(pbqp->dump_file, 3, txt); } #endif @@ -366,15 +342,12 @@ static void merge_source_into_target(pbqp_t *pbqp, pbqp_edge_t *edge) vector_t *other_vec; unsigned other_len; unsigned other_index; - unsigned tgt_index; assert(old_edge); - if (old_edge == edge) continue; old_matrix = old_edge->costs; - assert(old_matrix); if (old_edge->tgt == src_node) { other_node = old_edge->src; @@ -384,7 +357,6 @@ static void merge_source_into_target(pbqp_t *pbqp, pbqp_edge_t *edge) other_node = old_edge->tgt; other_len = old_matrix->cols; } - assert(other_node); other_vec = other_node->costs; new_matrix = pbqp_matrix_alloc(pbqp, tgt_len, other_len); @@ -461,22 +433,14 @@ static void merge_target_into_source(pbqp_t *pbqp, pbqp_edge_t *edge) unsigned src_len; unsigned tgt_len; unsigned src_index; - unsigned tgt_index; unsigned edge_index; unsigned edge_len; - assert(pbqp); - assert(edge); - src_node = edge->src; tgt_node = edge->tgt; - assert(src_node); - assert(tgt_node); src_vec = src_node->costs; tgt_vec = tgt_node->costs; - assert(src_vec); - assert(tgt_vec); src_len = src_vec->len; tgt_len = tgt_vec->len; @@ -486,13 +450,13 @@ static void merge_target_into_source(pbqp_t *pbqp, pbqp_edge_t *edge) assert(tgt_len > 1); mat = edge->costs; - assert(mat); mapping = NEW_ARR_F(unsigned, src_len); /* Check that each row has at most one zero entry. */ for (src_index = 0; src_index < src_len; ++src_index) { unsigned onlyOneZero = 0; + unsigned tgt_index; if (src_vec->entries[src_index].data == INF_COSTS) continue; @@ -522,11 +486,11 @@ static void merge_target_into_source(pbqp_t *pbqp, pbqp_edge_t *edge) pbqp->num_rm++; #endif -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { char txt[100]; sprintf(txt, "Merging n%d into n%d", tgt_node->index, src_node->index); - dump_section(pbqp->dump_file, 3, txt); + pbqp_dump_section(pbqp->dump_file, 3, txt); } #endif @@ -540,7 +504,6 @@ static void merge_target_into_source(pbqp_t *pbqp, pbqp_edge_t *edge) vector_t *other_vec; unsigned other_len; unsigned other_index; - unsigned src_index; assert(old_edge); @@ -548,7 +511,6 @@ static void merge_target_into_source(pbqp_t *pbqp, pbqp_edge_t *edge) continue; old_matrix = old_edge->costs; - assert(old_matrix); if (old_edge->tgt == tgt_node) { other_node = old_edge->src; @@ -558,7 +520,6 @@ static void merge_target_into_source(pbqp_t *pbqp, pbqp_edge_t *edge) other_node = old_edge->tgt; other_len = old_matrix->cols; } - assert(other_node); other_vec = other_node->costs; new_matrix = pbqp_matrix_alloc(pbqp, src_len, other_len); @@ -627,9 +588,6 @@ void apply_RM(pbqp_t *pbqp, pbqp_node_t *node) unsigned edge_index; unsigned edge_len; - assert(node); - assert(pbqp); - edges = node->edges; edge_len = pbqp_node_get_degree(node); @@ -643,7 +601,6 @@ void apply_RM(pbqp_t *pbqp, pbqp_node_t *node) /* ALAP: Merge neighbors into given node. */ while(edge_bucket_get_length(rm_bucket) > 0) { pbqp_edge_t *edge = edge_bucket_pop(&rm_bucket); - assert(edge); /* If the edge is not deleted: Try a merge. */ if (edge->src == node) @@ -701,9 +658,6 @@ void simplify_edge(pbqp_t *pbqp, pbqp_edge_t *edge) int src_len; int tgt_len; - assert(pbqp); - assert(edge); - (void) pbqp; src_node = edge->src; @@ -715,18 +669,16 @@ void simplify_edge(pbqp_t *pbqp, pbqp_edge_t *edge) if (is_deleted(edge)) return; -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { char txt[100]; sprintf(txt, "Simplification of Edge n%d-n%d", src_node->index, tgt_node->index); - dump_section(pbqp->dump_file, 3, txt); + pbqp_dump_section(pbqp->dump_file, 3, txt); } #endif src_vec = src_node->costs; tgt_vec = tgt_node->costs; - assert(src_vec); - assert(tgt_vec); src_len = src_vec->len; tgt_len = tgt_vec->len; @@ -734,27 +686,26 @@ void simplify_edge(pbqp_t *pbqp, pbqp_edge_t *edge) assert(tgt_len > 0); mat = edge->costs; - assert(mat); -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { fputs("Input:
\n", pbqp->dump_file); - dump_simplifyedge(pbqp, edge); + pbqp_dump_simplifyedge(pbqp, edge); } #endif normalize_towards_source(edge); normalize_towards_target(edge); -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { fputs("
\nOutput:
\n", pbqp->dump_file); - dump_simplifyedge(pbqp, edge); + pbqp_dump_simplifyedge(pbqp, edge); } #endif if (pbqp_matrix_is_zero(mat, src_vec, tgt_vec)) { -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { fputs("edge has been eliminated
\n", pbqp->dump_file); } @@ -773,17 +724,15 @@ void initial_simplify_edges(pbqp_t *pbqp) unsigned node_index; unsigned node_len; - assert(pbqp); - #if KAPS_TIMING ir_timer_t *t_int_simpl = ir_timer_new(); ir_timer_start(t_int_simpl); #endif -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { pbqp_dump_input(pbqp); - dump_section(pbqp->dump_file, 1, "2. Simplification of Cost Matrices"); + pbqp_dump_section(pbqp->dump_file, 1, "2. Simplification of Cost Matrices"); } #endif @@ -830,20 +779,18 @@ num determine_solution(pbqp_t *pbqp) ir_timer_reset_and_start(t_det_solution); #endif -#if KAPS_DUMP +#if KAPS_DUMP FILE *file; #endif - assert(pbqp); - (void) pbqp; -#if KAPS_DUMP +#if KAPS_DUMP file = pbqp->dump_file; if (file) { - dump_section(file, 1, "4. Determine Solution/Minimum"); - dump_section(file, 2, "4.1. Trivial Solution"); + pbqp_dump_section(file, 1, "4. Determine Solution/Minimum"); + pbqp_dump_section(file, 2, "4.1. Trivial Solution"); } #endif @@ -856,23 +803,22 @@ num determine_solution(pbqp_t *pbqp) for (node_index = 0; node_index < node_len; ++node_index) { pbqp_node_t *node = node_buckets[0][node_index]; - assert(node); node->solution = vector_get_min_index(node->costs); solution = pbqp_add(solution, node->costs->entries[node->solution].data); -#if KAPS_DUMP +#if KAPS_DUMP if (file) { fprintf(file, "node n%d is set to %d
\n", node->index, node->solution); - dump_node(file, node); + pbqp_dump_node(file, node); } #endif } -#if KAPS_DUMP +#if KAPS_DUMP if (file) { - dump_section(file, 2, "Minimum"); + pbqp_dump_section(file, 2, "Minimum"); #if KAPS_USE_UNSIGNED fprintf(file, "Minimum is equal to %u.", solution); #else @@ -896,10 +842,6 @@ static void back_propagate_RI(pbqp_t *pbqp, pbqp_node_t *node) pbqp_matrix_t *mat; vector_t *vec; int is_src; - - assert(pbqp); - assert(node); - (void) pbqp; edge = node->edges[0]; @@ -909,17 +851,13 @@ static void back_propagate_RI(pbqp_t *pbqp, pbqp_node_t *node) if (is_src) { other = edge->tgt; - assert(other); - node->solution = pbqp_matrix_get_col_min_index(mat, other->solution, vec); } else { other = edge->src; - assert(other); - node->solution = pbqp_matrix_get_row_min_index(mat, other->solution, vec); } -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { fprintf(pbqp->dump_file, "node n%d is set to %d
\n", node->index, node->solution); } @@ -941,8 +879,6 @@ static void back_propagate_RII(pbqp_t *pbqp, pbqp_node_t *node) unsigned col_index; unsigned row_index; - assert(pbqp); - if (src_is_src) { src_node = src_edge->tgt; } else { @@ -996,7 +932,7 @@ static void back_propagate_RII(pbqp_t *pbqp, pbqp_node_t *node) node->solution = vector_get_min_index(vec); -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { fprintf(pbqp->dump_file, "node n%d is set to %d
\n", node->index, node->solution); } @@ -1010,11 +946,9 @@ void back_propagate(pbqp_t *pbqp) unsigned node_index; unsigned node_len = node_bucket_get_length(reduced_bucket); - assert(pbqp); - -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { - dump_section(pbqp->dump_file, 2, "Back Propagation"); + pbqp_dump_section(pbqp->dump_file, 2, "Back Propagation"); } #endif @@ -1030,7 +964,6 @@ void back_propagate(pbqp_t *pbqp) break; default: panic("Only nodes with degree one or two should be in this bucket"); - break; } } } @@ -1050,7 +983,7 @@ void apply_RI(pbqp_t *pbqp) int is_src = edge->src == node; pbqp_node_t *other_node; - (void ) pbqp; + (void) pbqp; assert(pbqp_node_get_degree(node) == 1); if (is_src) { @@ -1059,16 +992,16 @@ void apply_RI(pbqp_t *pbqp) other_node = edge->src; } -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { char txt[100]; sprintf(txt, "RI-Reduction of Node n%d", node->index); - dump_section(pbqp->dump_file, 2, txt); + pbqp_dump_section(pbqp->dump_file, 2, txt); pbqp_dump_graph(pbqp); fputs("
\nBefore reduction:
\n", pbqp->dump_file); - dump_node(pbqp->dump_file, node); - dump_node(pbqp->dump_file, other_node); - dump_edge(pbqp->dump_file, edge); + pbqp_dump_node(pbqp->dump_file, node); + pbqp_dump_node(pbqp->dump_file, other_node); + pbqp_dump_edge(pbqp->dump_file, edge); } #endif @@ -1081,10 +1014,10 @@ void apply_RI(pbqp_t *pbqp) } disconnect_edge(other_node, edge); -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { fputs("
\nAfter reduction:
\n", pbqp->dump_file); - dump_node(pbqp->dump_file, other_node); + pbqp_dump_node(pbqp->dump_file, other_node); } #endif @@ -1109,6 +1042,7 @@ void apply_RII(pbqp_t *pbqp) 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; @@ -1118,9 +1052,7 @@ void apply_RII(pbqp_t *pbqp) unsigned col_len; unsigned row_index; unsigned row_len; - unsigned node_len; - assert(pbqp); assert(pbqp_node_get_degree(node) == 2); if (src_is_src) { @@ -1152,18 +1084,18 @@ void apply_RII(pbqp_t *pbqp) tgt_is_src = tgt_edge->src == node; } -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { char txt[100]; sprintf(txt, "RII-Reduction of Node n%d", node->index); - dump_section(pbqp->dump_file, 2, txt); + pbqp_dump_section(pbqp->dump_file, 2, txt); pbqp_dump_graph(pbqp); fputs("
\nBefore reduction:
\n", pbqp->dump_file); - dump_node(pbqp->dump_file, src_node); - dump_edge(pbqp->dump_file, src_edge); - dump_node(pbqp->dump_file, node); - dump_edge(pbqp->dump_file, tgt_edge); - dump_node(pbqp->dump_file, tgt_node); + pbqp_dump_node(pbqp->dump_file, src_node); + pbqp_dump_edge(pbqp->dump_file, src_edge); + pbqp_dump_node(pbqp->dump_file, node); + pbqp_dump_edge(pbqp->dump_file, tgt_edge); + pbqp_dump_node(pbqp->dump_file, tgt_node); } #endif @@ -1176,7 +1108,6 @@ void apply_RII(pbqp_t *pbqp) row_len = src_vec->len; col_len = tgt_vec->len; - node_len = node_vec->len; mat = pbqp_matrix_alloc(pbqp, row_len, col_len); @@ -1202,7 +1133,7 @@ void apply_RII(pbqp_t *pbqp) } } - 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); @@ -1228,10 +1159,10 @@ void apply_RII(pbqp_t *pbqp) reorder_node_after_edge_deletion(tgt_node); } -#if KAPS_DUMP +#if KAPS_DUMP if (pbqp->dump_file) { fputs("
\nAfter reduction:
\n", pbqp->dump_file); - dump_edge(pbqp->dump_file, edge); + pbqp_dump_edge(pbqp->dump_file, edge); } #endif @@ -1251,17 +1182,11 @@ static void select_column(pbqp_edge_t *edge, unsigned col_index) unsigned src_index; unsigned new_infinity = 0; - assert(edge); - src_node = edge->src; tgt_node = edge->tgt; - assert(src_node); - assert(tgt_node); src_vec = src_node->costs; tgt_vec = tgt_node->costs; - assert(src_vec); - assert(tgt_vec); src_len = src_vec->len; tgt_len = tgt_vec->len; @@ -1269,7 +1194,6 @@ static void select_column(pbqp_edge_t *edge, unsigned col_index) assert(tgt_len > 0); mat = edge->costs; - assert(mat); for (src_index = 0; src_index < src_len; ++src_index) { num elem = mat->entries[src_index * tgt_len + col_index]; @@ -1302,27 +1226,20 @@ static void select_column(pbqp_edge_t *edge, unsigned col_index) static void select_row(pbqp_edge_t *edge, unsigned row_index) { pbqp_matrix_t *mat; - pbqp_node_t *src_node; pbqp_node_t *tgt_node; vector_t *tgt_vec; unsigned tgt_len; unsigned tgt_index; unsigned new_infinity = 0; - assert(edge); - - src_node = edge->src; tgt_node = edge->tgt; - assert(tgt_node); tgt_vec = tgt_node->costs; - assert(tgt_vec); tgt_len = tgt_vec->len; assert(tgt_len > 0); mat = edge->costs; - assert(mat); for (tgt_index = 0; tgt_index < tgt_len; ++tgt_index) { num elem = mat->entries[row_index * tgt_len + tgt_index]; @@ -1360,7 +1277,6 @@ void select_alternative(pbqp_node_t *node, unsigned selected_index) vector_t *node_vec; unsigned max_degree = pbqp_node_get_degree(node); - assert(node); node->solution = selected_index; node_vec = node->costs; node_len = node_vec->len; @@ -1419,8 +1335,6 @@ unsigned get_local_minimal_alternative(pbqp_t *pbqp, pbqp_node_t *node) num min = INF_COSTS; int is_src; - assert(pbqp); - assert(node); node_vec = node->costs; node_len = node_vec->len; max_degree = pbqp_node_get_degree(node);