bearch: Dump the output requirement and the assigned register in the same line for...
[libfirm] / ir / kaps / optimal.c
index fe82844..802534c 100644 (file)
@@ -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:<br>\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("<br>\nOutput:<br>\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<br>\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<br>\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<br>\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<br>\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("<br>\nBefore reduction:<br>\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("<br>\nAfter reduction:<br>\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("<br>\nBefore reduction:<br>\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("<br>\nAfter reduction:<br>\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);