- implemented apply phase
[libfirm] / ir / be / bespill.c
index 937adcd..2746cb0 100644 (file)
@@ -24,9 +24,7 @@
  * @date               29.09.2005
  * @version     $Id$
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include <stdlib.h>
 #include <stdbool.h>
@@ -446,7 +444,7 @@ static void spill_irn(spill_env_t *env, spill_info_t *spillinfo)
 
                after = skip_keeps_phis(after);
 
-               spill->spill   = be_spill(env->arch_env, block, to_spill);
+               spill->spill = be_spill(block, to_spill);
                sched_add_after(after, spill->spill);
                DB((dbg, LEVEL_1, "\t%+F after %+F\n", spill->spill, after));
 #ifdef FIRM_STATISTICS
@@ -485,7 +483,7 @@ static void spill_phi(spill_env_t *env, spill_info_t *spillinfo)
 
        /* build a new PhiM */
        arity   = get_irn_arity(phi);
-       ins     = alloca(sizeof(ir_node*) * arity);
+       ins     = ALLOCAN(ir_node*, arity);
        unknown = new_r_Unknown(irg, mode_M);
        for(i = 0; i < arity; ++i) {
                ins[i] = unknown;
@@ -564,39 +562,19 @@ static int is_value_available(spill_env_t *env, const ir_node *arg,
        if(arg == get_irg_frame(env->irg))
                return 1;
 
+#if 0
        /* hack for now (happens when command should be inserted at end of block) */
-       if(is_Block(reloader)) {
+       if(is_Block(reloader))
                return 0;
-       }
+#else
+       (void)reloader;
+#endif
 
        /*
         * Ignore registers are always available
         */
-       if (arch_irn_is(arg, ignore)) {
-               return 1;
-       }
-
-       /* the following test does not work while spilling,
-        * because the liveness info is not adapted yet to the effects of the
-        * additional spills/reloads.
-        */
-#if 0
-       /* we want to remat before the insn reloader
-        * thus an arguments is alive if
-        *   - it interferes with the reloaders result
-        *   - or it is (last-) used by reloader itself
-        */
-       if (values_interfere(env->birg->lv, reloader, arg)) {
+       if (arch_irn_is_ignore(arg))
                return 1;
-       }
-
-       arity = get_irn_arity(reloader);
-       for (i = 0; i < arity; ++i) {
-               ir_node *rel_arg = get_irn_n(reloader, i);
-               if (rel_arg == arg)
-                       return 1;
-       }
-#endif
 
        return 0;
 }
@@ -642,6 +620,10 @@ static int check_remat_conditions_costs(spill_env_t *env,
        if(parentcosts + costs >= env->reload_cost + env->spill_cost) {
                return REMAT_COST_INFINITE;
        }
+       /* never rematerialize a node which modifies the flags.
+        * (would be better to test wether the flags are actually live at point
+        * reloader...)
+        */
        if (arch_irn_is(spilled, modify_flags)) {
                return REMAT_COST_INFINITE;
        }
@@ -691,7 +673,7 @@ static ir_node *do_remat(spill_env_t *env, ir_node *spilled, ir_node *reloader)
                bl = get_nodes_block(reloader);
        }
 
-       ins = alloca(get_irn_arity(spilled) * sizeof(ins[0]));
+       ins = ALLOCAN(ir_node*, get_irn_arity(spilled));
        for(i = 0, arity = get_irn_arity(spilled); i < arity; ++i) {
                ir_node *arg = get_irn_n(spilled, i);
 
@@ -837,7 +819,7 @@ static void determine_spill_costs(spill_env_t *env, spill_info_t *spillinfo)
                spill_t *s;
                double   spills_execfreq;
 
-               /* calculate sum of executaion frequencies of individual spills */
+               /* calculate sum of execution frequencies of individual spills */
                spills_execfreq = 0;
                s               = spillinfo->spills;
                for( ; s != NULL; s = s->next) {
@@ -906,7 +888,6 @@ void make_spill_locations_dominate_irn(spill_env_t *env, ir_node *irn)
 
 void be_insert_spills_reloads(spill_env_t *env)
 {
-       const arch_env_t      *arch_env  = env->arch_env;
        const ir_exec_freq    *exec_freq = env->exec_freq;
        spill_info_t          *si;
        ir_nodeset_iterator_t  iter;
@@ -1009,7 +990,7 @@ void be_insert_spills_reloads(spill_env_t *env)
                                /* create a reload, use the first spill for now SSA
                                 * reconstruction for memory comes below */
                                assert(si->spills != NULL);
-                               copy = be_reload(arch_env, si->reload_cls, rld->reloader, mode,
+                               copy = be_reload(si->reload_cls, rld->reloader, mode,
                                                 si->spills->spill);
 #ifdef FIRM_STATISTICS
                                env->reload_count++;