fix a bunch of warnings reported by cparser
[libfirm] / ir / be / bespillslots.c
index 4d57cbe..b5a78e1 100644 (file)
@@ -74,6 +74,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 +199,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);
@@ -522,12 +523,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);
+       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);
 
        /* adjust size of the entity type... */
        ir_type *enttype = get_entity_type(res);
@@ -591,7 +590,7 @@ static void assign_spillslots(be_fec_env_t *env)
        int           spillcount = set_count(env->spills);
        spill_slot_t *spillslots = ALLOCANZ(spill_slot_t, spillcount);
        spill_t      *spill;
-       int           i;
+       size_t        i;
 
        /* construct spillslots */
        foreach_set(env->spills, spill_t*, spill) {
@@ -783,9 +782,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,44 +801,7 @@ void be_assign_entities(be_fec_env_t *env,
        create_memperms(env);
 }
 
-/**
- * This walker function searches for reloads and collects all the spills
- * and memphis attached to them.
- */
-static void collect_spills_walker(ir_node *node, void *data)
-{
-       be_fec_env_t                *env = (be_fec_env_t*)data;
-       const ir_mode               *mode;
-       const arch_register_class_t *cls;
-       int                          align;
-       ir_graph                    *irg;
-       const arch_env_t            *arch_env;
-
-       if (! (arch_irn_classify(node) & arch_irn_class_reload))
-               return;
-
-       mode     = get_irn_mode(node);
-       cls      = arch_get_irn_reg_class_out(node);
-       irg      = get_irn_irg(node);
-       arch_env = be_get_irg_arch_env(irg);
-       align    = arch_env_get_reg_class_alignment(arch_env, cls);
-
-       be_node_needs_frame_entity(env, node, mode, align);
-}
-
-void be_coalesce_spillslots(ir_graph *irg)
-{
-       be_fec_env_t *env = be_new_frame_entity_coalescer(irg);
-
-       /* collect reloads */
-       irg_walk_graph(irg, NULL, collect_spills_walker, env);
-
-       be_assign_entities(env, be_node_set_frame_entity);
-
-       be_free_frame_entity_coalescer(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");