Fix PR97439
authorAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 22 Oct 2020 10:24:22 +0000 (12:24 +0200)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 22 Oct 2020 10:38:01 +0000 (12:38 +0200)
decimal_real_maxval misses to set the sign flag in the REAL_VALUE_TYPE.

gcc/ChangeLog:

PR rtl-optimization/97439
* dfp.c (decimal_real_maxval): Set the sign flag in the
generated number.

gcc/testsuite/ChangeLog:

* gcc.dg/dfp/pr97439.c: New test.

gcc/dfp.c
gcc/testsuite/gcc.dg/dfp/pr97439.c [new file with mode: 0644]

index fef39a5ce399d642cf5bc6879a05d51d187b6301..4a0f68e5d8360489199aec40d39a39c307df37de 100644 (file)
--- a/gcc/dfp.c
+++ b/gcc/dfp.c
@@ -740,4 +740,6 @@ decimal_real_maxval (REAL_VALUE_TYPE *r, int sign, machine_mode mode)
   decimal_real_from_string (r, max);
   if (sign)
     decimal128SetSign ((decimal128 *) r->sig, 1);
+
+  r->sign = sign;
 }
diff --git a/gcc/testsuite/gcc.dg/dfp/pr97439.c b/gcc/testsuite/gcc.dg/dfp/pr97439.c
new file mode 100644 (file)
index 0000000..7fcf834
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-do run }
+// { dg-options "-O1" }
+
+static int
+foo(_Decimal128 x, _Decimal128 y)
+{
+  if (x > y)
+    return 1;
+
+  return 0;
+}
+
+int __attribute__((noinline))
+bar(_Decimal128 x)
+{
+  return foo (x, -1.0DL * __builtin_infd32());
+}
+
+int
+main (void)
+{
+  int res = bar (0.0DL);
+  if (res != 1)
+    __builtin_abort ();
+
+  return 0;
+}