projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
- let option "hmuchnik" select the heuristic muchnik scheduler, not the trivial one
[libfirm]
/
ir
/
be
/
becopyheur4.c
diff --git
a/ir/be/becopyheur4.c
b/ir/be/becopyheur4.c
index
91243cc
..
9a608fd
100644
(file)
--- a/
ir/be/becopyheur4.c
+++ b/
ir/be/becopyheur4.c
@@
-29,9
+29,9
@@
* (also known as "heur3" :)
* Performs simple copy minimization.
*/
* (also known as "heur3" :)
* Performs simple copy minimization.
*/
-#i
fdef HAVE_CONFIG_H
-#include "config.h"
-#
endif /* HAVE_CONFIG_H */
+#i
nclude "config.h" /* HAVE_CONFIG_H */
+
+#
define DISABLE_STATEV
#include <float.h>
#include <float.h>
@@
-119,10
+119,9
@@
typedef struct _co_mst_env_t {
int k; /**< number of non-ignore registers in class */
bitset_t *ignore_regs; /**< set containing all global ignore registers */
ir_phase ph; /**< phase object holding data for nodes */
int k; /**< number of non-ignore registers in class */
bitset_t *ignore_regs; /**< set containing all global ignore registers */
ir_phase ph; /**< phase object holding data for nodes */
- pqueue
*chunks; /**< priority queue for chunks */
+ pqueue
_t
*chunks; /**< priority queue for chunks */
pset *chunkset; /**< set holding all chunks */
be_ifg_t *ifg; /**< the interference graph */
pset *chunkset; /**< set holding all chunks */
be_ifg_t *ifg; /**< the interference graph */
- const arch_env_t *aenv; /**< the arch environment */
copy_opt_t *co; /**< the copy opt object */
unsigned chunk_visited;
col_cost_t **single_cols;
copy_opt_t *co; /**< the copy opt object */
unsigned chunk_visited;
col_cost_t **single_cols;
@@
-254,7
+253,7
@@
static int cmp_col_cost_gt(const void *a, const void *b) {
* Creates a new affinity chunk
*/
static INLINE aff_chunk_t *new_aff_chunk(co_mst_env_t *env) {
* Creates a new affinity chunk
*/
static INLINE aff_chunk_t *new_aff_chunk(co_mst_env_t *env) {
- aff_chunk_t *c =
xmalloc(sizeof(*c) + (env->n_regs - 1) * sizeof(c->color_affinity[0])
);
+ aff_chunk_t *c =
XMALLOCF(aff_chunk_t, color_affinity, env->n_regs
);
c->n = NEW_ARR_F(const ir_node *, 0);
c->interfere = NEW_ARR_F(const ir_node *, 0);
c->weight = -1;
c->n = NEW_ARR_F(const ir_node *, 0);
c->interfere = NEW_ARR_F(const ir_node *, 0);
c->weight = -1;
@@
-369,7
+368,7
@@
static void *co_mst_irn_init(ir_phase *ph, const ir_node *irn, void *old) {
res->tmp_col = -1;
res->int_neighs = NULL;
res->int_aff_neigh = 0;
res->tmp_col = -1;
res->int_neighs = NULL;
res->int_aff_neigh = 0;
- res->col = arch_register_get_index(arch_get_irn_register(
env->aenv,
irn));
+ res->col = arch_register_get_index(arch_get_irn_register(irn));
res->init_col = res->col;
INIT_LIST_HEAD(&res->list);
res->init_col = res->col;
INIT_LIST_HEAD(&res->list);
@@
-379,7
+378,7
@@
static void *co_mst_irn_init(ir_phase *ph, const ir_node *irn, void *old) {
res->adm_colors = bitset_obstack_alloc(phase_obst(ph), env->n_regs);
/* Exclude colors not assignable to the irn */
res->adm_colors = bitset_obstack_alloc(phase_obst(ph), env->n_regs);
/* Exclude colors not assignable to the irn */
- req = arch_get_register_req(
env->aenv,
irn, -1);
+ req = arch_get_register_req(irn, -1);
if (arch_register_req_is(req, limited))
rbitset_copy_to_bitset(req->limited, res->adm_colors);
else
if (arch_register_req_is(req, limited))
rbitset_copy_to_bitset(req->limited, res->adm_colors);
else
@@
-397,7
+396,7
@@
static void *co_mst_irn_init(ir_phase *ph, const ir_node *irn, void *old) {
/* build list of interfering neighbours */
len = 0;
be_ifg_foreach_neighbour(env->ifg, nodes_it, irn, neigh) {
/* build list of interfering neighbours */
len = 0;
be_ifg_foreach_neighbour(env->ifg, nodes_it, irn, neigh) {
- if (!
arch_irn_is(env->aenv,
neigh, ignore)) {
+ if (!
arch_irn_is(
neigh, ignore)) {
obstack_ptr_grow(phase_obst(ph), neigh);
++len;
}
obstack_ptr_grow(phase_obst(ph), neigh);
++len;
}
@@
-556,7
+555,7
@@
static void aff_chunk_assure_weight(co_mst_env_t *env, aff_chunk_t *c) {
const ir_node *m = neigh->irn;
/* skip ignore nodes */
const ir_node *m = neigh->irn;
/* skip ignore nodes */
- if (arch_irn_is(
env->aenv,
m, ignore))
+ if (arch_irn_is(m, ignore))
continue;
w += node_contains(c->n, m) ? neigh->costs : 0;
continue;
w += node_contains(c->n, m) ? neigh->costs : 0;
@@
-587,7
+586,7
@@
static int count_interfering_aff_neighs(co_mst_env_t *env, const affinity_node_t
int i;
/* skip ignore nodes */
int i;
/* skip ignore nodes */
- if (arch_irn_is(
env->aenv,
n, ignore))
+ if (arch_irn_is(n, ignore))
continue;
/* check if the affinity neighbour interfere */
continue;
/* check if the affinity neighbour interfere */
@@
-623,7
+622,7
@@
static void build_affinity_chunks(co_mst_env_t *env) {
affinity_node_t *an;
/* skip ignore nodes */
affinity_node_t *an;
/* skip ignore nodes */
- if (arch_irn_is(
env->aenv,
n, ignore))
+ if (arch_irn_is(n, ignore))
continue;
n1 = get_co_mst_irn(env, n);
continue;
n1 = get_co_mst_irn(env, n);
@@
-646,7
+645,7
@@
static void build_affinity_chunks(co_mst_env_t *env) {
aff_edge_t edge;
/* skip ignore nodes */
aff_edge_t edge;
/* skip ignore nodes */
- if (arch_irn_is(
env->aenv,
m, ignore))
+ if (arch_irn_is(m, ignore))
continue;
edge.src = n;
continue;
edge.src = n;
@@
-711,7
+710,7
@@
static void build_affinity_chunks(co_mst_env_t *env) {
static __attribute__((unused)) void chunk_order_nodes(co_mst_env_t *env, aff_chunk_t *chunk)
{
static __attribute__((unused)) void chunk_order_nodes(co_mst_env_t *env, aff_chunk_t *chunk)
{
- pqueue *grow = new_pqueue();
+ pqueue
_t
*grow = new_pqueue();
const ir_node *max_node = NULL;
int max_weight = 0;
int i;
const ir_node *max_node = NULL;
int max_weight = 0;
int i;
@@
-722,7
+721,7
@@
static __attribute__((unused)) void chunk_order_nodes(co_mst_env_t *env, aff_chu
int w = 0;
neighb_t *neigh;
int w = 0;
neighb_t *neigh;
- if (arch_irn_is(
env->aenv,
irn, ignore))
+ if (arch_irn_is(irn, ignore))
continue;
if (an) {
continue;
if (an) {
@@
-746,11
+745,11
@@
static __attribute__((unused)) void chunk_order_nodes(co_mst_env_t *env, aff_chu
bitset_remv_irn(visited, max_node);
i = 0;
while (!pqueue_empty(grow)) {
bitset_remv_irn(visited, max_node);
i = 0;
while (!pqueue_empty(grow)) {
- ir_node *irn = pqueue_
ge
t(grow);
+ ir_node *irn = pqueue_
pop_fron
t(grow);
affinity_node_t *an = get_affinity_info(env->co, irn);
neighb_t *neigh;
affinity_node_t *an = get_affinity_info(env->co, irn);
neighb_t *neigh;
- if (arch_irn_is(
env->aenv,
irn, ignore))
+ if (arch_irn_is(irn, ignore))
continue;
assert(i <= ARR_LEN(chunk->n));
continue;
assert(i <= ARR_LEN(chunk->n));
@@
-804,7
+803,7
@@
static void expand_chunk_from(co_mst_env_t *env, co_mst_irn_t *node, bitset_t *v
co_mst_irn_t *n2;
/* skip ignore nodes */
co_mst_irn_t *n2;
/* skip ignore nodes */
- if (arch_irn_is(
env->aenv,
m, ignore))
+ if (arch_irn_is(m, ignore))
continue;
n2 = get_co_mst_irn(env, m);
continue;
n2 = get_co_mst_irn(env, m);
@@
-1047,7
+1046,7
@@
static int recolor_nodes(co_mst_env_t *env, co_mst_irn_t *node, col_cost_t *cost
neigh = node->int_neighs[j];
/* skip ignore nodes */
neigh = node->int_neighs[j];
/* skip ignore nodes */
- if (arch_irn_is(
env->aenv,
neigh, ignore))
+ if (arch_irn_is(neigh, ignore))
continue;
nn = get_co_mst_irn(env, neigh);
continue;
nn = get_co_mst_irn(env, neigh);
@@
-1411,7
+1410,6
@@
int co_solve_heuristic_mst(copy_opt_t *co) {
mst_env.co = co;
mst_env.ignore_regs = ignore_regs;
mst_env.ifg = co->cenv->ifg;
mst_env.co = co;
mst_env.ignore_regs = ignore_regs;
mst_env.ifg = co->cenv->ifg;
- mst_env.aenv = co->aenv;
mst_env.chunkset = pset_new_ptr(512);
mst_env.chunk_visited = 0;
mst_env.single_cols = phase_alloc(&mst_env.ph, sizeof(*mst_env.single_cols) * n_regs);
mst_env.chunkset = pset_new_ptr(512);
mst_env.chunk_visited = 0;
mst_env.single_cols = phase_alloc(&mst_env.ph, sizeof(*mst_env.single_cols) * n_regs);
@@
-1438,7
+1436,7
@@
int co_solve_heuristic_mst(copy_opt_t *co) {
/* color chunks as long as there are some */
while (! pqueue_empty(mst_env.chunks)) {
/* color chunks as long as there are some */
while (! pqueue_empty(mst_env.chunks)) {
- aff_chunk_t *chunk = pqueue_
ge
t(mst_env.chunks);
+ aff_chunk_t *chunk = pqueue_
pop_fron
t(mst_env.chunks);
color_aff_chunk(&mst_env, chunk);
DB((dbg, LEVEL_4, "<<<====== Coloring chunk (%u) done\n", chunk->id));
color_aff_chunk(&mst_env, chunk);
DB((dbg, LEVEL_4, "<<<====== Coloring chunk (%u) done\n", chunk->id));
@@
-1450,7
+1448,7
@@
int co_solve_heuristic_mst(copy_opt_t *co) {
co_mst_irn_t *mirn;
const arch_register_t *reg;
co_mst_irn_t *mirn;
const arch_register_t *reg;
- if (arch_irn_is(
mst_env.aenv,
irn, ignore))
+ if (arch_irn_is(irn, ignore))
continue;
mirn = get_co_mst_irn(&mst_env, irn);
continue;
mirn = get_co_mst_irn(&mst_env, irn);
@@
-1461,7
+1459,7
@@
int co_solve_heuristic_mst(copy_opt_t *co) {
continue;
reg = arch_register_for_index(co->cls, mirn->col);
continue;
reg = arch_register_for_index(co->cls, mirn->col);
- arch_set_irn_register(
co->aenv,
irn, reg);
+ arch_set_irn_register(irn, reg);
DB((dbg, LEVEL_1, "%+F set color from %d to %d\n", irn, mirn->init_col, mirn->col));
}
DB((dbg, LEVEL_1, "%+F set color from %d to %d\n", irn, mirn->init_col, mirn->col));
}