-static void assign_entities(ss_env_t *ssenv, int n_slots, spill_slot_t *ss[]) {
- int i, offset, frame_align;
- ir_type *frame = get_irg_frame_type(ssenv->cenv->irg);
-
- /* aligning by increasing frame size */
- offset = get_type_size_bits(frame) / 8;
- offset = round_up2(offset, ALIGN_SPILL_AREA);
- set_type_size_bytes(frame, -1);
-
- /* create entities and assign offsets according to size and alignment*/
- for (i = 0; i < n_slots; ++i) {
- char buf[64];
- ident *name;
- entity *spill_ent;
- ir_node *irn;
-
- /* build entity */
- snprintf(buf, sizeof(buf), "spill_slot_%d", i);
- name = new_id_from_str(buf);
-
- spill_ent = new_entity(frame, name, get_spill_type(ssenv->types, ss[i]));
-
- /* align */
- offset = round_up2(offset, ss[i]->align);
- /* set */
- set_entity_offset_bytes(spill_ent, offset);
- /* next possible offset */
- offset += round_up2(ss[i]->size, ss[i]->align);
-
- pset_foreach(ss[i]->members, irn)
- be_set_Spill_entity(irn, spill_ent);
+
+void be_insert_spills_reloads(spill_env_t *env) {
+ const arch_env_t *arch_env = env->arch_env;
+ int remats = 0;
+ int reloads = 0;
+ int spills = 0;
+ spill_info_t *si;
+
+ /* process each spilled node */
+ 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);
+
+ DBG((env->dbg, LEVEL_1, "\nhandling all reloaders of %+F:\n", si->spilled_node));
+
+ /* go through all reloads for this spill */
+ for (rld = si->reloaders; rld; rld = rld->next) {
+ ir_node *new_val;
+
+ if (rld->rematted_node != NULL) {
+ new_val = rld->rematted_node;
+ remats++;
+ sched_add_before(rld->reloader, new_val);
+ }
+ else if (be_do_remats && rld->allow_remat && check_remat_conditions(env, si->spilled_node, rld->reloader)) {
+ new_val = do_remat(env, si->spilled_node, rld->reloader);
+ remats++;
+ }
+ else {
+ /* make sure we have a spill */
+ if (si->spill == NULL) {
+ spill_node(env, si);
+ spills++;
+ }
+
+ /* create a reload */
+ new_val = be_reload(arch_env, si->reload_cls, rld->reloader, mode, si->spill);
+ reloads++;
+ }
+
+ 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->birg->dom_front, env->birg->lv, values, env->mem_phis);
+ }
+
+ del_pset(values);
+
+ si->reloaders = NULL;