From e7f7802150169bf0ec2b8a3ad309c53f87280927 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 10 May 2011 08:05:20 +0200 Subject: [PATCH] re PR debug/48928 (ICE: in decimal_to_decnumber, at dfp.c:113 with -O -g and decimal float) PR debug/48928 * dfp.c (decimal_to_decnumber): Handle conversion from dconst{1,2,m1,half}. * gcc.dg/dfp/pr48928.c: New test. From-SVN: r173606 --- gcc/ChangeLog | 6 ++++++ gcc/dfp.c | 32 +++++++++++++++++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/dfp/pr48928.c | 10 ++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/dfp/pr48928.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a6098047ac..0c0efe46aa6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-05-10 Jakub Jelinek + + PR debug/48928 + * dfp.c (decimal_to_decnumber): Handle conversion from + dconst{1,2,m1,half}. + 2011-05-09 Uros Bizjak * config/i386/i386.c (ix86_autovectorize_vector_sizes): Return 0 diff --git a/gcc/dfp.c b/gcc/dfp.c index 5a18db9f52f..6e43d149cfc 100644 --- a/gcc/dfp.c +++ b/gcc/dfp.c @@ -1,6 +1,6 @@ /* Decimal floating point support. - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software - Foundation, Inc. + Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. This file is part of GCC. @@ -110,7 +110,33 @@ decimal_to_decnumber (const REAL_VALUE_TYPE *r, decNumber *dn) decNumberFromString (dn, "nan", &set); break; case rvc_normal: - gcc_assert (r->decimal); + if (!r->decimal) + { + /* dconst{1,2,m1,half} are used in various places in + the middle-end and optimizers, allow them here + as an exception by converting them to decimal. */ + if (memcmp (r, &dconst1, sizeof (*r)) == 0) + { + decNumberFromString (dn, "1", &set); + break; + } + if (memcmp (r, &dconst2, sizeof (*r)) == 0) + { + decNumberFromString (dn, "2", &set); + break; + } + if (memcmp (r, &dconstm1, sizeof (*r)) == 0) + { + decNumberFromString (dn, "-1", &set); + break; + } + if (memcmp (r, &dconsthalf, sizeof (*r)) == 0) + { + decNumberFromString (dn, "0.5", &set); + break; + } + gcc_unreachable (); + } decimal128ToNumber ((const decimal128 *) r->sig, dn); break; default: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67799ec2bfb..eb2f0735d1f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-10 Jakub Jelinek + + PR debug/48928 + * gcc.dg/dfp/pr48928.c: New test. + 2011-05-09 Paolo Carlini PR c++/48522 diff --git a/gcc/testsuite/gcc.dg/dfp/pr48928.c b/gcc/testsuite/gcc.dg/dfp/pr48928.c new file mode 100644 index 00000000000..1fd36356594 --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/pr48928.c @@ -0,0 +1,10 @@ +/* PR debug/48928 */ +/* { dg-do compile } */ +/* { dg-options "-g -O2" } */ + +_Decimal32 +foo (_Decimal32 x) +{ + _Decimal32 y = (x + x) / (9.DF * x); + return y; +} -- 2.30.2