ir_graph *const irg = get_irn_irg(irn);
ir_node *const block = get_nodes_block(irn);
int const arity = get_irn_arity(irn);
- reg_pair_t *const pairs = alloca(arity * sizeof(pairs[0]));
+ reg_pair_t *const pairs = ALLOCAN(reg_pair_t, arity);
int keep_perm = 0;
int do_copy = env->do_copy;
/* Get the schedule predecessor node to the perm.
ir_node *keep, *cpy;
op_copy_assoc_t *entry;
- if (arch_irn_is(other_different, ignore) ||
+ if (arch_irn_is_ignore(other_different) ||
!mode_is_datab(get_irn_mode(other_different))) {
DBG((dbg_constr, LEVEL_1, "ignore constraint for %+F because other_irn is ignore or not a datab node\n", irn));
return;
irg = be_get_birg_irg(env->birg);
op_set = &env->op_set;
block = get_nodes_block(irn);
- cls = arch_get_irn_reg_class(other_different, -1);
+ cls = arch_get_irn_reg_class_out(other_different);
/* Make a not spillable copy of the different node */
/* this is needed because the different irn could be */
cpy = find_copy(skip_Proj(irn), other_different);
if (! cpy) {
cpy = be_new_Copy(cls, irg, block, other_different);
- be_node_set_flags(cpy, BE_OUT_POS(0), arch_irn_flags_dont_spill);
+ arch_irn_set_flags(cpy, arch_irn_flags_dont_spill);
DBG((dbg_constr, LEVEL_1, "created non-spillable %+F for value %+F\n", cpy, other_different));
} else {
DBG((dbg_constr, LEVEL_1, "using already existing %+F for value %+F\n", cpy, other_different));
/* of the other_different irn in case of CopyKeep. */
if (has_irn_users(other_different)) {
keep = be_new_CopyKeep_single(cls, irg, block, cpy, irn, get_irn_mode(other_different));
- be_node_set_reg_class(keep, 1, cls);
+ be_node_set_reg_class_in(keep, 1, cls);
} else {
ir_node *in[2];
* @param env the constraint environment
*/
static void assure_different_constraints(ir_node *irn, ir_node *skipped_irn, constraint_env_t *env) {
- const arch_register_req_t *req = arch_get_register_req(irn, -1);
+ const arch_register_req_t *req = arch_get_register_req_out(irn);
if (arch_register_req_is(req, must_be_different)) {
const unsigned other = req->other_different;
/* set register class for all kept inputs */
for (j = 1; j <= n_melt; ++j)
- be_node_set_reg_class(new_ck, j, entry->cls);
+ be_node_set_reg_class_in(new_ck, j, entry->cls);
ir_nodeset_insert(&entry->copies, new_ck);
void assure_constraints(be_irg_t *birg) {
ir_graph *irg = be_get_birg_irg(birg);
constraint_env_t cenv;
- ir_node **nodes;
ir_nodemap_iterator_t map_iter;
ir_nodemap_entry_t map_entry;
/* for all */
foreach_ir_nodemap(&cenv.op_set, map_entry, map_iter) {
- op_copy_assoc_t *entry = map_entry.data;
- int n;
- ir_node *cp;
- ir_nodeset_iterator_t iter;
+ op_copy_assoc_t *entry = map_entry.data;
+ int n = ir_nodeset_size(&entry->copies);
+ ir_node **nodes = ALLOCAN(ir_node*, n);
+ ir_node *cp;
+ ir_nodeset_iterator_t iter;
be_ssa_construction_env_t senv;
- n = ir_nodeset_size(&entry->copies);
- nodes = alloca(n * sizeof(nodes[0]));
-
/* put the node in an array */
DBG((dbg_constr, LEVEL_1, "introduce copies for %+F ", map_entry.node));
/* so we transform unnecessary ones into Keeps. */
foreach_ir_nodeset(&entry->copies, cp, iter) {
if (be_is_CopyKeep(cp) && get_irn_n_edges(cp) < 1) {
- ir_node *keep;
- int n = get_irn_arity(cp);
+ const arch_register_class_t *cls = arch_get_irn_reg_class_out(cp);
+ int n = get_irn_arity(cp);
+ ir_node *keep;
- keep = be_new_Keep(arch_get_irn_reg_class(cp, -1),
- irg, get_nodes_block(cp), n, get_irn_in(cp) + 1);
+ keep = be_new_Keep(cls, irg, get_nodes_block(cp), n, get_irn_in(cp) + 1);
sched_add_before(cp, keep);
/* Set all ins (including the block) of the CopyKeep BAD to keep the verifier happy. */
int n_moved;
int new_size;
ir_node *frontier = bl;
-
+ ir_node *irn;
int i, n;
- const ir_edge_t *edge;
- ir_node *one_proj = NULL, *irn;
- const arch_register_class_t *cls = NULL;
-
- DBG((dbg_permmove, LEVEL_1, "perm move %+F irg %+F\n", perm, irg));
/* get some Proj and find out the register class of that Proj. */
- edge = get_irn_out_edge_first_kind(perm, EDGE_KIND_NORMAL);
- one_proj = get_edge_src_irn(edge);
+ const ir_edge_t *edge = get_irn_out_edge_first_kind(perm, EDGE_KIND_NORMAL);
+ ir_node *one_proj = get_edge_src_irn(edge);
+ const arch_register_class_t *cls = arch_get_irn_reg_class_out(one_proj);
assert(is_Proj(one_proj));
- cls = arch_get_irn_reg_class(one_proj, -1);
+
+ DBG((dbg_permmove, LEVEL_1, "perm move %+F irg %+F\n", perm, irg));
/* Find the point in the schedule after which the
* potentially movable nodes must be defined.
break;
if (arch_irn_is(node, modify_flags))
break;
- if (is_Proj(node)) {
- req = arch_get_register_req(get_Proj_pred(node),
- -1 - get_Proj_proj(node));
- } else {
- req = arch_get_register_req(node, -1);
- }
+ req = arch_get_register_req_out(node);
if (req->type != arch_register_req_type_normal)
break;
for (i = get_irn_arity(node) - 1; i >= 0; --i) {
new_size = arity - n_moved;
if(new_size == 0) {
+ sched_remove(perm);
+ kill_node(perm);
return 0;
}
- map = alloca(new_size * sizeof(map[0]));
- proj_map = alloca(arity * sizeof(proj_map[0]));
+ map = ALLOCAN(int, new_size);
+ proj_map = ALLOCAN(int, arity);
memset(proj_map, -1, sizeof(proj_map[0]));
n = 0;
for (i = 0; i < arity; ++i) {