projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use other mechanism to determine whether an edge is already copied or not.
[libfirm]
/
kaps.c
diff --git
a/kaps.c
b/kaps.c
index
3162c24
..
5776493
100644
(file)
--- a/
kaps.c
+++ b/
kaps.c
@@
-19,18
+19,21
@@
pbqp_edge *get_edge(pbqp *pbqp, unsigned src_index, unsigned tgt_index)
int len;
if (tgt_index < src_index) {
int len;
if (tgt_index < src_index) {
- return get_edge(pbqp, tgt_index, src_index);
+ unsigned tmp = src_index;
+ src_index = tgt_index;
+ tgt_index = tmp;
}
pbqp_node *src_node = get_node(pbqp, src_index);
}
pbqp_node *src_node = get_node(pbqp, src_index);
+ pbqp_node *tgt_node = get_node(pbqp, tgt_index);
assert(src_node);
assert(src_node);
- assert(
get_node(pbqp, tgt_index)
);
+ assert(
tgt_node
);
len = ARR_LEN(src_node->edges);
for (i = 0; i < len; ++i) {
pbqp_edge *cur_edge = src_node->edges[i];
len = ARR_LEN(src_node->edges);
for (i = 0; i < len; ++i) {
pbqp_edge *cur_edge = src_node->edges[i];
- if (cur_edge->tgt
->index == tgt_index
) {
+ if (cur_edge->tgt
== tgt_node
) {
return cur_edge;
}
}
return cur_edge;
}
}
@@
-46,8
+49,10
@@
pbqp *alloc_pbqp(unsigned number_nodes)
pbqp->solution = 0;
pbqp->num_nodes = number_nodes;
pbqp->solution = 0;
pbqp->num_nodes = number_nodes;
+ pbqp->dump_file = NULL;
pbqp->nodes = obstack_alloc(&pbqp->obstack, number_nodes
* sizeof(*pbqp->nodes));
pbqp->nodes = obstack_alloc(&pbqp->obstack, number_nodes
* sizeof(*pbqp->nodes));
+ memset(pbqp->nodes, 0, number_nodes * sizeof(*pbqp->nodes));
return pbqp;
}
return pbqp;
}
@@
-75,6
+80,12
@@
void add_edge_costs(pbqp *pbqp, unsigned src_index, unsigned tgt_index,
{
pbqp_edge *edge = get_edge(pbqp, src_index, tgt_index);
{
pbqp_edge *edge = get_edge(pbqp, src_index, tgt_index);
+ if (tgt_index < src_index) {
+ pbqp_matrix_transpose(pbqp, costs);
+ add_edge_costs(pbqp, tgt_index, src_index, costs);
+ return;
+ }
+
if (edge == NULL) {
edge = alloc_edge(pbqp, src_index, tgt_index, costs);
} else {
if (edge == NULL) {
edge = alloc_edge(pbqp, src_index, tgt_index, costs);
} else {
@@
-82,6
+93,14
@@
void add_edge_costs(pbqp *pbqp, unsigned src_index, unsigned tgt_index,
}
}
}
}
+num get_node_solution(pbqp *pbqp, unsigned node_index)
+{
+ pbqp_node *node = get_node(pbqp, node_index);
+ assert(node);
+
+ return node->solution;
+}
+
num get_solution(pbqp *pbqp)
{
return pbqp->solution;
num get_solution(pbqp *pbqp)
{
return pbqp->solution;