beuses: Remove stale start loop test.
[libfirm] / ir / be / belive_t.h
index 1ebfd04..06ea057 100644 (file)
 #define FIRM_BE_BELIVE_T_H
 
 #include <stdbool.h>
-#include "be_types.h"
-#include "irgraph_t.h"
 #include "irnodehashmap.h"
 #include "irhooks.h"
 #include "irlivechk.h"
-#include "statev_t.h"
-
-#include "pset.h"
-#include "bitset.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)
+#define be_is_live_out(lv, bl, irn)   _be_is_live_xxx(lv, bl, irn, be_lv_state_out)
 
 struct be_lv_t {
        ir_nodehashmap_t map;
        struct obstack   obst;
        bool             sets_valid;
        ir_graph        *irg;
-       hook_entry_t     hook_info;
        lv_chk_t        *lvc;
 };
 
 typedef struct be_lv_info_node_t be_lv_info_node_t;
 struct be_lv_info_node_t {
-       unsigned idx;
+       ir_node *node;
        unsigned flags;
 };
 
@@ -85,54 +82,54 @@ static inline unsigned _be_is_live_xxx(const be_lv_t *li, const ir_node *block,
 typedef struct lv_iterator_t
 {
        be_lv_info_t *info;
-       ir_graph     *irg;
-       be_lv_state_t flags;
        size_t        i;
 } lv_iterator_t;
 
 static inline lv_iterator_t be_lv_iteration_begin(const be_lv_t *lv,
-       const ir_node *block, be_lv_state_t flags)
+       const ir_node *block)
 {
        lv_iterator_t res;
        res.info  = ir_nodehashmap_get(be_lv_info_t, &lv->map, block);
-       res.irg   = get_Block_irg(block);
-       res.flags = flags;
        res.i     = res.info != NULL ? res.info[0].head.n_members : 0;
        return res;
 }
 
-static inline ir_node *be_lv_iteration_next(lv_iterator_t *iterator)
+static inline ir_node *be_lv_iteration_next(lv_iterator_t *iterator, be_lv_state_t flags)
 {
        while (iterator->i != 0) {
                const be_lv_info_t *info = iterator->info + iterator->i--;
-               if (info->node.flags & iterator->flags)
-                       return get_idx_irn(iterator->irg, info->node.idx);
+               if (info->node.flags & flags)
+                       return info->node.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), (flags)); once; once = false) \
-                       for (ir_node *node; (node = be_lv_iteration_next(&iter)) != NULL;)
-
-static inline pset *_be_lv_pset_put(const be_lv_t *lv, const ir_node *block,
-                                    int state, pset *s)
+static inline ir_node *be_lv_iteration_cls_next(lv_iterator_t *iterator, be_lv_state_t flags, const arch_register_class_t *cls)
 {
-       be_lv_foreach(lv, block, state, node)
-               pset_insert_ptr(s, node);
-       return s;
+       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_get_irn(lv, bl, i)      _be_lv_get_irn(lv, bl, i)
-#define be_lv_pset_put_in(lv, bl, s)  _be_lv_pset_put(lv, bl, be_lv_state_in, s)
-#define be_lv_pset_put_out(lv, bl, s) _be_lv_pset_put(lv, bl, be_lv_state_out, s)
-#define be_lv_pset_put_end(lv, bl, s) _be_lv_pset_put(lv, bl, be_lv_state_end, s)
-
-#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)
-#define be_is_live_out(lv, bl, irn)   _be_is_live_xxx(lv, bl, irn, be_lv_state_out)
+#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_has_info_about(lv, irn) bitset_is_set((lv)->nodes, get_irn_idx(irn))
+#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