From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2136) id 13B823858CDB; Sat, 3 Sep 2022 15:37:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 13B823858CDB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1662219461; bh=rvH0KGCb2Ae9izFxIIUMGXFWPH3VwCytBIBc8gFa2sk=; h=From:To:Subject:Date:From; b=JZekzZTprcjhcmhO7ANCmMBV0ev9Db6FaqbbciqEDlfDQg7ECtKvZzHu6QG/DGNvU 3v5kYm0RkiGuwcg989UuI7SejJQr31ykJw86xrtHwEw3Yzu4kCfJNRcGUZfLrF6OyO xqDq9weoEsWZPUD58k4F5sJE3jMnwvSLU8r/ZMOY= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Aldy Hernandez To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-2390] [PR/middle-end 106819] NANs can never be a singleton X-Act-Checkin: gcc X-Git-Author: Aldy Hernandez X-Git-Refname: refs/heads/master X-Git-Oldrev: 08de065293f8b08158e1089fbacce9dbaba95077 X-Git-Newrev: dae8b9e2bbb6017bf90d68c7b720c500125c8295 Message-Id: <20220903153741.13B823858CDB@sourceware.org> Date: Sat, 3 Sep 2022 15:37:41 +0000 (GMT) List-Id: https://gcc.gnu.org/g:dae8b9e2bbb6017bf90d68c7b720c500125c8295 commit r13-2390-gdae8b9e2bbb6017bf90d68c7b720c500125c8295 Author: Aldy Hernandez Date: Sat Sep 3 15:41:06 2022 +0200 [PR/middle-end 106819] NANs can never be a singleton Possible NANs can never be a singleton, so they will never be propagated. This was the intent, and then the signed zero code crept in, and was mistakenly checked before the NAN. PR/middle-end 106819 gcc/ChangeLog: * value-range.cc (frange::singleton_p): Move NAN check to the top. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pr106819.c: New test. Diff: --- gcc/testsuite/gcc.dg/tree-ssa/pr106819.c | 24 ++++++++++++++++++++++++ gcc/value-range.cc | 9 ++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr106819.c b/gcc/testsuite/gcc.dg/tree-ssa/pr106819.c new file mode 100644 index 00000000000..1272d4b5805 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr106819.c @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "-O2 -fdump-tree-evrp-details" } + +static int isNaN(double x) +{ + return x != x; +} + +static double opCmpProper(int lhs, double rhs) +{ + return lhs < rhs ? -1.0 + : lhs > rhs ? 1.0 + : lhs == rhs ? 0.0 + : __builtin_nan(""); +} + +int main() +{ + if (!isNaN(opCmpProper(41, __builtin_nan("")))) + __builtin_abort(); + return 0; +} + +// { dg-final {scan-tree-dump-not "Folds to: 0.0" "evrp" } } diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 6fd6e3b745c..a1c29f7bd0b 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -632,6 +632,10 @@ frange::singleton_p (tree *result) const { if (m_kind == VR_RANGE && real_identical (&m_min, &m_max)) { + // Return false for any singleton that may be a NAN. + if (HONOR_NANS (m_type) && !get_nan ().no_p ()) + return false; + // Return the appropriate zero if known. if (HONOR_SIGNED_ZEROS (m_type) && zero_p ()) { @@ -649,11 +653,6 @@ frange::singleton_p (tree *result) const } return false; } - - // Return false for any singleton that may be a NAN. - if (HONOR_NANS (m_type) && !get_nan ().no_p ()) - return false; - if (result) *result = build_real (m_type, m_min); return true;