* @author Daniel Grund
* @date 09.08.2005
*/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
-#include <stdlib.h>
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
#include "debug.h"
#include "irgwalk.h"
#include "iredges_t.h"
#include "phiclass_t.h"
-#define DEBUG_LVL SET_LEVEL_0
-static firm_dbg_module_t *dbg = NULL;
+DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
size_t phi_irn_data_offset = 0;
static void phi_class_build(ir_node *irn, pset *pc) {
int i, max;
+ const ir_edge_t *edge;
/* If irn has a phi class assigned already
* return immediately to stop recursion */
/* Add a user of the irn to the class,
* iff it is a phi node */
- const ir_edge_t *edge;
foreach_out_edge(irn, edge) {
ir_node *user = edge->src;
DBG((dbg, LEVEL_2, " checking user %+F\n", user));
}
}
-pset *phi_class_compute_by_phis(pset *all_phi_nodes) {
- int i;
- ir_node *phi;
- pset *all_phi_classes = pset_new_ptr_default();
-
- for (i = 0, phi=pset_first(all_phi_nodes); phi; phi=pset_next(all_phi_nodes)) {
- assert(is_Phi(phi) && mode_is_datab(get_irn_mode(phi)));
- phi_class_build(phi, NULL);
- pset_insert_ptr(all_phi_classes, _get_phi_class(phi));
- }
-
- return all_phi_classes;
-}
-
static void phi_class_construction_walker(ir_node *node, void *env) {
if (is_Phi(node) && mode_is_datab(get_irn_mode(node)))
phi_class_build(node, NULL);
static void phi_class_destruction_walker(ir_node *node, void *env) {
pset *clss = _get_phi_class(node);
if (clss) {
+ ir_node *n;
+ for(n = pset_first(clss); n; n = pset_next(clss))
+ _set_phi_class(n, NULL);
del_pset(clss);
- _set_phi_class(node, NULL);
}
}
irg_walk_graph(irg, phi_class_construction_walker, NULL, NULL);
}
+pset *phi_class_compute_by_phis(pset *all_phi_nodes) {
+ int i;
+ ir_node *phi;
+ pset *all_phi_classes = pset_new_ptr_default();
+
+ if (pset_count(all_phi_nodes)) {
+ ir_graph *irg = get_irn_irg(pset_first(all_phi_nodes));
+ pset_break(all_phi_nodes);
+ irg_walk_graph(irg, phi_class_destruction_walker, NULL, NULL);
+
+ for (i = 0, phi=pset_first(all_phi_nodes); phi; phi=pset_next(all_phi_nodes)) {
+ assert(is_Phi(phi) && mode_is_datab(get_irn_mode(phi)));
+ phi_class_build(phi, NULL);
+ pset_insert_ptr(all_phi_classes, _get_phi_class(phi));
+ }
+ }
+
+ return all_phi_classes;
+}
+
void phi_class_free(ir_graph *irg) {
irg_walk_graph(irg, phi_class_destruction_walker, NULL, NULL);
}
}
void phi_class_init(void) {
- dbg = firm_dbg_register("ir.ana.phiclass");
- firm_dbg_set_mask(dbg, DEBUG_LVL);
+ FIRM_DBG_REGISTER(dbg, "ir.ana.phiclass");
phi_irn_data_offset = register_additional_node_data(sizeof(phi_info_t));
}