projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
option added for only using remats รก la Briggs
[libfirm]
/
ir
/
be
/
bespill.c
diff --git
a/ir/be/bespill.c
b/ir/be/bespill.c
index
35541e0
..
e003a2d
100644
(file)
--- a/
ir/be/bespill.c
+++ b/
ir/be/bespill.c
@@
-232,7
+232,7
@@
static INLINE ir_node *skip_projs(ir_node *node) {
/**
* Searchs the schedule backwards until we reach the first use or def of a
* value or a phi.
/**
* Searchs the schedule backwards until we reach the first use or def of a
* value or a phi.
- * Returns the node
before
this node (so that you can do sched_add_before)
+ * Returns the node
after
this node (so that you can do sched_add_before)
*/
static ir_node *find_last_use_def(spill_env_t *env, ir_node *block, ir_node *value) {
ir_node *node, *last;
*/
static ir_node *find_last_use_def(spill_env_t *env, ir_node *block, ir_node *value) {
ir_node *node, *last;
@@
-250,7
+250,7
@@
static ir_node *find_last_use_def(spill_env_t *env, ir_node *block, ir_node *val
for(i = 0, arity = get_irn_arity(node); i < arity; ++i) {
ir_node *arg = get_irn_n(node, i);
if(arg == value) {
for(i = 0, arity = get_irn_arity(node); i < arity; ++i) {
ir_node *arg = get_irn_n(node, i);
if(arg == value) {
- return skip_projs(
node
);
+ return skip_projs(
last
);
}
}
last = node;
}
}
last = node;
@@
-470,7
+470,7
@@
static ir_node *do_remat(spill_env_t *senv, ir_node *spilled, ir_node *reloader)
return res;
}
return res;
}
-static place_copies_for_phi(spill_env_t *env, ir_node* node) {
+static
void
place_copies_for_phi(spill_env_t *env, ir_node* node) {
int i, arity;
assert(is_Phi(node));
int i, arity;
assert(is_Phi(node));
@@
-509,9
+509,17
@@
void be_place_copies(spill_env_t *env) {
}
void be_spill_phi(spill_env_t *env, ir_node *node) {
}
void be_spill_phi(spill_env_t *env, ir_node *node) {
+ spill_ctx_t *spill_ctx;
+
assert(is_Phi(node));
pset_insert_ptr(env->mem_phis, node);
assert(is_Phi(node));
pset_insert_ptr(env->mem_phis, node);
+
+ // remove spill context for this phi (if there was one)
+ spill_ctx = be_get_spill_ctx(env->spill_ctxs, node, node);
+ if(spill_ctx != NULL) {
+ spill_ctx->spill = NULL;
+ }
}
void be_insert_spills_reloads(spill_env_t *env) {
}
void be_insert_spills_reloads(spill_env_t *env) {
@@
-570,7
+578,7
@@
void be_insert_spills_reloads(spill_env_t *env) {
/* introduce copies, rewire the uses */
assert(pset_count(values) > 0 && "???");
pset_insert_ptr(values, si->spilled_node);
/* introduce copies, rewire the uses */
assert(pset_count(values) > 0 && "???");
pset_insert_ptr(values, si->spilled_node);
- be_ssa_constr_set_ignore(env->chordal_env->dom_front, values, env->mem_phis);
+ be_ssa_constr_set_ignore(env->chordal_env->dom_front,
env->chordal_env->lv,
values, env->mem_phis);
del_pset(values);
}
del_pset(values);
}
@@
-597,6
+605,8
@@
void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before) {
rel->reloader = before;
rel->next = res->reloaders;
res->reloaders = rel;
rel->reloader = before;
rel->next = res->reloaders;
res->reloaders = rel;
+
+ be_liveness_add_missing(env->chordal_env->lv);
}
void be_add_reload_on_edge(spill_env_t *env, ir_node *to_spill, ir_node *block, int pos) {
}
void be_add_reload_on_edge(spill_env_t *env, ir_node *to_spill, ir_node *block, int pos) {
@@
-652,21
+662,26
@@
typedef struct _ss_env_t {
* Walker: compute the spill slots
*/
static void compute_spill_slots_walker(ir_node *spill, void *env) {
* Walker: compute the spill slots
*/
static void compute_spill_slots_walker(ir_node *spill, void *env) {
- ss_env_t *ssenv = env;
- ir_node *ctx;
- pmap_entry *entry;
+ ss_env_t *ssenv = env;
+ arch_env_t *arch_env = ssenv->cenv->birg->main_env->arch_env;
+ ir_node *ctx;
+ pmap_entry *entry;
spill_slot_t *ss;
spill_slot_t *ss;
+ const arch_register_class_t *cls;
+
+ if (! be_is_Spill(spill))
+ return;
+
+ cls = arch_get_irn_reg_class(arch_env, spill, be_pos_Spill_val);
- if (
!be_is_Spill(spill)
)
+ if (
cls != ssenv->cenv->cls
)
return;
/* check, if this spill is for a context already known */
return;
/* check, if this spill is for a context already known */
- ctx = be_get_Spill_context(spill);
+ ctx
= be_get_Spill_context(spill);
entry = pmap_find(ssenv->slots, ctx);
entry = pmap_find(ssenv->slots, ctx);
- if (!entry) {
- struct _arch_env_t *arch_env = ssenv->cenv->birg->main_env->arch_env;
- const arch_register_class_t *cls = arch_get_irn_reg_class(arch_env, spill, be_pos_Spill_val);
+ if (! entry) {
ir_mode *largest_mode = arch_register_class_mode(cls);
/* this is a new spill context */
ir_mode *largest_mode = arch_register_class_mode(cls);
/* this is a new spill context */
@@
-691,7
+706,7
@@
static void compute_spill_slots_walker(ir_node *spill, void *env) {
for (irn = pset_first(ss->members); irn; irn = pset_next(ss->members)) {
/* use values_interfere here, because it uses the dominance check,
which does work for values in memory */
for (irn = pset_first(ss->members); irn; irn = pset_next(ss->members)) {
/* use values_interfere here, because it uses the dominance check,
which does work for values in memory */
- assert(!values_interfere(spill, irn) && "Spills for the same spill slot must not interfere!");
+ assert(!values_interfere(s
senv->cenv->lv, s
pill, irn) && "Spills for the same spill slot must not interfere!");
}
}
#endif /* NDEBUG */
}
}
#endif /* NDEBUG */
@@
-752,7
+767,7
@@
static void optimize_slots(ss_env_t *ssenv, int size, spill_slot_t *ass[]) {
ir_node *n2;
for(n1 = pset_first(ass[i]->members); n1; n1 = pset_next(ass[i]->members))
for(n2 = pset_first(ass[o]->members); n2; n2 = pset_next(ass[o]->members))
ir_node *n2;
for(n1 = pset_first(ass[i]->members); n1; n1 = pset_next(ass[i]->members))
for(n2 = pset_first(ass[o]->members); n2; n2 = pset_next(ass[o]->members))
- if(values_interfere(n1, n2)) {
+ if(values_interfere(
ssenv->cenv->lv,
n1, n2)) {
pset_break(ass[i]->members);
pset_break(ass[o]->members);
DBG((ssenv->dbg, LEVEL_1, " Interf %+F -- %+F\n", n1, n2));
pset_break(ass[i]->members);
pset_break(ass[o]->members);
DBG((ssenv->dbg, LEVEL_1, " Interf %+F -- %+F\n", n1, n2));
@@
-883,7
+898,7
@@
void be_compute_spill_offsets(be_chordal_env_t *cenv) {
ssenv.cenv = cenv;
ssenv.slots = pmap_create();
ssenv.types = pmap_create();
ssenv.cenv = cenv;
ssenv.slots = pmap_create();
ssenv.types = pmap_create();
- FIRM_DBG_REGISTER(ssenv.dbg, "
ir
.be.spillslots");
+ FIRM_DBG_REGISTER(ssenv.dbg, "
firm
.be.spillslots");
/* Get initial spill slots */
irg_walk_graph(cenv->irg, NULL, compute_spill_slots_walker, &ssenv);
/* Get initial spill slots */
irg_walk_graph(cenv->irg, NULL, compute_spill_slots_walker, &ssenv);