add correct compare functions for be nodes
[libfirm] / ir / be / becopyheur.c
index d626bad..1afb062 100644 (file)
@@ -1,9 +1,29 @@
-/**
- * Author:      Daniel Grund
- * Date:               12.04.2005
- * Copyright:   (c) Universitaet Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
+/*
+ * Copyright (C) 1995-2007 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.
+ */
 
+/**
+ * @file
+ * @brief       First simple copy minimization heuristics.
+ * @author      Daniel Grund
+ * @date        12.04.2005
+ * @version     $Id$
+ *
  * Heuristic for minimizing copies using a queue which holds 'qnodes' not yet
  * examined. A qnode has a 'target color', nodes out of the opt unit and
  * a 'conflict graph'. 'Conflict graph' = "Interference graph' + 'conflict edges'
 #include "config.h"
 #endif
 
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-
 #include "debug.h"
+#include "bitset.h"
+#include "raw_bitset.h"
 #include "xmalloc.h"
+
 #include "becopyopt_t.h"
 #include "becopystat.h"
 #include "benodesets.h"
-#include "bitset.h"
+#include "bera.h"
+#include "beirg_t.h"
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
 
@@ -54,29 +71,29 @@ typedef struct _conflict_t {
  */
 typedef struct _node_stat_t {
        ir_node *irn;
-       int new_color;
-       int pinned_local :1;
+       int     new_color;
+       int     pinned_local :1;
 } node_stat_t;
 
 /**
  * Represents a node in the optimization queue.
  */
 typedef struct _qnode_t {
-       struct list_head queue;         /**< chaining of unit_t->queue */
-       const unit_t *ou;                       /**< the opt unit this qnode belongs to */
-       int color;                                      /**< target color */
-       set *conflicts;                         /**< contains conflict_t's. All internal conflicts */
-       int mis_costs;                          /**< costs of nodes/copies in the mis. */
-       int mis_size;                           /**< size of the array below */
-       ir_node **mis;                          /**< the nodes of unit_t->nodes[] being part of the max independent set */
-       set *changed_nodes;                     /**< contains node_stat_t's. */
+       struct list_head queue;            /**< chaining of unit_t->queue */
+       const unit_t     *ou;              /**< the opt unit this qnode belongs to */
+       int              color;            /**< target color */
+       set              *conflicts;       /**< contains conflict_t's. All internal conflicts */
+       int              mis_costs;        /**< costs of nodes/copies in the mis. */
+       int              mis_size;         /**< size of the array below */
+       ir_node          **mis;            /**< the nodes of unit_t->nodes[] being part of the max independent set */
+       set              *changed_nodes;   /**< contains node_stat_t's. */
 } qnode_t;
 
 static pset *pinned_global;                    /**< optimized nodes should not be altered any more */
 
 static INLINE int nodes_interfere(const be_chordal_env_t *env, const ir_node *a, const ir_node *b)
 {
-       if(env->ifg)
+       if (env->ifg)
                return be_ifg_connected(env->ifg, a, b);
        else
                return values_interfere(env->birg->lv, a, b);
@@ -251,7 +268,7 @@ static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
         */
        if (irn != trigger) {
                bitset_t *free_cols = bitset_alloca(cls->n_regs);
-               arch_register_req_t req;
+               const arch_register_req_t *req;
                ir_node *curr;
                int free_col;
 
@@ -260,10 +277,10 @@ static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
                bitset_flip_all(free_cols);
 
                /* Exclude colors not assignable to the irn */
-               arch_get_register_req(arch_env, &req, irn, -1);
-               if (arch_register_req_is(&req, limited)) {
+               req = arch_get_register_req(arch_env, irn, -1);
+               if (arch_register_req_is(req, limited)) {
                        bitset_t *limited = bitset_alloca(cls->n_regs);
-                       req.limited(req.limited_env, limited);
+                       rbitset_copy_to_bitset(req->limited, limited);
                        bitset_and(free_cols, limited);
                }