-/**
- * 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 *env, ir_node *spilled, ir_node *reloader) {
- int i, arity;
- ir_node *res;
- ir_node *bl = get_nodes_block(reloader);
- ir_node **ins;
-
- ins = alloca(get_irn_arity(spilled) * sizeof(ins[0]));
- for(i = 0, arity = get_irn_arity(spilled); i < arity; ++i) {
- ir_node *arg = get_irn_n(spilled, i);
-
- if(is_value_available(env, arg, reloader)) {
- ins[i] = arg;
- } else {
- ins[i] = do_remat(env, arg, reloader);
- }
- }
-
- /* create a copy of the node */
- res = new_ir_node(get_irn_dbg_info(spilled), env->chordal_env->irg, bl,
- get_irn_op(spilled),
- get_irn_mode(spilled),
- get_irn_arity(spilled),
- ins);
- copy_node_attr(spilled, res);
-
- DBG((env->dbg, LEVEL_1, "Insert remat %+F before reloader %+F\n", res, reloader));
-
- /* insert in schedule */
- assert(!is_Block(reloader));
- sched_add_before(reloader, res);
-
- return res;
-}
-
-/*
- * ___ _ ____ _ _
- * |_ _|_ __ ___ ___ _ __| |_ | _ \ ___| | ___ __ _ __| |___
- * | || '_ \/ __|/ _ \ '__| __| | |_) / _ \ |/ _ \ / _` |/ _` / __|
- * | || | | \__ \ __/ | | |_ | _ < __/ | (_) | (_| | (_| \__ \
- * |___|_| |_|___/\___|_| \__| |_| \_\___|_|\___/ \__,_|\__,_|___/
- *
- */
-
-void be_insert_spills_reloads(spill_env_t *env) {
- const arch_env_t *arch_env = env->arch_env;
- spill_info_t *si;
-
- /* process each spilled node */
- DBG((env->dbg, LEVEL_1, "Insert spills and reloads:\n"));
- for(si = set_first(env->spills); si; si = set_next(env->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;
-
- if (check_remat_conditions(env, si->spilled_node, rld->reloader)) {
- new_val = do_remat(env, si->spilled_node, rld->reloader);
- } else {
- /* make sure we have a spill */
- spill_node(env, si);
-
- /* do a reload */
- new_val = be_reload(arch_env, env->cls, rld->reloader, mode, si->spill);
- }
-
- DBG((env->dbg, LEVEL_1, " %+F of %+F before %+F\n", new_val, si->spilled_node, rld->reloader));
- pset_insert_ptr(values, new_val);
- }
-
- if(pset_count(values) > 0) {
- /* introduce copies, rewire the uses */
- pset_insert_ptr(values, si->spilled_node);
- be_ssa_constr_set_ignore(env->chordal_env->dom_front, env->chordal_env->lv, values, env->mem_phis);
- }
-
- del_pset(values);
- }