Rename reorder_node to reorder_node_after_edge_deletion.
[libfirm] / optimal.c
index b5e834d..c4ea1c1 100644 (file)
--- a/optimal.c
+++ b/optimal.c
@@ -50,7 +50,8 @@ pbqp_edge **edge_bucket;
 pbqp_edge **rm_bucket;
 pbqp_node **node_buckets[4];
 pbqp_node **reduced_bucket = NULL;
-static int         buckets_filled = 0;
+pbqp_node  *merged_node = NULL;
+static int  buckets_filled = 0;
 
 static void insert_into_edge_bucket(pbqp_edge *edge)
 {
@@ -416,16 +417,11 @@ static void merge_source_into_target(pbqp *pbqp, pbqp_edge *edge)
                add_edge_costs(pbqp, tgt_node->index, other_node->index, new_matrix);
 
                delete_edge(old_edge);
-               reorder_node(src_node);
-               reorder_node(other_node);
 
                new_edge = get_edge(pbqp, tgt_node->index, other_node->index);
                insert_into_rm_bucket(new_edge);
        }
 
-       /* Reduce the remaining source node via RI. */
-       apply_RI(pbqp);
-
 #if KAPS_STATISTIC
        pbqp->num_r1--;
 #endif
@@ -578,16 +574,11 @@ static void merge_target_into_source(pbqp *pbqp, pbqp_edge *edge)
                add_edge_costs(pbqp, src_node->index, other_node->index, new_matrix);
 
                delete_edge(old_edge);
-               reorder_node(tgt_node);
-               reorder_node(other_node);
 
                new_edge = get_edge(pbqp, src_node->index, other_node->index);
                insert_into_rm_bucket(new_edge);
        }
 
-       /* Reduce the remaining source node via RI. */
-       apply_RI(pbqp);
-
 #if KAPS_STATISTIC
        pbqp->num_r1--;
 #endif
@@ -625,9 +616,11 @@ void apply_RM(pbqp *pbqp, pbqp_node *node)
                else
                        merge_source_into_target(pbqp, edge);
        }
+
+       merged_node = node;
 }
 
-void reorder_node(pbqp_node *node)
+void reorder_node_after_edge_deletion(pbqp_node *node)
 {
        unsigned    degree     = pbqp_node_get_degree(node);
        /* Assume node lost one incident edge. */
@@ -638,12 +631,6 @@ void reorder_node(pbqp_node *node)
        /* Same bucket as before */
        if (degree > 2) return;
 
-       if (!node_bucket_contains(node_buckets[old_degree], node)) {
-               /* Old arity is new arity, so we have nothing to do. */
-               assert(node_bucket_contains(node_buckets[degree], node));
-               return;
-       }
-
        /* Delete node from old bucket... */
        node_bucket_remove(&node_buckets[old_degree], node);
 
@@ -672,7 +659,7 @@ void simplify_edge(pbqp *pbqp, pbqp_edge *edge)
        assert(tgt_node);
 
        /* If edge are already deleted, we have nothing to do. */
-       if (!is_connected(src_node, edge) || !is_connected(tgt_node, edge))
+       if (is_deleted(edge))
                return;
 
 #if    KAPS_DUMP
@@ -725,8 +712,6 @@ void simplify_edge(pbqp *pbqp, pbqp_edge *edge)
 #endif
 
                delete_edge(edge);
-               reorder_node(src_node);
-               reorder_node(tgt_node);
        }
 }
 
@@ -1050,7 +1035,7 @@ void apply_RI(pbqp *pbqp)
        }
 #endif
 
-       reorder_node(other_node);
+       reorder_node_after_edge_deletion(other_node);
 
 #if KAPS_STATISTIC
        pbqp->num_r1++;
@@ -1186,8 +1171,8 @@ void apply_RII(pbqp *pbqp)
                /* Free local matrix. */
                obstack_free(&pbqp->obstack, mat);
 
-               reorder_node(src_node);
-               reorder_node(tgt_node);
+               reorder_node_after_edge_deletion(src_node);
+               reorder_node_after_edge_deletion(tgt_node);
        }
 
 #if    KAPS_DUMP
@@ -1259,8 +1244,6 @@ static void select_column(pbqp_edge *edge, unsigned col_index)
        }
 
        delete_edge(edge);
-       reorder_node(src_node);
-       reorder_node(tgt_node);
 }
 
 static void select_row(pbqp_edge *edge, unsigned row_index)
@@ -1314,8 +1297,6 @@ static void select_row(pbqp_edge *edge, unsigned row_index)
        }
 
        delete_edge(edge);
-       reorder_node(src_node);
-       reorder_node(tgt_node);
 }
 
 void select_alternative(pbqp_node *node, unsigned selected_index)