X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt.c;h=2bfb87c9ab6e44f13a9f36fc0b3f6e4119054748;hb=c71681c22466590a76c12aa0fdc805cb837af2a0;hp=a301f03f8bfdad3aeb72aa9ad2d92c6f8399344a;hpb=6a70922f00e26074da35103fd3fe4ca27b158d6f;p=libfirm diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index a301f03f8..2bfb87c9a 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -1259,8 +1259,7 @@ restart: } } } - 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); @@ -5281,9 +5280,16 @@ static ir_node *transform_node_Conv(ir_node *n) { 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 */