- res = new_r_Call (current_ir_graph, get_new_node(n), get_Call_mem(n),
- get_Call_ptr(n), get_Call_arity(n),
- in, get_Call_type (n));
- set_new_node(n, res);
- }
- break;
- case iro_Add:
- res = new_r_Add (current_ir_graph, get_new_node(n),
- get_new_node(a),
- get_new_node(b), get_irn_mode(n));
- set_new_node(n, res);
- break;
- case iro_Sub:
- res = new_r_Sub (current_ir_graph, get_new_node(get_nodes_block(n)),
- get_new_node(a),get_new_node(b), get_irn_mode(n));
- set_new_node(n, res);
- break;
- case iro_Minus:
- res = new_r_Minus (current_ir_graph, get_new_node(n), get_new_node(a),
- get_irn_mode(n));
- set_new_node(n, res);
- break;
- case iro_Mul:
- res = new_r_Mul (current_ir_graph, get_new_node(n), get_new_node(a),
- get_new_node(b), get_irn_mode(n));
- break;
- case iro_Quot:
- res = new_r_Quot (current_ir_graph, get_new_node(n), get_Quot_mem (n),
- get_new_node(a), get_new_node(b));
- break;
- case iro_DivMod:
- res = new_r_DivMod (current_ir_graph, get_new_node(n), get_DivMod_mem(n),
- get_new_node(a), get_new_node(b));
- break;
- case iro_Div:
- res = new_r_Div (current_ir_graph, get_new_node(n), get_Div_mem (n),
- get_new_node(a), get_new_node(b));
- break;
- case iro_Mod:
- res = new_r_Mod (current_ir_graph, get_new_node(n), get_Mod_mem (n),
- get_new_node(a), get_new_node(b));
- break;
- case iro_Abs:
- res = new_r_Mod (current_ir_graph, get_new_node(n), get_Abs_op(n)
- get_irn_mode(n));
- break;
- case iro_And:
- res = new_r_And (current_ir_graph, get_new_node(n), get_new_node(a),
- get_new_node(b), get_irn_mode(n));
- break;
- case iro_Or:
- res = new_r_Or (current_ir_graph, get_new_node(n), get_new_node(a),
- get_new_node(b), get_irn_mode(n));
- break;
- case iro_Eor:
- res = new_r_Eor (current_ir_graph, get_new_node(n), get_new_node(a),
- get_new_node(b), get_irn_mode(n));
- break;
- case iro_Not:
- res = new_r_Not (current_ir_graph, get_new_node(n), get_Not_op(n),
- get_irn_mode(n));
- break;
- case iro_Cmp:
- res = new_r_Cmp (current_ir_graph, get_new_node(n), get_Cmp_left(n),
- get_Cmp_right(n));
- break;
- case iro_Shl:
- res = new_r_Shl (current_ir_graph, get_new_node(n), get_Shl_left(n),
- get_Shl_right(n), get_irn_mode(n));
- break;
- case iro_Shr:
- res = new_r_Shr (current_ir_graph, get_new_node(n), get_Shr_left(n),
- get_Shr_right(n), get_irn_mode(n));
- break;
- case iro_Shrs:
- res = new_r_Shrs (current_ir_graph, get_new_node(n), get_Shrs_left(n),
- get_Shrs_right(n), get_irn_mode(n));
- break;
- case iro_Rot:
- res = new_r_Rot (current_ir_graph, get_new_node(n), get_Rot_left(n),
- get_Rot_right(n), get_irn_mode(n));
- break;
- case iro_Conv:
- res = new_r_Conv (current_ir_graph, get_new_node(n), get_Conv_op(n),
- get_irn_mode(n));
- break;
- case iro_Phi:
- /*CS malloc*/
- ir_node **in [get_Phi_n_preds(n)];
- for (i=0; i <(get_Phi_n_preds(n)); i++) {
- in[i] = get_Phi_pred (n, i);
+ /* repair the block visited flag from above misuse */
+ set_Block_block_visited(nn, 0);
+ /* Local optimization could not merge two subsequent blocks if
+ in array contained Bads. Now it's possible. *
+ on = optimize_in_place(nn);
+ if (nn != on) exchange(nn, on);*/
+ } else if (get_irn_opcode(n) == iro_Phi) {
+ /* Don't copy node if corresponding predecessor in block is Bad.
+ The Block itself should not be Bad. */
+ block = get_nodes_Block(n);
+ set_irn_n (nn, -1, get_new_node(block));
+ j = 0;
+ for (i = 0; i < get_irn_arity(n); i++)
+ if (get_irn_opcode(get_irn_n(block, i)) != iro_Bad) {
+ set_irn_n (nn, j, get_new_node(get_irn_n(n, i)));
+ j++;