becopyheur4: Clean up co_mst_irn_init().
[libfirm] / ir / be / belive_t.h
index 8027c1a..27b2712 100644 (file)
@@ -1,20 +1,6 @@
 /*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
- *
  * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
+ * Copyright (C) 2012 University of Karlsruhe.
  */
 
 /**
 #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 "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;
 };
 
@@ -81,39 +68,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;
+}
+
+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), (flags)); once; once = false) \
-                       for (ir_node *node; (node = be_lv_iteration_next(&iter)) != NULL;)
+               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_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_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