aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-05-10 08:05:20 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-05-10 08:05:20 +0200
commite7f7802150169bf0ec2b8a3ad309c53f87280927 (patch)
tree6662d230285c32d3a4907f4ab10a6a31374e848c /gcc
parent321f4ead0f5d7164b52117c50ce70598cc621b7c (diff)
downloadgcc-e7f7802150169bf0ec2b8a3ad309c53f87280927.zip
gcc-e7f7802150169bf0ec2b8a3ad309c53f87280927.tar.gz
gcc-e7f7802150169bf0ec2b8a3ad309c53f87280927.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dfp.c32
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/dfp/pr48928.c10
4 files changed, 50 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7a60980..0c0efe4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/48928
+ * dfp.c (decimal_to_decnumber): Handle conversion from
+ dconst{1,2,m1,half}.
+
2011-05-09 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.c (ix86_autovectorize_vector_sizes): Return 0
diff --git a/gcc/dfp.c b/gcc/dfp.c
index 5a18db9..6e43d14 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 67799ec..eb2f073 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-05-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/48928
+ * gcc.dg/dfp/pr48928.c: New test.
+
2011-05-09 Paolo Carlini <paolo.carlini@oracle.com>
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 0000000..1fd3635
--- /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;
+}