projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
- removed LV_COMPUTE_SORTED define and associated qsort(): nodes are now always sorte...
[libfirm]
/
ir
/
be
/
becopyheur.c
diff --git
a/ir/be/becopyheur.c
b/ir/be/becopyheur.c
index
47c9495
..
58158c1
100644
(file)
--- a/
ir/be/becopyheur.c
+++ b/
ir/be/becopyheur.c
@@
-32,9
+32,7
@@
* and the qnode is reinserted in the queue. The first qnode colored without
* conflicts is the best one.
*/
* and the qnode is reinserted in the queue. The first qnode colored without
* conflicts is the best one.
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
-#endif
#include "debug.h"
#include "bitset.h"
#include "debug.h"
#include "bitset.h"
@@
-90,7
+88,7
@@
typedef struct _qnode_t {
static pset *pinned_global; /**< optimized nodes should not be altered any more */
static pset *pinned_global; /**< optimized nodes should not be altered any more */
-static
INLINE
int nodes_interfere(const be_chordal_env_t *env, const ir_node *a, const ir_node *b)
+static
inline
int nodes_interfere(const be_chordal_env_t *env, const ir_node *a, const ir_node *b)
{
if (env->ifg)
return be_ifg_connected(env->ifg, a, b);
{
if (env->ifg)
return be_ifg_connected(env->ifg, a, b);
@@
-110,7
+108,7
@@
static int set_cmp_conflict_t(const void *x, const void *y, size_t size) {
* If a local pinned conflict occurs, a new edge in the conflict graph is added.
* The next maximum independent set build, will regard it.
*/
* If a local pinned conflict occurs, a new edge in the conflict graph is added.
* The next maximum independent set build, will regard it.
*/
-static
INLINE
void qnode_add_conflict(const qnode_t *qn, const ir_node *n1, const ir_node *n2) {
+static
inline
void qnode_add_conflict(const qnode_t *qn, const ir_node *n1, const ir_node *n2) {
conflict_t c;
DBG((dbg, LEVEL_4, "\t %+F -- %+F\n", n1, n2));
conflict_t c;
DBG((dbg, LEVEL_4, "\t %+F -- %+F\n", n1, n2));
@@
-127,7
+125,7
@@
static INLINE void qnode_add_conflict(const qnode_t *qn, const ir_node *n1, cons
/**
* Checks if two nodes are in a conflict.
*/
/**
* Checks if two nodes are in a conflict.
*/
-static
INLINE
int qnode_are_conflicting(const qnode_t *qn, const ir_node *n1, const ir_node *n2) {
+static
inline
int qnode_are_conflicting(const qnode_t *qn, const ir_node *n1, const ir_node *n2) {
conflict_t c;
/* search for live range interference */
if (n1!=n2 && nodes_interfere(qn->ou->co->cenv, n1, n2))
conflict_t c;
/* search for live range interference */
if (n1!=n2 && nodes_interfere(qn->ou->co->cenv, n1, n2))
@@
-151,7
+149,7
@@
static int set_cmp_node_stat_t(const void *x, const void *y, size_t size) {
/**
* Finds a node status entry of a node if existent. Otherwise return NULL
*/
/**
* Finds a node status entry of a node if existent. Otherwise return NULL
*/
-static
INLINE
const node_stat_t *qnode_find_node(const qnode_t *qn, ir_node *irn) {
+static
inline
const node_stat_t *qnode_find_node(const qnode_t *qn, ir_node *irn) {
node_stat_t find;
find.irn = irn;
return set_find(qn->changed_nodes, &find, sizeof(find), hash_irn(irn));
node_stat_t find;
find.irn = irn;
return set_find(qn->changed_nodes, &find, sizeof(find), hash_irn(irn));
@@
-161,7
+159,7
@@
static INLINE const node_stat_t *qnode_find_node(const qnode_t *qn, ir_node *irn
* Finds a node status entry of a node if existent. Otherwise it will return
* an initialized new entry for this node.
*/
* Finds a node status entry of a node if existent. Otherwise it will return
* an initialized new entry for this node.
*/
-static
INLINE
node_stat_t *qnode_find_or_insert_node(const qnode_t *qn, ir_node *irn) {
+static
inline
node_stat_t *qnode_find_or_insert_node(const qnode_t *qn, ir_node *irn) {
node_stat_t find;
find.irn = irn;
find.new_color = NO_COLOR;
node_stat_t find;
find.irn = irn;
find.new_color = NO_COLOR;
@@
-172,18
+170,18
@@
static INLINE node_stat_t *qnode_find_or_insert_node(const qnode_t *qn, ir_node
/**
* Returns the virtual color of a node if set before, else returns the real color.
*/
/**
* Returns the virtual color of a node if set before, else returns the real color.
*/
-static
INLINE
int qnode_get_new_color(const qnode_t *qn, ir_node *irn) {
+static
inline
int qnode_get_new_color(const qnode_t *qn, ir_node *irn) {
const node_stat_t *found = qnode_find_node(qn, irn);
if (found)
return found->new_color;
else
const node_stat_t *found = qnode_find_node(qn, irn);
if (found)
return found->new_color;
else
- return get_irn_col(
qn->ou->co,
irn);
+ return get_irn_col(irn);
}
/**
* Sets the virtual color of a node.
*/
}
/**
* Sets the virtual color of a node.
*/
-static
INLINE
void qnode_set_new_color(const qnode_t *qn, ir_node *irn, int color) {
+static
inline
void qnode_set_new_color(const qnode_t *qn, ir_node *irn, int color) {
node_stat_t *found = qnode_find_or_insert_node(qn, irn);
found->new_color = color;
DBG((dbg, LEVEL_3, "\t col(%+F) := %d\n", irn, color));
node_stat_t *found = qnode_find_or_insert_node(qn, irn);
found->new_color = color;
DBG((dbg, LEVEL_3, "\t col(%+F) := %d\n", irn, color));
@@
-194,7
+192,7
@@
static INLINE void qnode_set_new_color(const qnode_t *qn, ir_node *irn, int colo
* to the same optimization unit and has been optimized before the current
* processed node.
*/
* to the same optimization unit and has been optimized before the current
* processed node.
*/
-static
INLINE
int qnode_is_pinned_local(const qnode_t *qn, ir_node *irn) {
+static
inline
int qnode_is_pinned_local(const qnode_t *qn, ir_node *irn) {
const node_stat_t *found = qnode_find_node(qn, irn);
if (found)
return found->pinned_local;
const node_stat_t *found = qnode_find_node(qn, irn);
if (found)
return found->pinned_local;
@@
-206,11
+204,11
@@
static INLINE int qnode_is_pinned_local(const qnode_t *qn, ir_node *irn) {
* Local-pins a node, so optimizations of further nodes of the same opt unit
* can handle situations in which a color change would undo prior optimizations.
*/
* Local-pins a node, so optimizations of further nodes of the same opt unit
* can handle situations in which a color change would undo prior optimizations.
*/
-static
INLINE
void qnode_pin_local(const qnode_t *qn, ir_node *irn) {
+static
inline
void qnode_pin_local(const qnode_t *qn, ir_node *irn) {
node_stat_t *found = qnode_find_or_insert_node(qn, irn);
found->pinned_local = 1;
if (found->new_color == NO_COLOR)
node_stat_t *found = qnode_find_or_insert_node(qn, irn);
found->pinned_local = 1;
if (found->new_color == NO_COLOR)
- found->new_color = get_irn_col(
qn->ou->co,
irn);
+ found->new_color = get_irn_col(irn);
}
}
@@
-277,7
+275,7
@@
static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
bitset_flip_all(free_cols);
/* Exclude colors not assignable to the irn */
bitset_flip_all(free_cols);
/* Exclude colors not assignable to the irn */
- req = arch_get_register_req
(irn, -1
);
+ req = arch_get_register_req
_out(irn
);
if (arch_register_req_is(req, limited)) {
bitset_t *limited = bitset_alloca(cls->n_regs);
rbitset_copy_to_bitset(req->limited, limited);
if (arch_register_req_is(req, limited)) {
bitset_t *limited = bitset_alloca(cls->n_regs);
rbitset_copy_to_bitset(req->limited, limited);
@@
-301,7
+299,7
@@
static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
#endif /* SEARCH_FREE_COLORS */
/* If target color is not allocatable changing color is impossible */
#endif /* SEARCH_FREE_COLORS */
/* If target color is not allocatable changing color is impossible */
- if (!arch_reg_
is_allocatable(co->aenv, irn, -1
, arch_register_for_index(cls, col))) {
+ if (!arch_reg_
out_is_allocatable(irn
, arch_register_for_index(cls, col))) {
DBG((dbg, LEVEL_3, "\t %+F impossible\n", irn));
return CHANGE_IMPOSSIBLE;
}
DBG((dbg, LEVEL_3, "\t %+F impossible\n", irn));
return CHANGE_IMPOSSIBLE;
}
@@
-381,7
+379,7
@@
static int qnode_try_color(const qnode_t *qn) {
* Determines a maximum weighted independent set with respect to
* the interference and conflict edges of all nodes in a qnode.
*/
* Determines a maximum weighted independent set with respect to
* the interference and conflict edges of all nodes in a qnode.
*/
-static
INLINE
void qnode_max_ind_set(qnode_t *qn, const unit_t *ou) {
+static
inline
void qnode_max_ind_set(qnode_t *qn, const unit_t *ou) {
ir_node **safe, **unsafe;
int i, o, safe_count, safe_costs, unsafe_count, *unsafe_costs;
bitset_t *curr, *best;
ir_node **safe, **unsafe;
int i, o, safe_count, safe_costs, unsafe_count, *unsafe_costs;
bitset_t *curr, *best;
@@
-392,11
+390,11
@@
static INLINE void qnode_max_ind_set(qnode_t *qn, const unit_t *ou) {
* safe: node has no interference, hence it is in every max stable set.
* unsafe: node has an interference
*/
* safe: node has no interference, hence it is in every max stable set.
* unsafe: node has an interference
*/
- safe
= alloca((ou->node_count-1) * sizeof(*safe)
);
- safe_costs = 0;
- safe_count = 0;
- unsafe
= alloca((ou->node_count-1) * sizeof(*unsafe)
);
- unsafe_costs =
alloca((ou->node_count-1) * sizeof(*unsafe_costs)
);
+ safe
= ALLOCAN(ir_node*, ou->node_count - 1
);
+ safe_costs
= 0;
+ safe_count
= 0;
+ unsafe
= ALLOCAN(ir_node*, ou->node_count - 1
);
+ unsafe_costs =
ALLOCAN(int, ou->node_count - 1
);
unsafe_count = 0;
for(i=1; i<ou->node_count; ++i) {
int is_safe = 1;
unsafe_count = 0;
for(i=1; i<ou->node_count; ++i) {
int is_safe = 1;
@@
-478,7
+476,7
@@
no_stable_set:
/**
* Creates a new qnode
*/
/**
* Creates a new qnode
*/
-static
INLINE
qnode_t *new_qnode(const unit_t *ou, int color) {
+static
inline
qnode_t *new_qnode(const unit_t *ou, int color) {
qnode_t *qn = XMALLOC(qnode_t);
qn->ou = ou;
qn->color = color;
qnode_t *qn = XMALLOC(qnode_t);
qn->ou = ou;
qn->color = color;
@@
-491,7
+489,7
@@
static INLINE qnode_t *new_qnode(const unit_t *ou, int color) {
/**
* Frees space used by a queue node
*/
/**
* Frees space used by a queue node
*/
-static
INLINE
void free_qnode(qnode_t *qn) {
+static
inline
void free_qnode(qnode_t *qn) {
del_set(qn->conflicts);
del_set(qn->changed_nodes);
xfree(qn->mis);
del_set(qn->conflicts);
del_set(qn->changed_nodes);
xfree(qn->mis);
@@
-502,7
+500,7
@@
static INLINE void free_qnode(qnode_t *qn) {
* Inserts a qnode in the sorted queue of the optimization unit. Queue is
* ordered by field 'size' (the size of the mis) in decreasing order.
*/
* Inserts a qnode in the sorted queue of the optimization unit. Queue is
* ordered by field 'size' (the size of the mis) in decreasing order.
*/
-static
INLINE
void ou_insert_qnode(unit_t *ou, qnode_t *qn) {
+static
inline
void ou_insert_qnode(unit_t *ou, qnode_t *qn) {
struct list_head *lh;
if (qnode_are_conflicting(qn, ou->nodes[0], ou->nodes[0])) {
struct list_head *lh;
if (qnode_are_conflicting(qn, ou->nodes[0], ou->nodes[0])) {
@@
-532,11
+530,13
@@
static INLINE void ou_insert_qnode(unit_t *ou, qnode_t *qn) {
* nodes. (All other phi classes are reduced to this case.)
*/
static void ou_optimize(unit_t *ou) {
* nodes. (All other phi classes are reduced to this case.)
*/
static void ou_optimize(unit_t *ou) {
- int i;
- qnode_t *curr = NULL, *tmp;
- const arch_register_class_t *cls = ou->co->cls;
- bitset_pos_t idx;
- bitset_t *pos_regs = bitset_alloca(cls->n_regs);
+ qnode_t *curr = NULL;
+ qnode_t *tmp;
+ const arch_register_req_t *req;
+ bitset_t const* ignore;
+ bitset_pos_t n_regs;
+ bitset_pos_t idx;
+ int i;
DBG((dbg, LEVEL_1, "\tOptimizing unit:\n"));
for (i=0; i<ou->node_count; ++i)
DBG((dbg, LEVEL_1, "\tOptimizing unit:\n"));
for (i=0; i<ou->node_count; ++i)
@@
-545,16
+545,28
@@
static void ou_optimize(unit_t *ou) {
/* init queue */
INIT_LIST_HEAD(&ou->queue);
/* init queue */
INIT_LIST_HEAD(&ou->queue);
- arch_get_allocatable_regs(ou->nodes[0], -1, pos_regs);
+ req = arch_get_register_req_out(ou->nodes[0]);
+ ignore = ou->co->cenv->ignore_colors;
+ n_regs = req->cls->n_regs;
+ if (arch_register_req_is(req, limited)) {
+ rawbs_base_t const* limited = req->limited;
- /* exclude ignore colors */
- bitset_andnot(pos_regs, ou->co->cenv->ignore_colors);
+ for (idx = 0; idx != n_regs; ++idx) {
+ if (bitset_is_set(ignore, idx))
+ continue;
+ if (!rbitset_is_set(limited, idx))
+ continue;
- assert(bitset_popcnt(pos_regs) != 0 && "No register is allowed for this node !!?");
+ ou_insert_qnode(ou, new_qnode(ou, idx));
+ }
+ } else {
+ for (idx = 0; idx != n_regs; ++idx) {
+ if (bitset_is_set(ignore, idx))
+ continue;
- /* create new qnode */
- bitset_foreach(pos_regs, idx)
- ou_insert_qnode(ou, new_qnode(ou, idx));
+ ou_insert_qnode(ou, new_qnode(ou, idx));
+ }
+ }
/* search best */
for (;;) {
/* search best */
for (;;) {