- reserve the visited resource
[libfirm] / ir / be / beflags.c
index 9787b20..af2525c 100644 (file)
@@ -35,9 +35,7 @@
  * spilled. So in some situations (for example 2 adc-nodes that use the flags of
  * a single add node on x86) operations have to be repeated to work correctly.
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include "irgwalk.h"
 #include "irnode_t.h"
@@ -53,7 +51,6 @@
 #include "besched_t.h"
 #include "benode_t.h"
 
-static const arch_env_t            *arch_env   = NULL;
 static const arch_register_class_t *flag_class = NULL;
 static const arch_register_t       *flags_reg  = NULL;
 static func_rematerialize           remat      = NULL;
@@ -75,7 +72,7 @@ static ir_node *default_remat(ir_node *node, ir_node *after)
 }
 
 /**
- * tests wether we can legally move node node after node after
+ * tests whether we can legally move node node after node after
  * (only works for nodes in same block)
  */
 static int can_move(ir_node *node, ir_node *after)
@@ -185,7 +182,7 @@ static void rematerialize_or_move(ir_node *flags_needed, ir_node *node,
 static int is_modify_flags(ir_node *node) {
        int i, arity;
 
-       if(arch_irn_is(arch_env, node, modify_flags))
+       if (arch_irn_is(node, modify_flags))
                return 1;
        if(!be_is_Keep(node))
                return 0;
@@ -194,7 +191,7 @@ static int is_modify_flags(ir_node *node) {
        for(i = 0; i < arity; ++i) {
                ir_node *in = get_irn_n(node, i);
                in = skip_Proj(in);
-               if(arch_irn_is(arch_env, in, modify_flags))
+               if (arch_irn_is(in, modify_flags))
                        return 1;
        }
 
@@ -239,8 +236,7 @@ static void fix_flags_walker(ir_node *block, void *env)
                /* test whether the current node needs flags */
                arity = get_irn_arity(node);
                for(i = 0; i < arity; ++i) {
-                       const arch_register_class_t *cls
-                               = arch_get_irn_reg_class(arch_env, node, i);
+                       const arch_register_class_t *cls = arch_get_irn_reg_class(node, i);
                        if(cls == flag_class) {
                                assert(new_flags_needed == NULL);
                                new_flags_needed = get_irn_n(node, i);
@@ -251,7 +247,7 @@ static void fix_flags_walker(ir_node *block, void *env)
                        continue;
 
                /* spiller can't (correctly) remat flag consumers at the moment */
-               assert(!arch_irn_is(arch_env, node, rematerializable));
+               assert(!arch_irn_is(node, rematerializable));
 
                if(skip_Proj(new_flags_needed) != flags_needed) {
                        if(flags_needed != NULL) {
@@ -262,14 +258,14 @@ static void fix_flags_walker(ir_node *block, void *env)
                        }
 
                        flags_needed = new_flags_needed;
-                       arch_set_irn_register(arch_env, flags_needed, flags_reg);
+                       arch_set_irn_register(flags_needed, flags_reg);
                        if(is_Proj(flags_needed)) {
                                pn           = get_Proj_proj(flags_needed);
                                flags_needed = get_Proj_pred(flags_needed);
                        }
                        flag_consumers = node;
                        set_irn_link(flag_consumers, NULL);
-                       assert(arch_irn_is(arch_env, flags_needed, rematerializable));
+                       assert(arch_irn_is(flags_needed, rematerializable));
                } else {
                        /* link all consumers in a list */
                        set_irn_link(node, flag_consumers);
@@ -293,7 +289,6 @@ void be_sched_fix_flags(be_irg_t *birg, const arch_register_class_t *flag_cls,
 {
        ir_graph *irg = be_get_birg_irg(birg);
 
-       arch_env   = be_get_birg_arch_env(birg);
        flag_class = flag_cls;
        flags_reg  = & flag_class->regs[0];
        remat      = remat_func;
@@ -301,9 +296,9 @@ void be_sched_fix_flags(be_irg_t *birg, const arch_register_class_t *flag_cls,
        if(remat == NULL)
                remat = &default_remat;
 
-       set_using_irn_link(irg);
+       ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
        irg_block_walk_graph(irg, fix_flags_walker, NULL, birg->lv);
-       clear_using_irn_link(irg);
+       ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
 
        if(changed) {
                be_remove_dead_nodes_from_schedule(birg);