- NEW_ARR_A(ir_node *, conds, new_arity);
- NEW_ARR_A(ir_node *, vals, new_arity + 1);
- j = 0;
- for (i = 0; i < arity; ++i) {
- ir_node* c = get_Psi_cond(psi, i);
-
- n = get_Psi_val(psi, i);
- if (get_irn_op(n) == op_Psi) {
- a = get_Psi_n_conds(n);
- for (k = 0; k < a; ++k) {
- conds[j] = new_r_And(
- current_ir_graph, get_nodes_block(psi),
- c, get_Psi_cond(n, k), mode_b
- );
- vals[j] = get_Psi_val(n, k);
- ++j;
- }
- conds[j] = c;
- vals[j] = get_Psi_default(n);
- } else {
- conds[j] = c;
- vals[j] = n;
- }
- ++j;
- }
- n = get_Psi_default(psi);
- if (get_irn_op(n) == op_Psi) {
- a = get_Psi_n_conds(n);
- for (k = 0; k < a; ++k) {
- conds[j] = get_Psi_cond(n, k);
- vals[j] = get_Psi_val(n, k);
- ++j;
- }
- vals[j] = get_Psi_default(n);
- } else {
- vals[j] = n;
- }
- assert(j == new_arity);
- new_psi = new_r_Psi(
- current_ir_graph, get_nodes_block(psi),
- new_arity, conds, vals, get_irn_mode(psi)
- );
- DB((dbg, LEVEL_1, "Folded %+F into new %+F\n", psi, new_psi));
- exchange(psi, new_psi);
- return new_psi;
-}