-void phi_class_init(void) {
- FIRM_DBG_REGISTER(dbg, "ir.ana.phiclass");
- firm_dbg_set_mask(dbg, DEBUG_LVL);
- phi_irn_data_offset = register_additional_node_data(sizeof(phi_info_t));
+/**
+ * Builds the Phi classes for all Phis in @p irg.
+ * @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));
+
+ FIRM_DBG_REGISTER(res->dbg, "ir.ana.phiclass");
+ 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);
+ res->pure_phi_classes = pure_phi_classes;
+
+ phi_class_compute(res);
+
+ return res;
+}
+
+/**
+ * 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, ir_nodeset_t *all_phis, int pure_phi_classes) {
+ phi_classes_t *res = xmalloc(sizeof(*res));
+
+ FIRM_DBG_REGISTER(res->dbg, "ir.ana.phiclass");
+ 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);
+ res->pure_phi_classes = pure_phi_classes;
+
+ phi_class_compute_by_phis(res, all_phis);
+
+ return res;
+}
+
+/**
+ * Free all allocated data.
+ */
+void phi_class_free(phi_classes_t *pc) {
+ ir_node **ipc;
+ foreach_pset(pc->all_phi_classes, ipc) {
+ DEL_ARR_F(ipc);
+ }
+ del_pset(pc->all_phi_classes);
+ phase_free(&pc->ph);
+ xfree(pc);