-#else /* BUGGY_REMAT */
-
-/**
- * A very simple rematerialization checker.
- *
- * @param senv the spill environment
- * @param spill the Spill node
- * @param spilled the node that was spilled
- * @param reloader a irn that requires a reload
- */
-static int check_remat_conditions(spill_env_t *senv, ir_node *spill, ir_node *spilled, ir_node *reloader) {
- const arch_env_t *aenv = senv->chordal_env->birg->main_env->arch_env;
-
- return get_irn_arity(spilled) == 0 &&
- be_is_Spill(spill) &&
- arch_irn_is(aenv, spilled, rematerializable);
-}
-
-#endif /* BUGGY_REMAT */
-
-#endif /* REMAT */
-
-/**
- * Re-materialize a node.
- *
- * @param senv the spill environment
- * @param spilled the node that was spilled
- * @param reloader a irn that requires a reload
- */
-static ir_node *do_remat(spill_env_t *senv, ir_node *spilled, ir_node *reloader) {
- ir_node *res;
- ir_node *bl = (is_Block(reloader)) ? reloader : get_nodes_block(reloader);
-
- /* recompute the value */
- res = new_ir_node(get_irn_dbg_info(spilled), senv->chordal_env->irg, bl,
- get_irn_op(spilled),
- get_irn_mode(spilled),
- get_irn_arity(spilled),
- get_irn_in(spilled) + 1);
- copy_node_attr(spilled, res);
-
- DBG((senv->dbg, LEVEL_1, "Insert remat %+F before reloader %+F\n", res, reloader));
-
- /* insert in schedule */
- if (is_Block(reloader)) {
- ir_node *insert = sched_skip(reloader, 0, sched_skip_cf_predicator, (void *) senv->chordal_env->birg->main_env->arch_env);
- sched_add_after(insert, res);
- } else {
- sched_add_before(reloader, res);
- }
-
- return res;
-}
-
-/**
- * Walker: fills the mem_phis set by evaluating Phi nodes
- * using the is_mem_phi() callback.
- */
-static void phi_walker(ir_node *irn, void *env) {
- spill_env_t *senv = env;
-
- if (is_Phi(irn)) {
- const arch_env_t *arch = senv->chordal_env->birg->main_env->arch_env;
- if (arch_irn_has_reg_class(arch, irn, 0, senv->cls) &&
- senv->is_mem_phi(irn, senv->data)) {
- DBG((senv->dbg, LEVEL_1, " %+F\n", irn));
- pset_insert_ptr(senv->mem_phis, irn);
- }
- }
-}
-
-void be_insert_spills_reloads(spill_env_t *senv, pset *reload_set) {
- const arch_env_t *aenv = senv->chordal_env->birg->main_env->arch_env;
- ir_graph *irg = senv->chordal_env->irg;
- unsigned visited_nr;
- ir_node *irn;
- spill_info_t *si;
- pdeq *possibly_dead;
-
- /* get all special spilled phis */
- DBG((senv->dbg, LEVEL_1, "Mem-phis:\n"));
- senv->mem_phis = pset_new_ptr_default();
- irg_walk_graph(senv->chordal_env->irg, phi_walker, NULL, senv);
-
- /* Add reloads for mem_phis */
- /* BETTER: These reloads (1) should only be inserted, if they are really needed */
- DBG((senv->dbg, LEVEL_1, "Reloads for mem-phis:\n"));
- for(irn = pset_first(senv->mem_phis); irn; irn = pset_next(senv->mem_phis)) {
- const ir_edge_t *e;
- DBG((senv->dbg, LEVEL_1, " Mem-phi %+F\n", irn));
- foreach_out_edge(irn, e) {
- ir_node *user = e->src;
- if (is_Phi(user) && !pset_find_ptr(senv->mem_phis, user)) {
- ir_node *use_bl = get_nodes_block(user);
- DBG((senv->dbg, LEVEL_1, " non-mem-phi user %+F\n", user));
- be_add_reload_on_edge(senv, irn, use_bl, e->pos); /* (1) */
- }
- }
- }
-
- visited_nr = get_irg_visited(irg) + 1;
- set_irg_visited(irg, visited_nr);
-
- /* process each spilled node */
- DBG((senv->dbg, LEVEL_1, "Insert spills and reloads:\n"));
- possibly_dead = new_pdeq();
- for(si = set_first(senv->spills); si; si = set_next(senv->spills)) {
- reloader_t *rld;
- ir_mode *mode = get_irn_mode(si->spilled_node);
- pset *values = pset_new_ptr(16);
-
- /* go through all reloads for this spill */
- for(rld = si->reloaders; rld; rld = rld->next) {
- ir_node *new_val;
-
- /* the spill for this reloader */
- ir_node *spill = be_spill_node(senv, si->spilled_node, visited_nr);
-
-#ifdef REMAT
- if (check_remat_conditions(senv, spill, si->spilled_node, rld->reloader)) {
- new_val = do_remat(senv, si->spilled_node, rld->reloader);
- pdeq_putl(possibly_dead, spill);
- }
- else
-#endif
- /* do a reload */
- new_val = be_reload(aenv, senv->cls, rld->reloader, mode, spill);
-
- DBG((senv->dbg, LEVEL_1, " %+F of %+F before %+F\n", new_val, si->spilled_node, rld->reloader));
- pset_insert_ptr(values, new_val);
- if(reload_set)
- pset_insert_ptr(reload_set, new_val);
- }
-
- /* introduce copies, rewire the uses */
- assert(pset_count(values) > 0 && "???");
- pset_insert_ptr(values, si->spilled_node);
- be_ssa_constr_set_ignore(senv->chordal_env->dom_front, values, senv->mem_phis);
-
- del_pset(values);
- }
-
- foreach_pset(senv->mem_phis, irn) {
- int i, n;
- for (i = 0, n = get_irn_arity(irn); i < n; ++i) {
- pdeq_putl(possibly_dead, get_irn_n(irn, i));
- set_irn_n(irn, i, new_r_Bad(senv->chordal_env->irg));
- }
- sched_remove(irn);
- }
-
- /* check if possibly dead nodes are really dead yet */
- while (! pdeq_empty(possibly_dead)) {
- ir_node *irn = pdeq_getr(possibly_dead);
- const ir_edge_t *edge = get_irn_out_edge_first(irn);
-
- if (! edge) {
- int i;
- for (i = get_irn_arity(irn) - 1; i >= 0; --i) {
- pdeq_putl(possibly_dead, get_irn_n(irn, i));
- set_irn_n(irn, i, new_r_Bad(senv->chordal_env->irg));
- }
- sched_remove(irn);
- }