- if (is_pinned(arg)) {
- /* Insert a duplicate of the original value in arguments block,
- * make it the new phi arg,
- * set its register,
- * insert it into schedule,
- * pin it
- */
- ir_node *perm = get_Proj_pred(arg);
- ir_node *orig_val = get_irn_n(perm, get_Proj_proj(arg));
- ir_node *dupl = new_Copy(chordal_env->main_env->node_factory, cls, chordal_env->irg, arg_block, orig_val);
- assert(get_irn_mode(phi) == get_irn_mode(dupl));
- set_irn_n(phi, i, dupl);
- set_reg(dupl, phi_reg);
- sched_add_before(perm, dupl);
- pin_irn(dupl, phi_block);
- DBG((dbg, LEVEL_1, " arg is pinned: insert %+F(%s)\n", dupl, get_reg(dupl)->name));
- } else {
- /* No other phi has the same color (else arg would have been pinned),
- * so just set the register and pin
- */
- set_reg(arg, phi_reg);
- pin_irn(arg, phi_block);
- DBG((dbg, LEVEL_1, " arg is not pinned: so pin %+F(%s)\n", arg, get_reg(arg)->name));
- }
+ if (is_pinned(arg)) {
+ /*
+ Insert a duplicate of the original value in arguments block,
+ make it the new phi arg,
+ set its register,
+ insert it into schedule,
+ pin it
+ */
+ ir_node *perm = get_Proj_pred(arg);
+ ir_node *dupl = be_new_Copy(cls, chordal_env->irg, arg_block, arg);
+ ir_node *ins;
+
+ /* this is commented out because it will fail in case of unknown float */
+#if 0
+ ir_mode *m_phi = get_irn_mode(phi);
+ ir_mode *m_dupl = get_irn_mode(dupl);
+
+ /*
+ Conv signed <-> unsigned is killed on ia32
+ check for: (both int OR both float) AND equal mode sizes
+ */
+ assert(((mode_is_int(m_phi) && mode_is_int(m_dupl)) ||
+ (mode_is_float(m_phi) && mode_is_float(m_dupl))) &&
+ (get_mode_size_bits(m_phi) == get_mode_size_bits(m_dupl)));
+#endif /* if 0 */
+
+ set_irn_n(phi, i, dupl);
+ set_reg(dupl, phi_reg);
+ /* skip the Perm's Projs and insert the copies behind. */
+ for(ins = sched_next(perm); is_Proj(ins); ins = sched_next(ins));
+ sched_add_before(ins, dupl);
+ pin_irn(dupl, phi_block);
+ DBG((dbg, LEVEL_1, " arg is pinned: insert %+F(%s)\n", dupl, get_reg(dupl)->name));
+ } else {
+ /*
+ No other phi has the same color (else arg would have been pinned),
+ so just set the register and pin
+ */
+ set_reg(arg, phi_reg);
+ pin_irn(arg, phi_block);
+ DBG((dbg, LEVEL_1, " arg is not pinned: so pin %+F(%s)\n", arg, get_reg(arg)->name));