- return res;
-}
-
-void be_spill_phi(spill_env_t *env, ir_node *node) {
- assert(is_Phi(node));
-
- pset_insert_ptr(env->mem_phis, node);
-}
-
-void be_insert_spills_reloads(spill_env_t *env) {
- const arch_env_t *arch_env = env->chordal_env->birg->main_env->arch_env;
- ir_node *node;
- spill_info_t *si;
-
- DBG((env->dbg, LEVEL_1, "Reloads for mem-phis:\n"));
- foreach_pset(env->mem_phis, node) {
- const ir_edge_t *e;
- int i, arity;
-
- assert(is_Phi(node));
-
- /* We have to place copy nodes in the predecessor blocks to temporarily
- * produce new values that get separate spill slots
- */
- for(i = 0, arity = get_irn_arity(node); i < arity; ++i) {
- ir_node *pred_block, *arg, *copy;
-
- /* Don't do anything for looping edges (there's no need
- * and placing copies here breaks stuff as it suddenly
- * generates new living values through the whole loop)
- */
- arg = get_irn_n(node, i);
- if(arg == node)
- continue;
-
- pred_block = get_Block_cfgpred_block(get_nodes_block(node), i);
- copy = insert_copy(env, pred_block, arg);
-
- set_irn_n(node, i, copy);
- }
-
- /* Add reloads for mem_phis */
- /* BETTER: These reloads (1) should only be inserted, if they are really needed */
- DBG((env->dbg, LEVEL_1, " Mem-phi %+F\n", node));
- foreach_out_edge(node, e) {
- ir_node *user = e->src;
- if (is_Phi(user) && !pset_find_ptr(env->mem_phis, user)) {
- ir_node *use_bl = get_nodes_block(user);
- DBG((env->dbg, LEVEL_1, " non-mem-phi user %+F\n", user));
- be_add_reload_on_edge(env, node, use_bl, e->pos); /* (1) */
- }
+ 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);
+#ifdef FIRM_STATISTICS
+ /* don't count the recursive call as remat */
+ env->remat_count--;
+#endif