belive: Avoid duplicate map lookups when calculating the liveness of a node in a...
[libfirm] / ir / be / belive_t.h
index 4e1d22f..06ea057 100644 (file)
@@ -31,6 +31,7 @@
 #include "irhooks.h"
 #include "irlivechk.h"
 #include "belive.h"
+#include "bearch.h"
 
 #define be_is_live_in(lv, bl, irn)    _be_is_live_xxx(lv, bl, irn, be_lv_state_in)
 #define be_is_live_end(lv, bl, irn)   _be_is_live_xxx(lv, bl, irn, be_lv_state_end)
@@ -41,7 +42,6 @@ struct be_lv_t {
        struct obstack   obst;
        bool             sets_valid;
        ir_graph        *irg;
-       hook_entry_t     hook_info;
        lv_chk_t        *lvc;
 };
 
@@ -104,9 +104,32 @@ static inline ir_node *be_lv_iteration_next(lv_iterator_t *iterator, be_lv_state
        return NULL;
 }
 
+static inline ir_node *be_lv_iteration_cls_next(lv_iterator_t *iterator, be_lv_state_t flags, const arch_register_class_t *cls)
+{
+       while (iterator->i != 0) {
+               const be_lv_info_t *info = iterator->info + iterator->i--;
+               if (!(info->node.flags & flags))
+                       continue;
+
+               ir_node *node = info->node.node;
+               ir_mode *mode = get_irn_mode(node);
+               if (!mode_is_datab(mode))
+                       continue;
+               if (!arch_irn_consider_in_reg_alloc(cls, node))
+                       continue;
+               return node;
+       }
+       return NULL;
+}
+
 #define be_lv_foreach(lv, block, flags, node) \
        for (bool once = true; once;) \
                for (lv_iterator_t iter = be_lv_iteration_begin((lv), (block)); once; once = false) \
                        for (ir_node *node; (node = be_lv_iteration_next(&iter, (flags))) != NULL;)
 
+#define be_lv_foreach_cls(lv, block, flags, cls, node) \
+       for (bool once = true; once;) \
+               for (lv_iterator_t iter = be_lv_iteration_begin((lv), (block)); once; once = false) \
+                       for (ir_node *node; (node = be_lv_iteration_cls_next(&iter, (flags), (cls))) != NULL;)
+
 #endif