X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=pbqp_node.c;h=b324e49b359d99d53e624f0963e74d445034a827;hb=ed09bface18ba83118776d7a880250388aafe315;hp=cdfac42e37b22c9e4f95bcceac10b2dada786e2b;hpb=5f205ba41ab7ed78e487fe7d065c60a4359029b7;p=libfirm diff --git a/pbqp_node.c b/pbqp_node.c index cdfac42e3..b324e49b3 100644 --- a/pbqp_node.c +++ b/pbqp_node.c @@ -1,7 +1,36 @@ +/* + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +/** + * @file + * @brief PBQP nodes. + * @date 02.10.2008 + * @author Sebastian Buchwald + * @version $Id$ + */ +#include "config.h" + #include "adt/array.h" #include "assert.h" +#include "bucket.h" #include "pbqp_edge.h" #include "pbqp_edge_t.h" #include "pbqp_node.h" @@ -71,7 +100,7 @@ unsigned pbqp_node_get_degree(pbqp_node *node) return ARR_LEN(node->edges); } -pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node *node) +pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket new_bucket, pbqp_node *node) { unsigned edge_index; unsigned edge_length = pbqp_node_get_degree(node); @@ -81,13 +110,47 @@ pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node *node) copy->edges = NEW_ARR_F(pbqp_edge *, 0); for (edge_index = 0; edge_index < edge_length; ++edge_index) { pbqp_edge *edge_copy; - pbqp_edge *edge = node->edges[edge_index]; - int is_src = edge->src == node; + pbqp_edge *edge = node->edges[edge_index]; + int is_src = edge->src == node; if (is_src) { - edge_copy = pbqp_edge_deep_copy(pbqp, edge, copy, edge->tgt); + unsigned other_index = edge->tgt->bucket_index; + unsigned is_copied = other_index < node->bucket_index; + + if (is_copied) { + pbqp_node *other_copy = new_bucket[other_index]; + unsigned degree = pbqp_node_get_degree(other_copy); + unsigned index; + + for (index = 0; index < degree; ++index) { + if (other_copy->edges[index]->src == node) { + edge_copy = other_copy->edges[index]; + edge_copy->src = copy; + break; + } + } + } else { + edge_copy = pbqp_edge_deep_copy(pbqp, edge, copy, edge->tgt); + } } else { - edge_copy = pbqp_edge_deep_copy(pbqp, edge, edge->src, copy); + unsigned other_index = edge->src->bucket_index; + unsigned is_copied = other_index < node->bucket_index; + + if (is_copied) { + pbqp_node *other_copy = new_bucket[other_index]; + unsigned degree = pbqp_node_get_degree(other_copy); + unsigned index; + + for (index = 0; index < degree; ++index) { + if (other_copy->edges[index]->tgt == node) { + edge_copy = other_copy->edges[index]; + edge_copy->tgt = copy; + break; + } + } + } else { + edge_copy = pbqp_edge_deep_copy(pbqp, edge, edge->src, copy); + } } ARR_APP1(pbqp_edge *, copy->edges, edge_copy); } @@ -96,5 +159,5 @@ pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node *node) copy->solution = node->solution; copy->index = node->index; - return node; + return copy; }