From: Andreas Krebbel Date: Thu, 22 Oct 2020 10:24:22 +0000 (+0200) Subject: Fix PR97439 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e3f25eac67aee77af0b2038cd4d6cbd36d7f1030;p=gcc.git Fix PR97439 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. --- diff --git a/gcc/dfp.c b/gcc/dfp.c index fef39a5ce39..4a0f68e5d83 100644 --- 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 index 00000000000..7fcf834043c --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/pr97439.c @@ -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; +}