projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Bugfix of hack: liveness ana for perm insertion.
[libfirm]
/
ir
/
be
/
benode.c
diff --git
a/ir/be/benode.c
b/ir/be/benode.c
index
c5feacc
..
8539249
100644
(file)
--- a/
ir/be/benode.c
+++ b/
ir/be/benode.c
@@
-329,11
+329,19
@@
ir_node *insert_Perm_after(const be_main_session_env_t *env,
firm_dbg_module_t *dbg = firm_dbg_register("firm.be.node");
int i, n;
firm_dbg_module_t *dbg = firm_dbg_register("firm.be.node");
int i, n;
+ firm_dbg_set_mask(dbg, -1);
DBG((dbg, LEVEL_1, "Insert Perm after: %+F\n", pos));
sched_foreach_reverse(bl, irn) {
ir_node *x;
DBG((dbg, LEVEL_1, "Insert Perm after: %+F\n", pos));
sched_foreach_reverse(bl, irn) {
ir_node *x;
+ /*
+ * If we encounter the node we want to insert the Perm after,
+ * exit immediately, so that this node is still live
+ */
+ if(irn == pos)
+ break;
+
DBG((dbg, LEVEL_1, "%+F\n", irn));
for(x = pset_first(live); x; x = pset_next(live))
DBG((dbg, LEVEL_1, "\tlive: %+F\n", x));
DBG((dbg, LEVEL_1, "%+F\n", irn));
for(x = pset_first(live); x; x = pset_next(live))
DBG((dbg, LEVEL_1, "\tlive: %+F\n", x));
@@
-341,14
+349,6
@@
ir_node *insert_Perm_after(const be_main_session_env_t *env,
if(arch_irn_has_reg_class(arch_env, irn, arch_pos_make_out(0), cls))
pset_remove_ptr(live, irn);
if(arch_irn_has_reg_class(arch_env, irn, arch_pos_make_out(0), cls))
pset_remove_ptr(live, irn);
- /*
- * Consider the definition of the node, but not the uses, since
- * newly created liveranges by the node after which the perm is
- * located are not of interest for the perm.
- */
- if(irn == pos)
- break;
-
for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
ir_node *op = get_irn_n(irn, i);
for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
ir_node *op = get_irn_n(irn, i);
@@
-360,8
+360,11
@@
ir_node *insert_Perm_after(const be_main_session_env_t *env,
n = pset_count(live);
nodes = malloc(n * sizeof(nodes[0]));
n = pset_count(live);
nodes = malloc(n * sizeof(nodes[0]));
- for(irn = pset_first(live), i = 0; irn; irn = pset_next(live), i++)
+ DBG((dbg, LEVEL_1, "live:\n"));
+ for(irn = pset_first(live), i = 0; irn; irn = pset_next(live), i++) {
+ DBG((dbg, LEVEL_1, "\t%+F\n", irn));
nodes[i] = irn;
nodes[i] = irn;
+ }
perm = new_Perm(env->main_env->node_factory, cls, irg, bl, n, nodes);
sched_add_after(pos, perm);
perm = new_Perm(env->main_env->node_factory, cls, irg, bl, n, nodes);
sched_add_after(pos, perm);
@@
-371,11
+374,11
@@
ir_node *insert_Perm_after(const be_main_session_env_t *env,
for(i = 0; i < n; ++i) {
ir_node *copies[1];
ir_node *perm_op = get_irn_n(perm, i);
for(i = 0; i < n; ++i) {
ir_node *copies[1];
ir_node *perm_op = get_irn_n(perm, i);
- const arch_register_t *reg = arch_get_irn_register(arch_env, perm_op,
arch_pos_make_out(0)
);
+ const arch_register_t *reg = arch_get_irn_register(arch_env, perm_op,
0
);
ir_mode *mode = get_irn_mode(perm_op);
ir_node *proj = new_r_Proj(irg, bl, perm, mode, i);
ir_mode *mode = get_irn_mode(perm_op);
ir_node *proj = new_r_Proj(irg, bl, perm, mode, i);
- arch_set_irn_register(arch_env, proj,
arch_pos_make_out(0)
, reg);
+ arch_set_irn_register(arch_env, proj,
0
, reg);
sched_add_after(curr, proj);
curr = proj;
sched_add_after(curr, proj);
curr = proj;