public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Aldy Hernandez <aldyh@redhat.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: gcc-patches@gcc.gnu.org, andrew MacLeod <amacleod@redhat.com>
Subject: Re: [PATCH] range-op-float, v2: Fix up frange_arithmetic [PR107967]
Date: Wed, 7 Dec 2022 18:40:21 +0100	[thread overview]
Message-ID: <a069a12d-2f3c-75bf-29f4-f337199edaac@redhat.com> (raw)
In-Reply-To: <Y5C2HQOXFT+RTCId@tucnak>

OK, thanks.
Aldy

On 12/7/22 16:49, Jakub Jelinek wrote:
> On Wed, Dec 07, 2022 at 04:26:14PM +0100, Aldy Hernandez wrote:
>> This chunk...
>>
>> ...is quite similar to this one.  Could you abstract this?
> 
> It differs in various small details, plus comment content.
> Anyway, here it is reworked such that those various small details
> are based on whether inf is negative or positive in a single piece
> of code.
> Is this ok if it passes bootstrap/regtest?
> 
> 2022-12-07  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/107967
> 	* range-op-float.cc (frange_arithmetic): Fix a thinko - if
> 	inf is negative, use nextafter if !real_less (&result, &value)
> 	rather than if real_less (&result, &value).  If result is +-INF
> 	while value is finite and -fno-rounding-math, don't do rounding
> 	if !inexact or if result is significantly above max representable
> 	value or below min representable value.
> 
> 	* gcc.dg/pr107967-1.c: New test.
> 	* gcc.dg/pr107967-2.c: New test.
> 	* gcc.dg/pr107967-3.c: New test.
> 
> --- gcc/range-op-float.cc.jj	2022-12-07 16:37:05.285143250 +0100
> +++ gcc/range-op-float.cc	2022-12-07 16:41:58.500928517 +0100
> @@ -287,9 +287,42 @@ frange_arithmetic (enum tree_code code,
>   
>     // Be extra careful if there may be discrepancies between the
>     // compile and runtime results.
> -  if ((mode_composite || (real_isneg (&inf) ? real_less (&result, &value)
> -			  : !real_less (&value, &result)))
> -      && (inexact || !real_identical (&result, &value)))
> +  bool round = false;
> +  if (mode_composite)
> +    round = true;
> +  else
> +    {
> +      bool low = real_isneg (&inf);
> +      round = (low ? !real_less (&result, &value)
> +		   : !real_less (&value, &result));
> +      if (real_isinf (&result, !low)
> +	  && !real_isinf (&value)
> +	  && !flag_rounding_math)
> +	{
> +	  // Use just [+INF, +INF] rather than [MAX, +INF]
> +	  // even if value is larger than MAX and rounds to
> +	  // nearest to +INF.  Similarly just [-INF, -INF]
> +	  // rather than [-INF, +MAX] even if value is smaller
> +	  // than -MAX and rounds to nearest to -INF.
> +	  // Unless INEXACT is true, in that case we need some
> +	  // extra buffer.
> +	  if (!inexact)
> +	    round = false;
> +	  else
> +	    {
> +	      REAL_VALUE_TYPE tmp = result, tmp2;
> +	      frange_nextafter (mode, tmp, inf);
> +	      // TMP is at this point the maximum representable
> +	      // number.
> +	      real_arithmetic (&tmp2, MINUS_EXPR, &value, &tmp);
> +	      if (real_isneg (&tmp2) != low
> +		  && (REAL_EXP (&tmp2) - REAL_EXP (&tmp)
> +		      >= 2 - REAL_MODE_FORMAT (mode)->p))
> +		round = false;
> +	    }
> +	}
> +    }
> +  if (round && (inexact || !real_identical (&result, &value)))
>       {
>         if (mode_composite)
>   	{
> --- gcc/testsuite/gcc.dg/pr107967-1.c.jj	2022-12-07 16:38:07.519248686 +0100
> +++ gcc/testsuite/gcc.dg/pr107967-1.c	2022-12-07 16:38:07.519248686 +0100
> @@ -0,0 +1,35 @@
> +/* PR tree-optimization/107967 */
> +/* { dg-do compile { target float64 } } */
> +/* { dg-options "-O2 -frounding-math -fno-trapping-math -fdump-tree-optimized" } */
> +/* { dg-add-options float64 } */
> +/* { dg-final { scan-tree-dump-not "return\[ \t]\*-?Inf;" "optimized" } } */
> +
> +_Float64
> +foo (void)
> +{
> +  const _Float64 huge = 1.0e+300f64;
> +  return huge * huge;
> +}
> +
> +_Float64
> +bar (void)
> +{
> +  const _Float64 huge = 1.0e+300f64;
> +  return huge * -huge;
> +}
> +
> +_Float64
> +baz (void)
> +{
> +  const _Float64 a = 0x1.fffffffffffffp+1023f64;
> +  const _Float64 b = 0x1.fffffffffffffp+970f64;
> +  return a + b;
> +}
> +
> +_Float64
> +qux (void)
> +{
> +  const _Float64 a = 0x1.fffffffffffffp+1023f64;
> +  const _Float64 b = 0x1.fffffffffffffp+969f64;
> +  return a + b;
> +}
> --- gcc/testsuite/gcc.dg/pr107967-2.c.jj	2022-12-07 16:38:07.519248686 +0100
> +++ gcc/testsuite/gcc.dg/pr107967-2.c	2022-12-07 16:38:07.519248686 +0100
> @@ -0,0 +1,35 @@
> +/* PR tree-optimization/107967 */
> +/* { dg-do compile { target float64 } } */
> +/* { dg-options "-O2 -fno-rounding-math -fno-trapping-math -fdump-tree-optimized" } */
> +/* { dg-add-options float64 } */
> +/* { dg-final { scan-tree-dump-times "return\[ \t]\*-?Inf;" 3 "optimized" } } */
> +
> +_Float64
> +foo (void)
> +{
> +  const _Float64 huge = 1.0e+300f64;
> +  return huge * huge;
> +}
> +
> +_Float64
> +bar (void)
> +{
> +  const _Float64 huge = 1.0e+300f64;
> +  return huge * -huge;
> +}
> +
> +_Float64
> +baz (void)
> +{
> +  const _Float64 a = 0x1.fffffffffffffp+1023f64;
> +  const _Float64 b = 0x1.fffffffffffffp+970f64;
> +  return a + b;
> +}
> +
> +_Float64
> +qux (void)
> +{
> +  const _Float64 a = 0x1.fffffffffffffp+1023f64;
> +  const _Float64 b = 0x1.fffffffffffffp+969f64;
> +  return a + b;
> +}
> --- gcc/testsuite/gcc.dg/pr107967-3.c.jj	2022-12-07 16:38:07.519248686 +0100
> +++ gcc/testsuite/gcc.dg/pr107967-3.c	2022-12-07 16:38:07.519248686 +0100
> @@ -0,0 +1,53 @@
> +/* PR tree-optimization/107967 */
> +/* { dg-do compile { target float64 } } */
> +/* { dg-options "-O2 -fno-rounding-math -fno-trapping-math -fdump-tree-optimized" } */
> +/* { dg-add-options float64 } */
> +/* { dg-final { scan-tree-dump-times "return\[ \t]\*-?Inf;" 3 "optimized" } } */
> +
> +_Float64
> +foo (_Float64 x)
> +{
> +  if (x >= 1.0e+300f64)
> +    ;
> +  else
> +    __builtin_unreachable ();
> +  return x * x;
> +}
> +
> +_Float64
> +bar (_Float64 x)
> +{
> +  if (x >= 1.0e+300f64)
> +    ;
> +  else
> +    __builtin_unreachable ();
> +  return x * -x;
> +}
> +
> +_Float64
> +baz (_Float64 a, _Float64 b)
> +{
> +  if (a >= 0x1.fffffffffffffp+1023f64)
> +    ;
> +  else
> +    __builtin_unreachable ();
> +  if (b >= 0x1.p+972f64)
> +    ;
> +  else
> +    __builtin_unreachable ();
> +  return a + b;
> +}
> +
> +_Float64
> +qux (_Float64 a, _Float64 b)
> +{
> +  if (a >= 0x1.fffffffffffffp+1023f64)
> +    ;
> +  else
> +    __builtin_unreachable ();
> +  if (b >= 0x1.fffffffffffffp+969f64)
> +    ;
> +  else
> +    __builtin_unreachable ();
> +  return a + b;
> +}
> 
> 
> 	Jakub
> 


      reply	other threads:[~2022-12-07 17:40 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-07  8:29 [PATCH] range-op-float: " Jakub Jelinek
2022-12-07 15:26 ` Aldy Hernandez
2022-12-07 15:49   ` [PATCH] range-op-float, v2: " Jakub Jelinek
2022-12-07 17:40     ` Aldy Hernandez [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a069a12d-2f3c-75bf-29f4-f337199edaac@redhat.com \
    --to=aldyh@redhat.com \
    --cc=amacleod@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).