projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Simplify test case.
[libfirm]
/
ir
/
be
/
becopyopt.c
diff --git
a/ir/be/becopyopt.c
b/ir/be/becopyopt.c
index
065b43d
..
780f366
100644
(file)
--- a/
ir/be/becopyopt.c
+++ b/
ir/be/becopyopt.c
@@
-29,9
+29,7
@@
* - Register-constrained nodes
* - Two-address code instructions
*/
* - Register-constrained nodes
* - Two-address code instructions
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
-#endif
#include "execfreq.h"
#include "xmalloc.h"
#include "execfreq.h"
#include "xmalloc.h"
@@
-196,7
+194,6
@@
copy_opt_t *new_copy_opt(be_chordal_env_t *chordal_env, cost_fct_t get_costs)
co = XMALLOCZ(copy_opt_t);
co->cenv = chordal_env;
co = XMALLOCZ(copy_opt_t);
co->cenv = chordal_env;
- co->aenv = chordal_env->birg->main_env->arch_env;
co->irg = chordal_env->irg;
co->cls = chordal_env->cls;
co->get_costs = get_costs;
co->irg = chordal_env->irg;
co->cls = chordal_env->cls;
co->get_costs = get_costs;
@@
-216,19
+213,27
@@
void free_copy_opt(copy_opt_t *co) {
free(co);
}
free(co);
}
-int co_is_optimizable_root(const copy_opt_t *co, ir_node *irn) {
+/**
+ * Checks if a node is optimizable, viz. has something to do with coalescing
+ * @param irn The irn to check
+ */
+static int co_is_optimizable_root(ir_node *irn)
+{
const arch_register_req_t *req;
const arch_register_t *reg;
const arch_register_req_t *req;
const arch_register_t *reg;
- if (arch_irn_is(
co->aenv,
irn, ignore))
+ if (arch_irn_is(irn, ignore))
return 0;
reg = arch_get_irn_register(irn);
if (arch_register_type_is(reg, ignore))
return 0;
return 0;
reg = arch_get_irn_register(irn);
if (arch_register_type_is(reg, ignore))
return 0;
- req = arch_get_register_req(irn, -1);
- if (is_Reg_Phi(irn) || is_Perm_Proj(irn) || is_2addr_code(req))
+ if (is_Reg_Phi(irn) || is_Perm_Proj(irn))
+ return 1;
+
+ req = arch_get_register_req_out(irn);
+ if (is_2addr_code(req))
return 1;
return 0;
return 1;
return 0;
@@
-374,13
+379,15
@@
static int ou_max_ind_set_costs(unit_t *ou) {
return safe_costs+best_weight;
}
return safe_costs+best_weight;
}
-static void co_collect_units(ir_node *irn, void *env) {
- copy_opt_t *co = env;
+static void co_collect_units(ir_node *irn, void *env)
+{
+ const arch_register_req_t *req = arch_get_register_req_out(irn);
+ copy_opt_t *co = env;
unit_t *unit;
unit_t *unit;
- if (
!is_curr_reg_class(co, irn)
)
+ if (
req->cls != co->cls
)
return;
return;
- if (!co_is_optimizable_root(
co,
irn))
+ if (!co_is_optimizable_root(irn))
return;
/* Init a new unit */
return;
/* Init a new unit */
@@
-404,7
+411,7
@@
static void co_collect_units(ir_node *irn, void *env) {
int o, arg_pos;
ir_node *arg = get_irn_n(irn, i);
int o, arg_pos;
ir_node *arg = get_irn_n(irn, i);
- assert(
is_curr_reg_class(co, arg)
&& "Argument not in same register class.");
+ assert(
arch_get_irn_reg_class_out(arg) == co->cls
&& "Argument not in same register class.");
if (arg == irn)
continue;
if (nodes_interfere(co->cenv, irn, arg)) {
if (arg == irn)
continue;
if (nodes_interfere(co->cenv, irn, arg)) {
@@
-415,7
+422,7
@@
static void co_collect_units(ir_node *irn, void *env) {
/* Else insert the argument of the phi to the members of this ou */
DBG((dbg, LEVEL_1, "\t Member: %+F\n", arg));
/* Else insert the argument of the phi to the members of this ou */
DBG((dbg, LEVEL_1, "\t Member: %+F\n", arg));
- if (!
arch_irn_is(co->aenv,
arg, ignore)) {
+ if (!
arch_irn_is(
arg, ignore)) {
/* Check if arg has occurred at a prior position in the arg/list */
arg_pos = 0;
for (o=1; o<unit->node_count; ++o) {
/* Check if arg has occurred at a prior position in the arg/list */
arg_pos = 0;
for (o=1; o<unit->node_count; ++o) {
@@
-448,8
+455,6
@@
static void co_collect_units(ir_node *irn, void *env) {
unit->nodes[1] = get_Perm_src(irn);
unit->costs[1] = co->get_costs(co, irn, unit->nodes[1], -1);
} else {
unit->nodes[1] = get_Perm_src(irn);
unit->costs[1] = co->get_costs(co, irn, unit->nodes[1], -1);
} else {
- const arch_register_req_t *req = arch_get_register_req(irn, -1);
-
/* Src == Tgt of a 2-addr-code instruction */
if (is_2addr_code(req)) {
const unsigned other = req->other_same;
/* Src == Tgt of a 2-addr-code instruction */
if (is_2addr_code(req)) {
const unsigned other = req->other_same;
@@
-459,7
+464,7
@@
static void co_collect_units(ir_node *irn, void *env) {
for (i = 0; (1U << i) <= other; ++i) {
if (other & (1U << i)) {
ir_node *o = get_irn_n(skip_Proj(irn), i);
for (i = 0; (1U << i) <= other; ++i) {
if (other & (1U << i)) {
ir_node *o = get_irn_n(skip_Proj(irn), i);
- if (!arch_irn_is(
co->aenv,
o, ignore) &&
+ if (!arch_irn_is(o, ignore) &&
!nodes_interfere(co->cenv, irn, o)) {
++count;
}
!nodes_interfere(co->cenv, irn, o)) {
++count;
}
@@
-477,7
+482,7
@@
static void co_collect_units(ir_node *irn, void *env) {
for (i = 0; 1U << i <= other; ++i) {
if (other & (1U << i)) {
ir_node *o = get_irn_n(skip_Proj(irn), i);
for (i = 0; 1U << i <= other; ++i) {
if (other & (1U << i)) {
ir_node *o = get_irn_n(skip_Proj(irn), i);
- if (!arch_irn_is(
co->aenv,
o, ignore) &&
+ if (!arch_irn_is(o, ignore) &&
!nodes_interfere(co->cenv, irn, o)) {
unit->nodes[k] = o;
unit->costs[k] = co->get_costs(co, irn, o, -1);
!nodes_interfere(co->cenv, irn, o)) {
unit->nodes[k] = o;
unit->costs[k] = co->get_costs(co, irn, o, -1);
@@
-525,7
+530,7
@@
static int compare_ous(const void *k1, const void *k2) {
/* Units with constraints come first */
u1_has_constr = 0;
for (i=0; i<u1->node_count; ++i) {
/* Units with constraints come first */
u1_has_constr = 0;
for (i=0; i<u1->node_count; ++i) {
- arch_get_register_req
(&req, u1->nodes[i], -1
);
+ arch_get_register_req
_out(&req, u1->nodes[i]
);
if (arch_register_req_is(&req, limited)) {
u1_has_constr = 1;
break;
if (arch_register_req_is(&req, limited)) {
u1_has_constr = 1;
break;
@@
-534,7
+539,7
@@
static int compare_ous(const void *k1, const void *k2) {
u2_has_constr = 0;
for (i=0; i<u2->node_count; ++i) {
u2_has_constr = 0;
for (i=0; i<u2->node_count; ++i) {
- arch_get_register_req
(&req, u2->nodes[i], -1
);
+ arch_get_register_req
_out(&req, u2->nodes[i]
);
if (arch_register_req_is(&req, limited)) {
u2_has_constr = 1;
break;
if (arch_register_req_is(&req, limited)) {
u2_has_constr = 1;
break;
@@
-759,7
+764,7
@@
static void add_edge(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) {
nbr->costs += costs;
}
nbr->costs += costs;
}
-static
INLINE
void add_edges(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) {
+static
inline
void add_edges(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs) {
if (! be_ifg_connected(co->cenv->ifg, n1, n2)) {
add_edge(co, n1, n2, costs);
add_edge(co, n2, n1, costs);
if (! be_ifg_connected(co->cenv->ifg, n1, n2)) {
add_edge(co, n1, n2, costs);
add_edge(co, n2, n1, costs);
@@
-767,11
+772,12
@@
static INLINE void add_edges(copy_opt_t *co, ir_node *n1, ir_node *n2, int costs
}
static void build_graph_walker(ir_node *irn, void *env) {
}
static void build_graph_walker(ir_node *irn, void *env) {
- copy_opt_t *co = env;
+ const arch_register_req_t *req = arch_get_register_req_out(irn);
+ copy_opt_t *co = env;
int pos, max;
const arch_register_t *reg;
int pos, max;
const arch_register_t *reg;
- if (
!is_curr_reg_class(co, irn) || arch_irn_is(co->aenv,
irn, ignore))
+ if (
req->cls != co->cls || arch_irn_is(
irn, ignore))
return;
reg = arch_get_irn_register(irn);
return;
reg = arch_get_irn_register(irn);
@@
-786,9
+792,7
@@
static void build_graph_walker(ir_node *irn, void *env) {
} else if (is_Perm_Proj(irn)) { /* Perms */
ir_node *arg = get_Perm_src(irn);
add_edges(co, irn, arg, co->get_costs(co, irn, arg, 0));
} else if (is_Perm_Proj(irn)) { /* Perms */
ir_node *arg = get_Perm_src(irn);
add_edges(co, irn, arg, co->get_costs(co, irn, arg, 0));
- }
- else { /* 2-address code */
- const arch_register_req_t *req = arch_get_register_req(irn, -1);
+ } else { /* 2-address code */
if (is_2addr_code(req)) {
const unsigned other = req->other_same;
int i;
if (is_2addr_code(req)) {
const unsigned other = req->other_same;
int i;
@@
-796,7
+800,7
@@
static void build_graph_walker(ir_node *irn, void *env) {
for (i = 0; 1U << i <= other; ++i) {
if (other & (1U << i)) {
ir_node *other = get_irn_n(skip_Proj(irn), i);
for (i = 0; 1U << i <= other; ++i) {
if (other & (1U << i)) {
ir_node *other = get_irn_n(skip_Proj(irn), i);
- if (!
arch_irn_is(co->aenv,
other, ignore))
+ if (!
arch_irn_is(
other, ignore))
add_edges(co, irn, other, co->get_costs(co, irn, other, 0));
}
}
add_edges(co, irn, other, co->get_costs(co, irn, other, 0));
}
}
@@
-838,14
+842,13
@@
static int co_dump_appel_disjoint_constraints(const copy_opt_t *co, ir_node *a,
{
ir_node *nodes[] = { a, b };
bitset_t *constr[] = { NULL, NULL };
{
ir_node *nodes[] = { a, b };
bitset_t *constr[] = { NULL, NULL };
- const arch_register_req_t *req;
int j;
constr[0] = bitset_alloca(co->cls->n_regs);
constr[1] = bitset_alloca(co->cls->n_regs);
for (j = 0; j < 2; ++j) {
int j;
constr[0] = bitset_alloca(co->cls->n_regs);
constr[1] = bitset_alloca(co->cls->n_regs);
for (j = 0; j < 2; ++j) {
-
req = arch_get_register_req(nodes[j], BE_OUT_POS(0)
);
+
const arch_register_req_t *req = arch_get_register_req_out(nodes[j]
);
if(arch_register_req_is(req, limited))
rbitset_copy_to_bitset(req->limited, constr[j]);
else
if(arch_register_req_is(req, limited))
rbitset_copy_to_bitset(req->limited, constr[j]);
else
@@
-883,21
+886,19
@@
void co_dump_appel_graph(const copy_opt_t *co, FILE *f)
n = n_regs;
be_ifg_foreach_node(ifg, it, irn) {
n = n_regs;
be_ifg_foreach_node(ifg, it, irn) {
- if
(!arch_irn_is(co->aenv,
irn, ignore))
+ if
(!arch_irn_is(
irn, ignore))
node_map[get_irn_idx(irn)] = n++;
}
fprintf(f, "%d %d\n", n, n_regs);
be_ifg_foreach_node(ifg, it, irn) {
node_map[get_irn_idx(irn)] = n++;
}
fprintf(f, "%d %d\n", n, n_regs);
be_ifg_foreach_node(ifg, it, irn) {
- if(!arch_irn_is(co->aenv, irn, ignore)) {
- int idx = node_map[get_irn_idx(irn)];
- affinity_node_t *a = get_affinity_info(co, irn);
+ if (!arch_irn_is(irn, ignore)) {
+ int idx = node_map[get_irn_idx(irn)];
+ affinity_node_t *a = get_affinity_info(co, irn);
+ const arch_register_req_t *req = arch_get_register_req_out(irn);
+ ir_node *adj;
- const arch_register_req_t *req;
- ir_node *adj;
-
- req = arch_get_register_req(irn, BE_OUT_POS(0));
if(arch_register_req_is(req, limited)) {
for(i = 0; i < co->cls->n_regs; ++i) {
if(!rbitset_is_set(req->limited, i) && color_map[i] >= 0)
if(arch_register_req_is(req, limited)) {
for(i = 0; i < co->cls->n_regs; ++i) {
if(!rbitset_is_set(req->limited, i) && color_map[i] >= 0)
@@
-906,7
+907,8
@@
void co_dump_appel_graph(const copy_opt_t *co, FILE *f)
}
be_ifg_foreach_neighbour(ifg, nit, irn, adj) {
}
be_ifg_foreach_neighbour(ifg, nit, irn, adj) {
- if(!arch_irn_is(co->aenv, adj, ignore) && !co_dump_appel_disjoint_constraints(co, irn, adj)) {
+ if (!arch_irn_is(adj, ignore) &&
+ !co_dump_appel_disjoint_constraints(co, irn, adj)) {
int adj_idx = node_map[get_irn_idx(adj)];
if(idx < adj_idx)
fprintf(f, "%d %d -1\n", idx, adj_idx);
int adj_idx = node_map[get_irn_idx(adj)];
if(idx < adj_idx)
fprintf(f, "%d %d -1\n", idx, adj_idx);
@@
-917,7
+919,7
@@
void co_dump_appel_graph(const copy_opt_t *co, FILE *f)
neighb_t *n;
co_gs_foreach_neighb(a, n) {
neighb_t *n;
co_gs_foreach_neighb(a, n) {
- if
(!arch_irn_is(co->aenv,
n->irn, ignore)) {
+ if
(!arch_irn_is(
n->irn, ignore)) {
int n_idx = node_map[get_irn_idx(n->irn)];
if(idx < n_idx)
fprintf(f, "%d %d %d\n", idx, n_idx, (int) n->costs);
int n_idx = node_map[get_irn_idx(n->irn)];
if(idx < n_idx)
fprintf(f, "%d %d %d\n", idx, n_idx, (int) n->costs);
@@
-991,19
+993,16
@@
static void ifg_dump_graph_attr(FILE *f, void *self)
static int ifg_is_dump_node(void *self, ir_node *irn)
{
static int ifg_is_dump_node(void *self, ir_node *irn)
{
-
co_ifg_dump_t *cod =
self;
- return !arch_irn_is(
cod->co->aenv,
irn, ignore);
+
(void)
self;
+ return !arch_irn_is(irn, ignore);
}
static void ifg_dump_node_attr(FILE *f, void *self, ir_node *irn)
{
}
static void ifg_dump_node_attr(FILE *f, void *self, ir_node *irn)
{
- co_ifg_dump_t *env = self;
- const arch_register_t *reg = arch_get_irn_register(irn);
- const arch_register_req_t *req;
- int limited;
-
- req = arch_get_register_req(irn, BE_OUT_POS(0));
- limited = arch_register_req_is(req, limited);
+ co_ifg_dump_t *env = self;
+ const arch_register_t *reg = arch_get_irn_register(irn);
+ const arch_register_req_t *req = arch_get_register_req_out(irn);
+ int limited = arch_register_req_is(req, limited);
if(env->flags & CO_IFG_DUMP_LABELS) {
ir_fprintf(f, "label=\"%+F", irn);
if(env->flags & CO_IFG_DUMP_LABELS) {
ir_fprintf(f, "label=\"%+F", irn);