+#define be_foreach_value(node, value, code) \
+ do { \
+ if (get_irn_mode(node) == mode_T) { \
+ foreach_out_edge(node, node##__edge) { \
+ ir_node *const value = get_edge_src_irn(node##__edge); \
+ if (!is_Proj(value)) \
+ continue; \
+ code \
+ } \
+ } else { \
+ ir_node *const value = node; \
+ code \
+ } \
+ } while (0)
+
+/**
+ * Iterate over all values defined by an instruction.
+ * Only looks at values in a certain register class where the requirements
+ * are not marked as ignore.
+ * Executes @p code for each definition.
+ */
+#define be_foreach_definition_(node, ccls, value, req, code) \
+ be_foreach_value(node, value, \
+ arch_register_req_t const *const req = arch_get_irn_register_req(value); \
+ if (req->cls != ccls) \
+ continue; \
+ code \
+ )
+
+#define be_foreach_definition(node, ccls, value, req, code) \
+ be_foreach_definition_(node, ccls, value, req, \
+ if (arch_register_req_is(req, ignore)) \
+ continue; \
+ code \
+ )
+
+#define be_foreach_use(node, ccls, in_req, value, value_req, code) \
+ do { \
+ for (int i_ = 0, n_ = get_irn_arity(node); i_ < n_; ++i_) { \
+ const arch_register_req_t *in_req = arch_get_irn_register_req_in(node, i_); \
+ if (in_req->cls != ccls) \
+ continue; \
+ ir_node *value = get_irn_n(node, i_); \
+ const arch_register_req_t *value_req = arch_get_irn_register_req(value); \
+ if (value_req->type & arch_register_req_type_ignore) \
+ continue; \
+ code \
+ } \
+ } while (0)
+
+static inline const arch_register_class_t *arch_get_irn_reg_class(
+ const ir_node *node)