- BugFix: fixed wrong usage of classify_pointer()
[libfirm] / ir / ana / phiclass.c
index f472fe2..421cef9 100644 (file)
@@ -1,15 +1,32 @@
+/*
+ * 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.
+ */
+
 /**
+ * @file
+ * @brief  Implementation of phiclass analysis
  * @author Daniel Grund, Christian Wuerdig
  * @cvsid  $Id$
  * @date   09.08.2005
  */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
 
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
+#include <stdlib.h>
 
 #include "irnode.h"
 #include "debug.h"
 #include "iredges_t.h"
 #include "phiclass.h"
 #include "irphase_t.h"
+#include "irnodeset.h"
 
 struct _phi_classes_t {
-       phase_t  ph;                 /* The phase object holding the irn data */
+       ir_phase ph;                 /* The phase object holding the irn data */
        pset     *all_phi_classes;   /* A set containing all Phi classes */
        ir_graph *irg;               /* The irg this is all about */
        unsigned pure_phi_classes;   /* Build pure Phi classes */
@@ -31,19 +49,20 @@ typedef struct _irn_phi_class_t {
        ir_node ***phi_cls; /* the array of node pointers representing the class */
 } irn_phi_class_t;
 
-static INLINE ir_node ***_get_phi_class(phase_t *ph, ir_node *irn) {
+static inline ir_node ***_get_phi_class(ir_phase *ph, ir_node *irn) {
        irn_phi_class_t *ipc = phase_get_or_set_irn_data(ph, irn);
        return ipc->phi_cls;
 }
 
-static INLINE void _set_phi_class(phase_t *ph, ir_node *irn, ir_node ***cls) {
+static inline void _set_phi_class(ir_phase *ph, ir_node *irn, ir_node ***cls) {
        irn_phi_class_t *ipc = phase_get_or_set_irn_data(ph, irn);
        ipc->phi_cls = cls;
 }
 
 /* initialize data structure for given irn in given phase */
-static void *irn_phi_class_init(phase_t *ph, ir_node *irn, void *data) {
+static void *irn_phi_class_init(ir_phase *ph, const ir_node *irn, void *data) {
        irn_phi_class_t *ipc = data ? data : phase_alloc(ph, sizeof(ipc[0]));
+       (void) irn;
        memset(ipc, 0, sizeof(ipc[0]));
        return ipc;
 }
@@ -127,7 +146,7 @@ static void phi_class_construction_walker(ir_node *node, void *env) {
                        phi_class_build(pc, node, NULL);
 
                        pc_values = *_get_phi_class(&pc->ph, node);
-                       DBG((pc->dbg, LEVEL_1, "inserting phiclass %p into all classes\n", pc_values));
+                       DBG((pc->dbg, LEVEL_1, "inserting phiclass %p (%d members) into all classes\n", pc_values, ARR_LEN(pc_values)));
 
                        pset_insert_ptr(pc->all_phi_classes, pc_values);
                }
@@ -144,11 +163,12 @@ static void phi_class_compute(phi_classes_t *pc) {
 /**
  * Build the Phi classes for the set of given Phis.
  */
-static void phi_class_compute_by_phis(phi_classes_t *pc, pset *all_phi_nodes) {
-       if (pset_count(all_phi_nodes)) {
-               ir_node *phi;
+static void phi_class_compute_by_phis(phi_classes_t *pc, ir_nodeset_t *all_phi_nodes) {
+       if (ir_nodeset_size(all_phi_nodes) > 0) {
+               ir_nodeset_iterator_t iter;
+               ir_node               *phi;
 
-               foreach_pset(all_phi_nodes, phi) {
+               foreach_ir_nodeset(all_phi_nodes, phi, iter) {
                        ir_node ***irn_pc = _get_phi_class(&pc->ph, phi);
 
                        assert(is_Phi(phi) && mode_is_datab(get_irn_mode(phi)));
@@ -193,10 +213,10 @@ pset *get_all_phi_classes(phi_classes_t *pc) {
  * @return The Phi class object for the @p irg.
  */
 phi_classes_t *phi_class_new_from_irg(ir_graph *irg, int pure_phi_classes) {
-       phi_classes_t *res = xmalloc(sizeof(*res));
+       phi_classes_t *res = XMALLOC(phi_classes_t);
 
        FIRM_DBG_REGISTER(res->dbg, "ir.ana.phiclass");
-       phase_init(&res->ph, "phi_classes", irg, PHASE_DEFAULT_GROWTH, irn_phi_class_init);
+       phase_init(&res->ph, "phi_classes", irg, PHASE_DEFAULT_GROWTH, irn_phi_class_init, NULL);
 
        res->irg              = irg;
        res->all_phi_classes  = pset_new_ptr(5);
@@ -211,11 +231,11 @@ phi_classes_t *phi_class_new_from_irg(ir_graph *irg, int pure_phi_classes) {
  * Builds all Phi classes for the given set of Phis.
  * @return The Phis class object for @p all_phis.
  */
-phi_classes_t *phi_class_new_from_set(ir_graph *irg, pset *all_phis, int pure_phi_classes) {
-       phi_classes_t *res = xmalloc(sizeof(*res));
+phi_classes_t *phi_class_new_from_set(ir_graph *irg, ir_nodeset_t *all_phis, int pure_phi_classes) {
+       phi_classes_t *res = XMALLOC(phi_classes_t);
 
        FIRM_DBG_REGISTER(res->dbg, "ir.ana.phiclass");
-       phase_init(&res->ph, "phi_classes", irg, PHASE_DEFAULT_GROWTH, irn_phi_class_init);
+       phase_init(&res->ph, "phi_classes", irg, PHASE_DEFAULT_GROWTH, irn_phi_class_init, NULL);
 
        res->irg              = irg;
        res->all_phi_classes  = pset_new_ptr(5);