+ new_pred = copy_and_fix_node(env, block, copy_block, j, pred);
+ }
+ DB((dbg, LEVEL_2, ">> Set Pred of %+F to %+F\n", copy, new_pred));
+ set_irn_n(copy, i, new_pred);
+ }
+ }
+
+ set_irn_link(node, copy);
+ set_irn_visited(node, env->visited_nr);
+
+ return copy;
+}
+
+static void copy_and_fix(const condeval_env_t *env, ir_node *block,
+ ir_node *copy_block, int j) {
+ const ir_edge_t *edge;
+
+ /* Look at all nodes in the cond_block and copy them into pred */
+ foreach_out_edge(block, edge) {
+ ir_node *node = get_edge_src_irn(edge);
+ ir_node *copy;
+ ir_mode *mode;
+
+ if (is_Block(node)) {
+ /* Block->Block edge, should be the MacroBlock edge */
+ assert(get_Block_MacroBlock(node) == block && "Block->Block edge found");
+ continue;
+ }
+
+ /* ignore control flow */
+ mode = get_irn_mode(node);
+ if (mode == mode_X || is_Cond(node))
+ continue;
+#ifdef AVOID_PHIB
+ /* we may not copy mode_b nodes, because this could produce Phi with
+ * mode_bs which can't be handled in all backends. Instead we duplicate
+ * the node and move it to its users */
+ if (mode == mode_b) {
+ const ir_edge_t *edge, *next;
+ ir_node *pred;
+ int pn;
+
+ assert(is_Proj(node));
+
+ pred = get_Proj_pred(node);
+ pn = get_Proj_proj(node);
+
+ foreach_out_edge_safe(node, edge, next) {
+ ir_node *cmp_copy;
+ ir_node *user = get_edge_src_irn(edge);
+ int pos = get_edge_src_pos(edge);
+ ir_node *user_block = get_nodes_block(user);
+
+ if (user_block == block)
+ continue;
+
+ cmp_copy = exact_copy(pred);
+ set_nodes_block(cmp_copy, user_block);
+ copy = new_r_Proj(current_ir_graph, user_block, cmp_copy, mode_b, pn);
+ set_irn_n(user, pos, copy);