becopyilp: fix size_reduction code
[libfirm] / ir / be / bespillslots.c
index dd0f505..ce7e9c1 100644 (file)
@@ -22,7 +22,6 @@
  * @brief       Spillslot coalescer.
  * @author      Matthias Braun
  * @date        26.07.2006
- * @version     $Id$
  */
 #include "config.h"
 
@@ -74,6 +73,8 @@ struct be_fec_env_t {
        affinity_edge_t      **affinity_edges;
        set                   *memperms;
        set_frame_entity_func  set_frame_entity;
+       bool                   at_begin;  /**< frame entities should be allocate at
+                                              the beginning of the stackframe */
 };
 
 /** Compare 2 affinity edges (used in quicksort) */
@@ -197,15 +198,14 @@ void be_node_needs_frame_entity(be_fec_env_t *env, ir_node *node,
                                 const ir_mode *mode, int align)
 {
        ir_node *spillnode = get_memory_edge(node);
-       spill_t *spill;
 
        assert(spillnode != NULL);
 
        /* walk upwards and collect all phis and spills on this way */
        if (is_Phi(spillnode)) {
-               spill = collect_memphi(env, spillnode, mode, align);
+               collect_memphi(env, spillnode, mode, align);
        } else {
-               spill = collect_spill(env, spillnode, mode, align);
+               collect_spill(env, spillnode, mode, align);
        }
 
        ARR_APP1(ir_node *, env->reloads, node);
@@ -367,7 +367,7 @@ static void do_greedy_coalescing(be_fec_env_t *env)
 
        DEBUG_ONLY(
                memset(spilllist, 0, spillcount * sizeof(spilllist[0]));
-       );
+       )
 
        i = 0;
        foreach_set(env->spills, spill_t*, spill) {
@@ -522,17 +522,10 @@ static memperm_t *get_memperm(be_fec_env_t *env, ir_node *block)
 
 static ir_entity* create_stack_entity(be_fec_env_t *env, spill_slot_t *slot)
 {
-       ir_graph *irg  = env->irg;
-       ir_type *frame = get_irg_frame_type(irg);
-       /* TODO: backend should be able to specify wether we want spill slots
-        * at begin or end of frame */
-       int        at_start = 1;
-       ir_entity *res = frame_alloc_area(frame, slot->size, slot->align, at_start);
-
-       /* adjust size of the entity type... */
-       ir_type *enttype = get_entity_type(res);
-       set_type_size_bytes(enttype, slot->size);
-
+       ir_graph  *irg   = env->irg;
+       ir_type   *frame = get_irg_frame_type(irg);
+       ir_entity *res   = frame_alloc_area(frame, slot->size, slot->align,
+                                           env->at_begin);
        slot->entity = res;
 
        return res;
@@ -624,7 +617,7 @@ static void assign_spillslots(be_fec_env_t *env)
                        ir_node *block = get_nodes_block(node);
 
                        /* should be a PhiM */
-                       assert(is_Phi(node));
+                       assert(get_irn_mode(node) == mode_M);
 
                        for (i = 0, arity = get_irn_arity(node); i < arity; ++i) {
                                ir_node *arg = get_irn_n(node, i);
@@ -783,9 +776,11 @@ void be_free_frame_entity_coalescer(be_fec_env_t *env)
 }
 
 void be_assign_entities(be_fec_env_t *env,
-                        set_frame_entity_func set_frame_entity)
+                        set_frame_entity_func set_frame_entity,
+                        bool alloc_entities_at_begin)
 {
        env->set_frame_entity = set_frame_entity;
+       env->at_begin         = alloc_entities_at_begin;
 
        stat_ev_dbl("spillslots", set_count(env->spills));
 
@@ -800,7 +795,7 @@ void be_assign_entities(be_fec_env_t *env,
        create_memperms(env);
 }
 
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillslots);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillslots)
 void be_init_spillslots(void)
 {
        FIRM_DBG_REGISTER(dbg, "firm.be.spillslots");