+ /* process each spilled node */
+ for (si = set_first(env->spills); si; si = set_next(env->spills)) {
+ reloader_t *rld;
+ ir_node *spilled_node = si->spilled_node;
+ ir_mode *mode = get_irn_mode(spilled_node);
+ ir_node **copies = NEW_ARR_F(ir_node*, 0);
+
+ DBG((env->dbg, LEVEL_1, "\nhandling all reloaders of %+F:\n", spilled_node));
+
+ /* go through all reloads for this spill */
+ for (rld = si->reloaders; rld; rld = rld->next) {
+ ir_node *copy; /* a reload is a "copy" of the original value */
+
+ if (rld->rematted_node != NULL) {
+ copy = rld->rematted_node;
+ remats++;
+ sched_add_before(rld->reloader, copy);
+ } else if (be_do_remats && rld->allow_remat &&
+ check_remat_conditions(env, spilled_node, rld->reloader)) {
+ copy = do_remat(env, spilled_node, rld->reloader);
+ remats++;
+ } else {
+ /* make sure we have a spill */
+ if (si->spill == NULL) {
+ spill_node(env, si);
+ spills++;
+ }
+
+ /* create a reload */
+ copy = be_reload(arch_env, si->reload_cls, rld->reloader, mode, si->spill);
+ reloads++;
+ }
+
+ DBG((env->dbg, LEVEL_1, " %+F of %+F before %+F\n",
+ copy, spilled_node, rld->reloader));
+ ARR_APP1(ir_node*, copies, copy);
+ }
+
+ /* if we had any reloads or remats, then we need to reconstruct the
+ * SSA form for the spilled value */
+ if (ARR_LEN(copies) > 0) {
+ be_ssa_construction_env_t senv;
+ /* be_lv_t *lv = be_get_birg_liveness(env->birg); */
+
+ be_ssa_construction_init(&senv, env->birg);
+ be_ssa_construction_add_copy(&senv, spilled_node);
+ be_ssa_construction_add_copies(&senv, copies, ARR_LEN(copies));
+ be_ssa_construction_fix_users(&senv, spilled_node);
+
+#if 0
+ /* no need to enable this as long as we invalidate liveness
+ after this function... */
+ be_ssa_construction_update_liveness_phis(&senv);
+ be_liveness_update(spilled_node);
+ len = ARR_LEN(copies);
+ for(i = 0; i < len; ++i) {
+ be_liveness_update(lv, copies[i]);
+ }
+#endif
+ be_ssa_construction_destroy(&senv);
+ }
+
+ DEL_ARR_F(copies);
+ si->reloaders = NULL;
+ }
+
+#ifdef FIRM_STATISTICS
+ if (be_stat_ev_is_active()) {
+ be_stat_ev("spill_spills", spills);
+ be_stat_ev("spill_reloads", reloads);
+ be_stat_ev("spill_remats", remats);
+ }
+#endif /* FIRM_STATISTICS */