From: Richard Biener <rguenther@suse.de>
To: Jakub Jelinek <jakub@redhat.com>
Cc: Aldy Hernandez <aldyh@redhat.com>, gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] range-op-float: Extend lhs by 0.5ulp rather than 1ulp if not -frounding-math [PR109008]
Date: Fri, 10 Mar 2023 11:38:41 +0000 (UTC) [thread overview]
Message-ID: <nycvar.YFH.7.77.849.2303101138170.18795@jbgna.fhfr.qr> (raw)
In-Reply-To: <ZArmdQvGOS9m7jXA@tucnak>
On Fri, 10 Mar 2023, Jakub Jelinek wrote:
> Hi!
>
> This patch, incremental to the just posted one, improves the reverse
> operation ranges significantly by widening just by 0.5ulp in each
> direction rather than 1ulp. Again, REAL_VALUE_TYPE has both wider
> exponent range and wider mantissa precision (160 bits) than any
> supported type, this patch uses the latter property.
>
> The patch doesn't do it if -frounding-math, because then the rounding
> can be +-1ulp in each direction depending on the rounding mode which
> we don't know, or for IBM double double because that type is just weird
> and we can't trust in sane properties.
>
> I've performed testing of these 2 patches on 300000 random tests as with
> yesterday's patch, exact numbers are in the PR, but I see very significant
> improvement in the precision of the ranges while keeping it conservatively
> correct.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
The flow is a little bit obfuscated, but OK.
Thanks,
Richard.
> 2023-03-10 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/109008
> * range-op-float.cc (float_widen_lhs_range): If not
> -frounding-math and not IBM double double format, extend lhs
> range just by 0.5ulp rather than 1ulp in each direction.
>
> --- gcc/range-op-float.cc.jj 2023-03-09 12:13:57.189790814 +0100
> +++ gcc/range-op-float.cc 2023-03-09 13:12:05.248873234 +0100
> @@ -2205,8 +2205,8 @@ zero_to_inf_range (REAL_VALUE_TYPE &lb,
> [1., 1.] = op1 + [1., 1.]. op1's range is not [0., 0.], but
> [-0x1.0p-54, 0x1.0p-53] (when not -frounding-math), any value for
> which adding 1. to it results in 1. after rounding to nearest.
> - So, for op1_range/op2_range extend the lhs range by 1ulp in each
> - direction. See PR109008 for more details. */
> + So, for op1_range/op2_range extend the lhs range by 1ulp (or 0.5ulp)
> + in each direction. See PR109008 for more details. */
>
> static frange
> float_widen_lhs_range (tree type, const frange &lhs)
> @@ -2230,6 +2230,14 @@ float_widen_lhs_range (tree type, const
> lb = dconstm1;
> SET_REAL_EXP (&lb, FLOAT_MODE_FORMAT (TYPE_MODE (type))->emax + 1);
> }
> + if (!flag_rounding_math && !MODE_COMPOSITE_P (TYPE_MODE (type)))
> + {
> + /* If not -frounding-math nor IBM double double, actually widen
> + just by 0.5ulp rather than 1ulp. */
> + REAL_VALUE_TYPE tem;
> + real_arithmetic (&tem, PLUS_EXPR, &lhs.lower_bound (), &lb);
> + real_arithmetic (&lb, RDIV_EXPR, &tem, &dconst2);
> + }
> }
> if (real_isfinite (&ub))
> {
> @@ -2240,6 +2248,14 @@ float_widen_lhs_range (tree type, const
> ub = dconst1;
> SET_REAL_EXP (&ub, FLOAT_MODE_FORMAT (TYPE_MODE (type))->emax + 1);
> }
> + if (!flag_rounding_math && !MODE_COMPOSITE_P (TYPE_MODE (type)))
> + {
> + /* If not -frounding-math nor IBM double double, actually widen
> + just by 0.5ulp rather than 1ulp. */
> + REAL_VALUE_TYPE tem;
> + real_arithmetic (&tem, PLUS_EXPR, &lhs.upper_bound (), &ub);
> + real_arithmetic (&ub, RDIV_EXPR, &tem, &dconst2);
> + }
> }
> /* Temporarily disable -ffinite-math-only, so that frange::set doesn't
> reduce the range back to real_min_representable (type) as lower bound
>
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)
prev parent reply other threads:[~2023-03-10 11:38 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-10 8:12 Jakub Jelinek
2023-03-10 11:38 ` Richard Biener [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=nycvar.YFH.7.77.849.2303101138170.18795@jbgna.fhfr.qr \
--to=rguenther@suse.de \
--cc=aldyh@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).