X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=optimal.c;h=c4ea1c1064450b325abb3bf3216173bb73a3339d;hb=c54176dc094374c8a913a92d81272dd0f5ad6f6a;hp=b5e834df84ccd3f6daae387db439024c9084b920;hpb=f71a8c8d50158b15b1932a99270b0470670dd2e6;p=libfirm diff --git a/optimal.c b/optimal.c index b5e834df8..c4ea1c106 100644 --- 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)