projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added support for SymConst(ofs_ent)
[libfirm]
/
ir
/
be
/
belower.c
diff --git
a/ir/be/belower.c
b/ir/be/belower.c
index
44080ec
..
0ff5504
100644
(file)
--- a/
ir/be/belower.c
+++ b/
ir/be/belower.c
@@
-23,6
+23,7
@@
#include "bechordal_t.h"
#include "besched_t.h"
#include "bestat.h"
#include "bechordal_t.h"
#include "besched_t.h"
#include "bestat.h"
+#include "benodesets.h"
#include "irgmod.h"
#include "iredges_t.h"
#include "irgmod.h"
#include "iredges_t.h"
@@
-36,7
+37,7
@@
#endif
#undef is_Perm
#endif
#undef is_Perm
-#define is_Perm(arch_env, irn) (arch_irn_class
ify(arch_env, irn) == arch_irn_class_perm
)
+#define is_Perm(arch_env, irn) (arch_irn_class
_is(arch_env, irn, perm)
)
/* associates op with it's copy and CopyKeep */
typedef struct {
/* associates op with it's copy and CopyKeep */
typedef struct {
@@
-269,8
+270,9
@@
static void lower_perm_node(ir_node *irn, void *walk_env) {
const arch_register_class_t *reg_class;
const arch_env_t *arch_env;
lower_env_t *env = walk_env;
const arch_register_class_t *reg_class;
const arch_env_t *arch_env;
lower_env_t *env = walk_env;
- int real_size = 0;
- int n, i, pn, do_copy, j, n_ops;
+ int real_size = 0;
+ int keep_perm = 0;
+ int n, i, pn, do_copy, j, n_ops;
reg_pair_t *pairs;
const ir_edge_t *edge;
perm_cycle_t *cycle;
reg_pair_t *pairs;
const ir_edge_t *edge;
perm_cycle_t *cycle;
@@
-336,6
+338,7
@@
static void lower_perm_node(ir_node *irn, void *walk_env) {
/* reroute the edges from the proj to the argument */
edges_reroute(pairs[i].out_node, pairs[i].in_node, env->chord_env->irg);
/* reroute the edges from the proj to the argument */
edges_reroute(pairs[i].out_node, pairs[i].in_node, env->chord_env->irg);
+ set_irn_n(pairs[i].out_node, 0, new_Bad());
pairs[i].checked = 1;
}
pairs[i].checked = 1;
}
@@
-365,11
+368,14
@@
static void lower_perm_node(ir_node *irn, void *walk_env) {
}
DB((mod, LEVEL_1, "\n"));
}
DB((mod, LEVEL_1, "\n"));
- /* We don't need to do anything if we have a Perm with two
+ /*
+ We don't need to do anything if we have a Perm with two
elements which represents a cycle, because those nodes
elements which represents a cycle, because those nodes
- already represent exchange nodes */
+ already represent exchange nodes
+ */
if (n == 2 && cycle->type == PERM_CYCLE) {
free(cycle);
if (n == 2 && cycle->type == PERM_CYCLE) {
free(cycle);
+ keep_perm = 1;
continue;
}
continue;
}
@@
-493,10
+499,14
@@
static void lower_perm_node(ir_node *irn, void *walk_env) {
free(cycle);
}
free(cycle);
}
-
-
/* remove the perm from schedule */
/* remove the perm from schedule */
- sched_remove(irn);
+ if (! keep_perm) {
+ int arity = get_irn_arity(irn);
+ for(i = 0; i < arity; ++i) {
+ set_irn_n(irn, i, new_Bad());
+ }
+ sched_remove(irn);
+ }
}
}
@@
-518,20
+528,6
@@
static ir_node *belower_skip_proj(ir_node *irn) {
return irn;
}
return irn;
}
-static void fix_in(ir_node *irn, ir_node *old, ir_node *nw) {
- int i, n;
-
- irn = belower_skip_proj(irn);
- n = get_irn_arity(irn);
-
- for (i = 0; i < n; i++) {
- if (get_irn_n(irn, i) == old) {
- set_irn_n(irn, i, nw);
- break;
- }
- }
-}
-
static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, constraint_env_t *env) {
be_irg_t *birg = env->birg;
pset *op_set = env->op_set;
static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, constraint_env_t *env) {
be_irg_t *birg = env->birg;
pset *op_set = env->op_set;
@@
-579,7
+575,7
@@
static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different,
/* insert the other different and it's copies into the set */
key.op = other_different;
key.copies = NULL;
/* insert the other different and it's copies into the set */
key.op = other_different;
key.copies = NULL;
- entry = pset_find(op_set, &key,
HASH_PTR
(other_different));
+ entry = pset_find(op_set, &key,
nodeset_hash
(other_different));
if (! entry) {
entry = obstack_alloc(&env->obst, sizeof(*entry));
if (! entry) {
entry = obstack_alloc(&env->obst, sizeof(*entry));
@@
-594,7
+590,7
@@
static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different,
if (be_is_CopyKeep(keep))
pset_insert_ptr(entry->copies, keep);
if (be_is_CopyKeep(keep))
pset_insert_ptr(entry->copies, keep);
- pset_insert(op_set, entry,
HASH_PTR
(other_different));
+ pset_insert(op_set, entry,
nodeset_hash
(other_different));
DBG((mod, LEVEL_1, "created %+F for %+F to assure should_be_different\n", keep, irn));
}
DBG((mod, LEVEL_1, "created %+F for %+F to assure should_be_different\n", keep, irn));
}
@@
-685,7
+681,7
@@
void assure_constraints(be_irg_t *birg) {
DB((mod, LEVEL_1, "\n"));
/* introduce the copies for the operand and it's copies */
DB((mod, LEVEL_1, "\n"));
/* introduce the copies for the operand and it's copies */
- be_ssa_constr(dom, n, nodes);
+ be_ssa_constr(dom,
NULL,
n, nodes);
/* Could be that not all CopyKeeps are really needed, */
/* Could be that not all CopyKeeps are really needed, */
@@
-698,11
+694,11
@@
void assure_constraints(be_irg_t *birg) {
keep = be_new_Keep(arch_get_irn_reg_class(birg->main_env->arch_env, cp, -1),
birg->irg, get_nodes_block(cp), n, (ir_node **)&get_irn_in(cp)[1]);
sched_add_before(cp, keep);
keep = be_new_Keep(arch_get_irn_reg_class(birg->main_env->arch_env, cp, -1),
birg->irg, get_nodes_block(cp), n, (ir_node **)&get_irn_in(cp)[1]);
sched_add_before(cp, keep);
- sched_remove(cp);
/* Set all ins (including the block) of the CopyKeep BAD to keep the verifier happy. */
while (--n >= -1)
/* Set all ins (including the block) of the CopyKeep BAD to keep the verifier happy. */
while (--n >= -1)
- set_irn_n(cp, n, get_irg_bad(birg->irg));
+ set_irn_n(cp, n, new_Bad());
+ sched_remove(cp);
}
}
}
}