projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
redo reverted changes to new set_transformer interface in sparc_transform.c
[libfirm]
/
ir
/
be
/
becopyilp2.c
diff --git
a/ir/be/becopyilp2.c
b/ir/be/becopyilp2.c
index
e3d7963
..
028abda
100644
(file)
--- a/
ir/be/becopyilp2.c
+++ b/
ir/be/becopyilp2.c
@@
-55,8
+55,9
@@
#include "irtools.h"
#include "irgwalk.h"
#include "becopyilp_t.h"
#include "irtools.h"
#include "irgwalk.h"
#include "becopyilp_t.h"
-#include "beifg_t.h"
-#include "besched_t.h"
+#include "beifg.h"
+#include "besched.h"
+#include "bemodule.h"
#define DEBUG_LVL 1
#define DEBUG_LVL 1
@@
-69,18
+70,19
@@
typedef struct _local_env_t {
DEBUG_ONLY(firm_dbg_module_t *dbg;)
} local_env_t;
DEBUG_ONLY(firm_dbg_module_t *dbg;)
} local_env_t;
-static void build_coloring_cstr(ilp_env_t *ienv) {
+static void build_coloring_cstr(ilp_env_t *ienv)
+{
be_ifg_t *ifg = ienv->co->cenv->ifg;
be_ifg_t *ifg = ienv->co->cenv->ifg;
-
void *iter = be_ifg_nodes_iter_alloca(ifg)
;
+
nodes_iter_t iter
;
bitset_t *colors;
ir_node *irn;
char buf[16];
colors = bitset_alloca(arch_register_class_n_regs(ienv->co->cls));
bitset_t *colors;
ir_node *irn;
char buf[16];
colors = bitset_alloca(arch_register_class_n_regs(ienv->co->cls));
- be_ifg_foreach_node(ifg, iter, irn)
+ be_ifg_foreach_node(ifg,
&
iter, irn)
if (!sr_is_removed(ienv->sr, irn)) {
if (!sr_is_removed(ienv->sr, irn)) {
-
bitset_pos_t
col;
+
unsigned
col;
int cst_idx;
const arch_register_req_t *req;
int curr_node_color = get_irn_col(irn);
int cst_idx;
const arch_register_req_t *req;
int curr_node_color = get_irn_col(irn);
@@
-131,7
+133,7
@@
static void build_interference_cstr(ilp_env_t *ienv)
local_env_t *lenv = ienv->env;
be_ifg_t *ifg = ienv->co->cenv->ifg;
int n_colors = lenv->n_colors;
local_env_t *lenv = ienv->env;
be_ifg_t *ifg = ienv->co->cenv->ifg;
int n_colors = lenv->n_colors;
-
void *iter = be_ifg_cliques_iter_alloca(ifg)
;
+
cliques_iter_t iter
;
ir_node **clique = ALLOCAN(ir_node*, n_colors);
int size;
int col;
ir_node **clique = ALLOCAN(ir_node*, n_colors);
int size;
int col;
@@
-140,7
+142,7
@@
static void build_interference_cstr(ilp_env_t *ienv)
char buf[16];
/* for each maximal clique */
char buf[16];
/* for each maximal clique */
- be_ifg_foreach_clique(ifg, iter, clique, &size) {
+ be_ifg_foreach_clique(ifg,
&
iter, clique, &size) {
int realsize = 0;
for (i=0; i<size; ++i)
int realsize = 0;
for (i=0; i<size; ++i)
@@
-173,7
+175,8
@@
static void build_interference_cstr(ilp_env_t *ienv)
* by walking over all affinity edges. Graph structure
* does not provide this walker, yet.
*/
* by walking over all affinity edges. Graph structure
* does not provide this walker, yet.
*/
-static void build_affinity_cstr(ilp_env_t *ienv) {
+static void build_affinity_cstr(ilp_env_t *ienv)
+{
local_env_t *lenv = ienv->env;
int n_colors = lenv->n_colors;
unit_t *curr;
local_env_t *lenv = ienv->env;
int n_colors = lenv->n_colors;
unit_t *curr;
@@
-219,7
+222,8
@@
typedef struct _edge_t {
ir_node *n1, *n2;
} edge_t;
ir_node *n1, *n2;
} edge_t;
-static int compare_edge_t(const void *k1, const void *k2, size_t size) {
+static int compare_edge_t(const void *k1, const void *k2, size_t size)
+{
const edge_t *e1 = k1;
const edge_t *e2 = k2;
(void) size;
const edge_t *e1 = k1;
const edge_t *e2 = k2;
(void) size;
@@
-229,7
+233,8
@@
static int compare_edge_t(const void *k1, const void *k2, size_t size) {
#define HASH_EDGE(e) (hash_irn((e)->n1) ^ hash_irn((e)->n2))
#define HASH_EDGE(e) (hash_irn((e)->n1) ^ hash_irn((e)->n2))
-static inline edge_t *add_edge(set *edges, ir_node *n1, ir_node *n2, int *counter) {
+static inline edge_t *add_edge(set *edges, ir_node *n1, ir_node *n2, int *counter)
+{
edge_t new_edge;
if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
edge_t new_edge;
if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
@@
-243,7
+248,8
@@
static inline edge_t *add_edge(set *edges, ir_node *n1, ir_node *n2, int *counte
return set_insert(edges, &new_edge, sizeof(new_edge), HASH_EDGE(&new_edge));
}
return set_insert(edges, &new_edge, sizeof(new_edge), HASH_EDGE(&new_edge));
}
-static inline edge_t *find_edge(set *edges, ir_node *n1, ir_node *n2) {
+static inline edge_t *find_edge(set *edges, ir_node *n1, ir_node *n2)
+{
edge_t new_edge;
if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
edge_t new_edge;
if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
@@
-256,7
+262,8
@@
static inline edge_t *find_edge(set *edges, ir_node *n1, ir_node *n2) {
return set_find(edges, &new_edge, sizeof(new_edge), HASH_EDGE(&new_edge));
}
return set_find(edges, &new_edge, sizeof(new_edge), HASH_EDGE(&new_edge));
}
-static inline void remove_edge(set *edges, ir_node *n1, ir_node *n2, int *counter) {
+static inline void remove_edge(set *edges, ir_node *n1, ir_node *n2, int *counter)
+{
edge_t new_edge, *e;
if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
edge_t new_edge, *e;
if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
@@
-274,14
+281,15
@@
static inline void remove_edge(set *edges, ir_node *n1, ir_node *n2, int *counte
}
}
}
}
-#define pset_foreach(pset, irn) for(irn=pset_first(pset); irn; irn=pset_next(pset))
+#define pset_foreach(pset, irn) for
(irn=pset_first(pset); irn; irn=pset_next(pset))
/**
* Search for an interference clique and an external node
* with affinity edges to all nodes of the clique.
* At most 1 node of the clique can be colored equally with the external node.
*/
/**
* Search for an interference clique and an external node
* with affinity edges to all nodes of the clique.
* At most 1 node of the clique can be colored equally with the external node.
*/
-static void build_clique_star_cstr(ilp_env_t *ienv) {
+static void build_clique_star_cstr(ilp_env_t *ienv)
+{
affinity_node_t *aff;
/* for each node with affinity edges */
affinity_node_t *aff;
/* for each node with affinity edges */
@@
-395,7
+403,8
@@
static void build_clique_star_cstr(ilp_env_t *ienv) {
}
}
-static void extend_path(ilp_env_t *ienv, pdeq *path, const ir_node *irn) {
+static void extend_path(ilp_env_t *ienv, pdeq *path, const ir_node *irn)
+{
be_ifg_t *ifg = ienv->co->cenv->ifg;
int i, len;
ir_node **curr_path;
be_ifg_t *ifg = ienv->co->cenv->ifg;
int i, len;
ir_node **curr_path;
@@
-466,7
+475,8
@@
end:
* edges in between.
* Then at least one of these affinity edges must break.
*/
* edges in between.
* Then at least one of these affinity edges must break.
*/
-static void build_path_cstr(ilp_env_t *ienv) {
+static void build_path_cstr(ilp_env_t *ienv)
+{
affinity_node_t *aff_info;
/* for each node with affinity edges */
affinity_node_t *aff_info;
/* for each node with affinity edges */
@@
-479,7
+489,8
@@
static void build_path_cstr(ilp_env_t *ienv) {
}
}
}
}
-static void ilp2_build(ilp_env_t *ienv) {
+static void ilp2_build(ilp_env_t *ienv)
+{
local_env_t *lenv = ienv->env;
int lower_bound;
local_env_t *lenv = ienv->env;
int lower_bound;
@@
-495,7
+506,8
@@
static void ilp2_build(ilp_env_t *ienv) {
lpp_set_time_limit(ienv->lp, lenv->time_limit);
}
lpp_set_time_limit(ienv->lp, lenv->time_limit);
}
-static void ilp2_apply(ilp_env_t *ienv) {
+static void ilp2_apply(ilp_env_t *ienv)
+{
local_env_t *lenv = ienv->env;
int i;
local_env_t *lenv = ienv->env;
int i;
@@
-539,7
+551,18
@@
static void ilp2_apply(ilp_env_t *ienv) {
#endif
}
#endif
}
-int co_solve_ilp2(copy_opt_t *co) {
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyilp2);
+void be_init_copyilp2(void)
+{
+ static co_algo_info copyheur = {
+ co_solve_ilp2, 1
+ };
+
+ be_register_copyopt("ilp", ©heur);
+}
+
+int co_solve_ilp2(copy_opt_t *co)
+{
lpp_sol_state_t sol_state;
ilp_env_t *ienv;
local_env_t my;
lpp_sol_state_t sol_state;
ilp_env_t *ienv;
local_env_t my;
@@
-556,7
+579,7
@@
int co_solve_ilp2(copy_opt_t *co) {
my.normal_colors = bitset_alloca(arch_register_class_n_regs(co->cls));
bitset_clear_all(my.normal_colors);
arch_put_non_ignore_regs(co->cls, my.normal_colors);
my.normal_colors = bitset_alloca(arch_register_class_n_regs(co->cls));
bitset_clear_all(my.normal_colors);
arch_put_non_ignore_regs(co->cls, my.normal_colors);
- my.n_colors = bitset_popcnt(my.normal_colors);
+ my.n_colors = bitset_popc
ou
nt(my.normal_colors);
ienv = new_ilp_env(co, ilp2_build, ilp2_apply, &my);
ienv = new_ilp_env(co, ilp2_build, ilp2_apply, &my);
@@
-570,7
+593,8
@@
int co_solve_ilp2(copy_opt_t *co) {
#else /* WITH_ILP */
#else /* WITH_ILP */
-static inline void only_that_you_can_compile_without_WITH_ILP_defined(void) {
+static inline void only_that_you_can_compile_without_WITH_ILP_defined(void)
+{
}
#endif /* WITH_ILP */
}
#endif /* WITH_ILP */