}
}
}
- if (get_mode_arithmetic(n_mode) == irma_twos_complement &&
- get_mode_arithmetic(a_mode) == irma_ieee754) {
+ if (mode_is_int(n_mode) && get_mode_arithmetic(a_mode) == irma_ieee754) {
/* ConvI(ConvF(I)) -> I, iff float mantissa >= int mode */
unsigned int_mantissa = get_mode_size_bits(n_mode) - (mode_is_signed(n_mode) ? 1 : 0);
unsigned float_mantissa = tarval_ieee754_get_mantissa_size(a_mode);
ir_node *c, *oldn = n;
ir_node *a = get_Conv_op(n);
- if (is_Phi(a)) {
- // let deconv do this
- return n;
+ if (get_irn_mode(n) != mode_b && is_const_Phi(a)) {
+ /* Do NOT optimize mode_b Conv's, this leads to remaining
+ * Phib nodes later, because the conv_b_lower operation
+ * is instantly reverted, when it tries to insert a Convb.
+ */
+ c = apply_conv_on_phi(a, get_irn_mode(n));
+ if (c) {
+ DBG_OPT_ALGSIM0(oldn, c, FS_OPT_CONST_PHI);
+ return c;
+ }
}
if (is_Unknown(a)) { /* Conv_A(Unknown_B) -> Unknown_A */