From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by sourceware.org (Postfix) with ESMTPS id 99D753858D37; Sun, 19 Mar 2023 20:44:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 99D753858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1679258654; i=anlauf@gmx.de; bh=KUt2ABsqKI2vyrKNDH81mrNQrfUcRK0vDknDWKfcxZU=; h=X-UI-Sender-Class:From:To:Subject:Date; b=m5/Qk9M+Zg41fOylDtPlI2BrP+GmHnJaMhtZOH0PhpvojhlWSMlemiK3jTwqgAVCo tmSOHsLL1a5detBtJqxWjkO1aLBuhP4YgKcYxYTPUOoD7yDpoR7y6OIBcaLshPO5AN AwRdQ32cQfnR/qDgSokfHG2cjWi4+3kg56UFb3txWvMqKxD3w/aGecraw9NdJZYAZV y6F2gacfeYf6aU/lR3PZ1ei5pcjIwlMuXSShRgTkrg96o4lgoVcw3DX2/oCBjp8oG5 jWjaTsnCaeSAgKrnRmXgnQIYj/jN0dMTNPG4sy+C5MjdbGZnwEsHv2ye8kozfkUTJS YDFXkR7SX0MOQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [93.207.90.211] ([93.207.90.211]) by web-mail.gmx.net (3c-app-gmx-bs65.server.lan [172.19.170.209]) (via HTTP); Sun, 19 Mar 2023 21:44:14 +0100 MIME-Version: 1.0 Message-ID: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH] Fortran: simplification of NEAREST for large argument [PR109186] Content-Type: multipart/mixed; boundary=nika-36e163be-b26c-4378-87f3-71a1d687a083 Date: Sun, 19 Mar 2023 21:44:14 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:Xj10yUNEqLabw3l/RAmz+INLauA7deXbB7wyjj4v44AO2KuN7PZHJVRxTs1M0HYdg8+F0 fNwACiw0u0kgIyfus7beVhBCrDvpnzX06/UsbviiEiS1P7ckGa3bMgfUKGDcmJnA4QvVYWgElucw /OeVFq0/nTY2dXbCEausZbkSqf4JOnYV4avLtN8QRSt67UOdh8fejrinW6p4vnpZx0k69j6LlMtd ZVx6X2aA5RsWIDzcaucEOyx7M5cn1XgYT7AQeu2wXEMI6sXCwnuhPhJ4iXnN8vRVly13T7jGAOfl Mw= UI-OutboundReport: notjunk:1;M01:P0:rUgCnZRwmfs=;qadlRwV/kRiYFaxTxDR70n2CJua QN1sGW5skAqNxs5Y3IYLhidCeiR5spzNkcR+h2XbfhlkIdPkV0WqtFyjAlAYOKJLb1p729slX +vfI3NzVXfi0Uih4dtWxyv/NdT73HUsSM0lMFW/8Oe7VqRtSQYs4N2fNuiT/JvDX5WDYpKy5F oDo1Wz2FrYETd949owriEIOZZmrm34kiEIONzZ3PhhFTmSz9KMEHUX+02C7z0KYjcTtUYUcXL lZFqY3k9RHAlhPN1eYC/mX+zloYKXp5aJazPtBV8Lj7PrDZ2enNr6mAu1eVa403UsRYSRzGAv XGrcLdEbKI4KycILTzmsB3Gs45kWUrdMJbxBE23p2rivFc++NSUbb7cbds0ijQ5A7B4E+EQPs IO9n02Sfkf1iqbkCBbtVHYQu4xpbV+iMEG/86WcsVKQsyIQcQquxDz5inXIRu57CWjIhV9YXH fEWYqEqbdWWBquHRHN2PE4TCmtyTdzjS40DbMwoIYTAsWgChIYNt77pkJqF51wlrni2Bh03S8 8yICvck25V6qbBTOZDgedChlrKZ53uOHilac2ddWLWEk/gRYPqGvgdblePTluRKgYcTfdLenL 3EDD8EGAt8VIf1NlzH7z8Ph2CeJ9PwPXHuz4vcvl+12yqkuUnkDy6lQinX6rBDh+ujOFlelzh ScyzXsIJHZBTPoi9EVgbA9g3tHywMH3XMQDI+ZhenKu8+O95Wwl7ygbelDeSysXP+L9x25m39 fXzE2BELy0ed/kkUtNaPwAmLZ3qzYVjCtO0N9srVrT7PESzwEjwETkkKIV35RikBn8ni3DcRW fLafGMjeMJP+5Z4nIrdQ1q5CDmVGfj65kn6iLHWnxtlVo= X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --nika-36e163be-b26c-4378-87f3-71a1d687a083 Content-Type: text/plain; charset=UTF-8 Dear all, I intend to commit the attached obvious patch within 24h unless there are comments. The issue is an off-by-one error in setting up the maximum exponent of the real kind that is passed to mpfr, so that model numbers between huge(x)/2 and huge(x), when given as an argument to NEAREST(arg,-1.0), are rounded down to huge(x)/2 during compile-time simplification. As no such issue is observed at run-time, the testcase compares the compile-time and run-time results for corner cases. Regtested on x86_64-pc-linux-gnu. As this is sort of a wrong-code issue, I intend to backport to all open branches. (The issue was apparently introduced in r0-84566-gb6f63e898498e6 without noticing, so it is technically a regression.) Thanks, Harald --nika-36e163be-b26c-4378-87f3-71a1d687a083 Content-Type: text/x-patch Content-Disposition: attachment; filename=pr109186.diff Content-Transfer-Encoding: quoted-printable =46rom 9391bd0eeef8e069d9e49f9aa277160b43aaf4f3 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Sun, 19 Mar 2023 21:29:46 +0100 Subject: [PATCH] Fortran: simplification of NEAREST for large argument [PR109186] gcc/fortran/ChangeLog: PR fortran/109186 * simplify.cc (gfc_simplify_nearest): Fix off-by-one error in setting up real kind-specific maximum exponent for mpfr. gcc/testsuite/ChangeLog: PR fortran/109186 * gfortran.dg/nearest_6.f90: New test. =2D-- gcc/fortran/simplify.cc | 2 +- gcc/testsuite/gfortran.dg/nearest_6.f90 | 26 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/nearest_6.f90 diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc index 20ea38e0007..ecf0e3558df 100644 =2D-- a/gcc/fortran/simplify.cc +++ b/gcc/fortran/simplify.cc @@ -6114,7 +6114,7 @@ gfc_simplify_nearest (gfc_expr *x, gfc_expr *s) kind =3D gfc_validate_kind (BT_REAL, x->ts.kind, 0); mpfr_set_emin ((mpfr_exp_t) gfc_real_kinds[kind].min_exponent - mpfr_get_prec(result->value.real) + 1); - mpfr_set_emax ((mpfr_exp_t) gfc_real_kinds[kind].max_exponent - 1); + mpfr_set_emax ((mpfr_exp_t) gfc_real_kinds[kind].max_exponent); mpfr_check_range (result->value.real, 0, MPFR_RNDU); if (mpfr_sgn (s->value.real) > 0) diff --git a/gcc/testsuite/gfortran.dg/nearest_6.f90 b/gcc/testsuite/gfort= ran.dg/nearest_6.f90 new file mode 100644 index 00000000000..00d1ebe618c =2D-- /dev/null +++ b/gcc/testsuite/gfortran.dg/nearest_6.f90 @@ -0,0 +1,26 @@ +! { dg-do run } +! PR fortran/109186 - Verify that NEAREST produces same results at +! compile-time and run-time for corner cases +! Reported by John Harper + +program p + implicit none + integer, parameter :: sp =3D selected_real_kind (6) + integer, parameter :: dp =3D selected_real_kind (13) + real(sp), parameter :: x1 =3D huge (1._sp), t1 =3D tiny (1._sp) + real(dp), parameter :: x2 =3D huge (1._dp), t2 =3D tiny (1._dp) + real(sp), volatile :: y1, z1 + real(dp), volatile :: y2, z2 + y1 =3D x1 + z1 =3D nearest (y1, -1._sp) + if (nearest (x1, -1._sp) /=3D z1) stop 1 + y2 =3D x2 + z2 =3D nearest (y2, -1._dp) + if (nearest (x2, -1._dp) /=3D z2) stop 2 + y1 =3D t1 + z1 =3D nearest (y1, 1._sp) + if (nearest (t1, 1._sp) /=3D z1) stop 3 + y2 =3D t2 + z2 =3D nearest (y2, 1._dp) + if (nearest (t2, 1._dp) /=3D z2) stop 4 +end =2D- 2.35.3 --nika-36e163be-b26c-4378-87f3-71a1d687a083--