if (phase->data_ptr[idx])
phase->data_init(phase, irn, phase->data_ptr[idx]);
}
+
+ir_node *phase_get_first_node(phase_t *phase) {
+ int i;
+
+ for (i = 0; i < phase->n_data_ptr; ++i)
+ if (phase->data_ptr[i])
+ return get_idx_irn(phase->irg, i);
+
+ return NULL;
+}
+
+ir_node *phase_get_next_node(phase_t *phase, ir_node *start) {
+ int i;
+
+ for (i = get_irn_idx(start) + 1; i < phase->n_data_ptr; ++i)
+ if (phase->data_ptr[i])
+ return get_idx_irn(phase->irg, i);
+
+ return NULL;
+}
*/
void phase_reinit_single_irn_data(phase_t *phase, ir_node *irn);
+/**
+ * Returns the first node of the phase having some data assigned.
+ * @param phase The phase.
+ * @return The first irn having some data assigned, NULL otherwise
+ */
+ir_node *phase_get_first_node(phase_t *phase);
+
+/**
+ * Returns the next node after @p start having some data assigned.
+ * @param phase The phase.
+ * @param start The node to start from
+ * @return The next node after start having some data assigned, NULL otherwise
+ */
+ir_node *phase_get_next_node(phase_t *phase, ir_node *start);
+
+/**
+ * Convenience macro to iterate over all nodes of a phase
+ * having some data assigned.
+ */
+#define foreach_phase_irn(phase, irn) \
+ for (irn = phase_get_first_node(phase); irn; irn = phase_get_next_node(phase, irn))
+
/**
* Get the name of the phase.
*/
return res;
}
-
#endif /* _FIRM_IR_PHASE_T_H */