- /* We have to reload the value in pred-block */
- predblock = get_Block_cfgpred_block(block, pos);
- last = sched_last(predblock);
-
- /* we might have projs and keepanys behind the jump... */
- while(is_Proj(last) || be_is_Keep(last)) {
- last = sched_prev(last);
- assert(!sched_is_end(last));
- }
- assert(is_cfop(last));
-
- // add the reload before the (cond-)jump
- be_add_reload(env, to_spill, last);
-}
-
-void be_spill_phi(spill_env_t *env, ir_node *node) {
- int i, arity;
-
- assert(is_Phi(node));
-
- pset_insert_ptr(env->mem_phis, node);
-
- // create spillinfos for the phi arguments
- get_spillinfo(env, node);
- for(i = 0, arity = get_irn_arity(node); i < arity; ++i) {
- ir_node *arg = get_irn_n(node, i);
- get_spillinfo(env, arg);
- }
-}
-
-/*
- * ____ _ ____ _ _ _
- * / ___|_ __ ___ __ _| |_ ___ / ___| _ __ (_) | |___
- * | | | '__/ _ \/ _` | __/ _ \ \___ \| '_ \| | | / __|
- * | |___| | | __/ (_| | || __/ ___) | |_) | | | \__ \
- * \____|_| \___|\__,_|\__\___| |____/| .__/|_|_|_|___/
- * |_|
- */
-
-/**
- * Schedules a node after an instruction. (That is the place after all projs and phis
- * that are scheduled after the instruction)
- * This function also skips phi nodes at the beginning of a block
- */
-static void sched_add_after_insn(ir_node *sched_after, ir_node *node) {
- ir_node *next = sched_next(sched_after);
- while(is_Proj(next) || is_Phi(next)) {
- next = sched_next(next);
- }
- assert(next != NULL);
-
- if(sched_is_end(next)) {
- sched_add_after(sched_last(get_nodes_block(sched_after)), node);
- } else {
- sched_add_before(next, node);
- }
-}
-
-/**
- * Creates a spill.
- *
- * @param senv the spill environment
- * @param irn the node that should be spilled
- * @param ctx_irn an user of the spilled node
- *
- * @return a be_Spill node
- */
-static void spill_irn(spill_env_t *env, spill_info_t *spillinfo) {
- ir_node *to_spill = spillinfo->spilled_node;
-
- DBG((env->dbg, LEVEL_1, "%+F\n", to_spill));
-
- /* Trying to spill an already spilled value, no need for a new spill
- * node then, we can simply connect to the same one for this reload
- *
- * (although rematerialization code should handle most of these cases
- * this can still happen when spilling Phis)