projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
- fix x87 simulator not killing float copies that only move registers around,
[libfirm]
/
ir
/
be
/
bespill.c
diff --git
a/ir/be/bespill.c
b/ir/be/bespill.c
index
a6902bf
..
ac99880
100644
(file)
--- a/
ir/be/bespill.c
+++ b/
ir/be/bespill.c
@@
-177,6
+177,9
@@
void be_add_remat(spill_env_t *env, ir_node *to_spill, ir_node *before, ir_node
reloader->allow_remat = 1;
spill_info->reloaders = reloader;
reloader->allow_remat = 1;
spill_info->reloaders = reloader;
+
+ DBG((env->dbg, LEVEL_1, "creating spillinfo for %+F, will be rematerialized before %+F\n",
+ to_spill, before));
}
void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before,
}
void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before,
@@
-220,6
+223,9
@@
void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before,
info->reloaders = rel;
assert(info->reload_cls == NULL || info->reload_cls == reload_cls);
info->reload_cls = reload_cls;
info->reloaders = rel;
assert(info->reload_cls == NULL || info->reload_cls == reload_cls);
info->reload_cls = reload_cls;
+
+ DBG((env->dbg, LEVEL_1, "creating spillinfo for %+F, will be reloaded before %+F, may%s be rematerialized\n",
+ to_spill, before, allow_remat ? "" : " not"));
}
static ir_node *get_reload_insertion_point(ir_node *block, int pos) {
}
static ir_node *get_reload_insertion_point(ir_node *block, int pos) {
@@
-327,7
+333,7
@@
static void sched_add_after_insn(ir_node *sched_after, ir_node *node) {
static void spill_irn(spill_env_t *env, spill_info_t *spillinfo) {
ir_node *to_spill = spillinfo->spilled_node;
static void spill_irn(spill_env_t *env, spill_info_t *spillinfo) {
ir_node *to_spill = spillinfo->spilled_node;
- DBG((env->dbg, LEVEL_1, "
%+F\n
", to_spill));
+ DBG((env->dbg, LEVEL_1, "
spilling %+F ...
", to_spill));
/* Trying to spill an already spilled value, no need for a new spill
* node then, we can simply connect to the same one for this reload
/* Trying to spill an already spilled value, no need for a new spill
* node then, we can simply connect to the same one for this reload
@@
-337,6
+343,7
@@
static void spill_irn(spill_env_t *env, spill_info_t *spillinfo) {
*/
if(be_is_Reload(to_spill)) {
spillinfo->spill = get_irn_n(to_spill, be_pos_Reload_mem);
*/
if(be_is_Reload(to_spill)) {
spillinfo->spill = get_irn_n(to_spill, be_pos_Reload_mem);
+ DB((env->dbg, LEVEL_1, "skip reload, using existing spill %+F\n", spillinfo->spill));
return;
}
return;
}
@@
-345,6
+352,7
@@
static void spill_irn(spill_env_t *env, spill_info_t *spillinfo) {
}
spillinfo->spill = be_spill(env->arch_env, to_spill);
}
spillinfo->spill = be_spill(env->arch_env, to_spill);
+ DB((env->dbg, LEVEL_1, "add spill %+F after %+F\n", spillinfo->spill, to_spill));
sched_add_after_insn(to_spill, spillinfo->spill);
}
sched_add_after_insn(to_spill, spillinfo->spill);
}
@@
-369,6
+377,7
@@
static void spill_phi(spill_env_t *env, spill_info_t *spillinfo) {
assert(is_Phi(phi));
assert(is_Phi(phi));
+ DBG((env->dbg, LEVEL_1, "spilling Phi %+F:\n", phi));
/* build a new PhiM */
ins = alloca(sizeof(ir_node*) * arity);
for(i = 0; i < arity; ++i) {
/* build a new PhiM */
ins = alloca(sizeof(ir_node*) * arity);
for(i = 0; i < arity; ++i) {
@@
-384,17
+393,25
@@
static void spill_phi(spill_env_t *env, spill_info_t *spillinfo) {
set_irn_n(spillinfo->spill, i, arg_info->spill);
}
set_irn_n(spillinfo->spill, i, arg_info->spill);
}
+ DBG((env->dbg, LEVEL_1, "... done spilling Phi %+F\n", phi));
// rewire reloads from old_spill to phi
// rewire reloads from old_spill to phi
- if(spillinfo->old_spill != NULL) {
+ if
(spillinfo->old_spill != NULL) {
const ir_edge_t *edge, *next;
ir_node *old_spill = spillinfo->old_spill;
const ir_edge_t *edge, *next;
ir_node *old_spill = spillinfo->old_spill;
+ DBG((env->dbg, LEVEL_1, "old spill found, rewiring reloads:\n"));
+
foreach_out_edge_safe(old_spill, edge, next) {
foreach_out_edge_safe(old_spill, edge, next) {
- ir_node* reload = get_edge_src_irn(edge);
+ ir_node *reload = get_edge_src_irn(edge);
+ int pos = get_edge_src_pos(edge);
+
+ DBG((env->dbg, LEVEL_1, "\tset input %d of %+F to %+F\n", pos, reload, spillinfo->spill));
+
assert(be_is_Reload(reload) || is_Phi(reload));
assert(be_is_Reload(reload) || is_Phi(reload));
- set_irn_n(reload,
get_edge_src_pos(edge)
, spillinfo->spill);
+ set_irn_n(reload,
pos
, spillinfo->spill);
}
}
+ DBG((env->dbg, LEVEL_1, "\tset input of %+F to BAD\n", old_spill));
set_irn_n(old_spill, be_pos_Spill_val, new_Bad());
//sched_remove(old_spill);
spillinfo->old_spill = NULL;
set_irn_n(old_spill, be_pos_Spill_val, new_Bad());
//sched_remove(old_spill);
spillinfo->old_spill = NULL;
@@
-415,6
+432,7
@@
static void spill_node(spill_env_t *env, spill_info_t *spillinfo) {
return;
to_spill = spillinfo->spilled_node;
return;
to_spill = spillinfo->spilled_node;
+ assert(sched_is_scheduled(to_spill) && "Node to be spilled must be scheduled!");
if (is_Phi(to_spill) && pset_find_ptr(env->mem_phis, spillinfo->spilled_node)) {
spill_phi(env, spillinfo);
} else {
if (is_Phi(to_spill) && pset_find_ptr(env->mem_phis, spillinfo->spilled_node)) {
spill_phi(env, spillinfo);
} else {
@@
-652,6
+670,8
@@
void be_insert_spills_reloads(spill_env_t *env) {
ir_mode *mode = get_irn_mode(si->spilled_node);
pset *values = pset_new_ptr(16);
ir_mode *mode = get_irn_mode(si->spilled_node);
pset *values = pset_new_ptr(16);
+ DBG((env->dbg, LEVEL_1, "\nhandling all reloaders of %+F:\n", si->spilled_node));
+
/* go through all reloads for this spill */
for (rld = si->reloaders; rld; rld = rld->next) {
ir_node *new_val;
/* go through all reloads for this spill */
for (rld = si->reloaders; rld; rld = rld->next) {
ir_node *new_val;