introduce be_foreach_use and use it
[libfirm] / ir / be / bespilldaemel.c
index e3bfdbd..88cf06a 100644 (file)
@@ -50,7 +50,6 @@
 #include "bearch.h"
 #include "be_t.h"
 #include "benode.h"
-#include "beirg.h"
 #include "belive.h"
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
@@ -140,23 +139,20 @@ static unsigned get_value_width(const ir_node *node)
  */
 static void do_spilling(ir_nodeset_t *live_nodes, ir_node *node)
 {
-       size_t   values_defined = 0;
-       ir_node *value;
+       size_t values_defined = 0;
        be_foreach_definition(node, cls, value,
+               (void)value;
                assert(req_->width >= 1);
                values_defined += req_->width;
        );
 
        /* we need registers for the non-live argument values */
        size_t free_regs_needed = 0;
-       int arity = get_irn_arity(node);
-       for (int i = 0; i < arity; ++i) {
-               ir_node *pred = get_irn_n(node, i);
-               if (arch_irn_consider_in_reg_alloc(cls, pred)
-                               && !ir_nodeset_contains(live_nodes, pred)) {
-                       free_regs_needed += get_value_width(pred);
+       be_foreach_use(node, cls, in_req_, use, pred_req_,
+               if (!ir_nodeset_contains(live_nodes, use)) {
+                       free_regs_needed += get_value_width(use);
                }
-       }
+       );
 
        /* we can reuse all reloaded values for the defined values, but we might
         * need even more registers */
@@ -204,6 +200,7 @@ static void do_spilling(ir_nodeset_t *live_nodes, ir_node *node)
 
                /* make sure the node is not an argument of the instruction */
                bool is_use = false;
+               int arity = get_irn_arity(node);
                for (int i = 0; i < arity; ++i) {
                        ir_node *in = get_irn_n(node, i);
                        if (in == cand_node) {
@@ -228,7 +225,6 @@ static void remove_defs(ir_node *node, ir_nodeset_t *nodeset)
        /* You must break out of your loop when hitting the first phi function. */
        assert(!is_Phi(node));
 
-       ir_node *value;
        be_foreach_definition(node, cls, value,
                ir_nodeset_remove(nodeset, value);
        );