On Wed, Mar 23, 2011 at 9:11 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > simplify_const_unary_operation assumes it doesn't have to change anything > in REAL_VALUE_TYPE for FLOAT_EXTEND, which is wrong when FLOAT_EXTENDing > e.g. from SFmode to DDmode or SDmode to DFmode, where the number > needs to be converted from binary to decimal or vice versa. > > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, > ok for trunk/4.6.1?
Ok. Thanks, Richard. > 2011-03-23 Jakub Jelinek <ja...@redhat.com> > > PR debug/48204 > * simplify-rtx.c (simplify_const_unary_operation): Call > real_convert when changing mode class with FLOAT_EXTEND. > > * gcc.dg/dfp/pr48204.c: New test. > > --- gcc/simplify-rtx.c.jj 2011-03-21 13:00:09.000000000 +0100 > +++ gcc/simplify-rtx.c 2011-03-23 16:39:13.000000000 +0100 > @@ -1526,7 +1526,8 @@ simplify_const_unary_operation (enum rtx > } > > else if (GET_CODE (op) == CONST_DOUBLE > - && SCALAR_FLOAT_MODE_P (mode)) > + && SCALAR_FLOAT_MODE_P (mode) > + && SCALAR_FLOAT_MODE_P (GET_MODE (op))) > { > REAL_VALUE_TYPE d, t; > REAL_VALUE_FROM_CONST_DOUBLE (d, op); > @@ -1549,7 +1550,10 @@ simplify_const_unary_operation (enum rtx > d = real_value_truncate (mode, d); > break; > case FLOAT_EXTEND: > - /* All this does is change the mode. */ > + /* All this does is change the mode, unless changing > + mode class. */ > + if (GET_MODE_CLASS (mode) != GET_MODE_CLASS (GET_MODE (op))) > + real_convert (&d, mode, &d); > break; > case FIX: > real_arithmetic (&d, FIX_TRUNC_EXPR, &d, NULL); > --- gcc/testsuite/gcc.dg/dfp/pr48204.c.jj 2011-03-23 16:44:09.000000000 > +0100 > +++ gcc/testsuite/gcc.dg/dfp/pr48204.c 2011-03-23 16:43:35.000000000 +0100 > @@ -0,0 +1,10 @@ > +/* PR debug/48204 */ > +/* { dg-do compile } */ > +/* { dg-options "-O -fno-tree-ccp -fno-tree-dominator-opts -fno-tree-fre -g" > } */ > + > +void > +foo (void) > +{ > + float cf = 3.0f; > + _Decimal64 d64 = cf; > +} > > Jakub >