-void lower_CopyB(ir_graph *irg, unsigned new_max_size,
- unsigned new_native_mode_bytes)
+/**
+ * Post-Walker: find small CopyB nodes.
+ */
+static void find_copyb_nodes(ir_node *irn, void *ctx) {
+ walk_env_t *env = ctx;
+ ir_type *tp;
+ unsigned size;
+ entry_t *entry;
+
+ if (is_Proj(irn)) {
+ ir_node *pred = get_Proj_pred(irn);
+
+ if (is_CopyB(pred) && get_Proj_proj(irn) != pn_CopyB_M_regular) {
+ /* found an exception Proj: remove it from the list again */
+ entry = get_irn_link(pred);
+ list_del(&entry->list);
+ }
+ return;
+ }
+
+ if (! is_CopyB(irn))
+ return;
+
+ tp = get_CopyB_type(irn);
+ if (get_type_state(tp) != layout_fixed)
+ return;
+
+ size = get_type_size_bytes(tp);
+ if (size > env->max_size)
+ return;
+
+ /* ok, link it in */
+ entry = obstack_alloc(&env->obst, sizeof(*entry));
+ entry->copyb = irn;
+ INIT_LIST_HEAD(&entry->list);
+ set_irn_link(irn, entry);
+ list_add_tail(&entry->list, &env->list);
+}
+
+void lower_CopyB(ir_graph *irg, unsigned max_size, unsigned native_mode_bytes)