https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79487

--- Comment #4 from Dominik Vogt <vogt at linux dot vnet.ibm.com> ---
What happens in Cse1 is that the constant is propagated into the FLOAT_EXTEND
expression, resulting in

  (float_expand:DD (const_double:SD -9223372036854775808))

which is eventually simplified using simplify_const_unary_operation.  This has
a case dealing with FLOAT_EXTEND:

        case FLOAT_EXTEND: 
          /* All this does is change the mode, unless changing 
             mode class.  */ 
          /* Don't perform the operation if flag_signaling_nans is on 
             and the operand is a signaling NaN.  */ 
          if ((GET_MODE_CLASS (mode) != GET_MODE_CLASS (GET_MODE (op)) 
               || d.decimal) 
              && !(HONOR_SNANS (mode) && REAL_VALUE_ISSIGNALING_NAN (d))) 
            real_convert (&d, mode, &d); 
          break; 

This test fails, so the following code just strips the FLOAT_EXTEND:DD and
replaces the mode in const_double with the target mode:

  (const_double:DD -9223372036854775808)

which is wrong.  Shouldn't this truncate the constant to the source mode first
before converting it to the target mode?

Reply via email to