From patchwork Tue May 21 02:54:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: HAO CHEN GUI X-Patchwork-Id: 1937199 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=qiWoUciM; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VjzYb66ppz20KF for ; Tue, 21 May 2024 12:54:43 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 23D8D3858D1E for ; Tue, 21 May 2024 02:54:42 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id 8E6FF3858D1E for ; Tue, 21 May 2024 02:54:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8E6FF3858D1E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8E6FF3858D1E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716260061; cv=none; b=BVZSCXjzBIbxVr8VqtvhwCB/HZhmaKoieElX2gfPSykL+FyFzhtWlVN5yJb29Ge5KG6UDGOrznEj+gg6hBU5oW+vF6WB04P3LTDNsnMMQOHMiA3MSyFG/n5tepVArPxFBHSxifw/+vP74tnx5CIXHUCDnLjJNJpKumX8F5LElvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716260061; c=relaxed/simple; bh=8XKxaYA69l9hak5NJcwZmvRZfnYX1ktdYmrsdnqulq8=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=rToQW2UwuDiIGfoNyx2rzgcHi5Gx6t4zrTqD89X31zK/JikqqmQ0MT08dyMdpevvr4FR5b83FmMuYC5NsMYodx8M6aCuNV8WCXEwtlfEBWlvj2hiIx4jD9X974CDKoMIcU+NQRWHKFiYronwn0qXIkbnJj9Wv1yMOT8qOfo+kRQ= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0353724.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 44L2S7kG000319; Tue, 21 May 2024 02:54:19 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=message-id : date : mime-version : to : cc : from : subject : content-type : content-transfer-encoding; s=pp1; bh=jttqj/C91GY2a8N/JVQbperLX01nNESK79B33V3Em/o=; b=qiWoUciM3qPKdguhZFdFp8k7DckfjnCGMjriD/DB1lqwPphe1OuiRDu3ApglyyrV/UzU WLhQjLkDJIMdHRsk2GZ+K7Ot3iYdiAyENuiODXxH0udpXwujfkXozsnIN7DMAh3FH360 5kvtleBJgliTOzeVMsf2Q1VjrNC5dYbGhl7NkIBjUOPKd6JEurVM9cTPebs9gHk9aBjz M5bfZTT6a4T9BrgvQ7DS4rVKi+ISyv5W5g8PYBtPzxf0N9WHzPBlBdWmndCy1GTYhCpN Fw7XEcoTleGKxTq2KQbIWdX3pMY/jnG+7kHFgPGomptVFb4CH5yX5zve1UAN+v2P6gWI ZQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3y8jugg1k8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 May 2024 02:54:18 +0000 Received: from m0353724.ppops.net (m0353724.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 44L2sI6n007272; Tue, 21 May 2024 02:54:18 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3y8jugg1k3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 May 2024 02:54:18 +0000 Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 44L06gG3026474; Tue, 21 May 2024 02:54:17 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3y785mb62h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 May 2024 02:54:17 +0000 Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 44L2sBD552756852 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 May 2024 02:54:13 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A8B1520043; Tue, 21 May 2024 02:54:11 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 57B9A20040; Tue, 21 May 2024 02:54:09 +0000 (GMT) Received: from [9.200.103.244] (unknown [9.200.103.244]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 May 2024 02:54:09 +0000 (GMT) Message-ID: Date: Tue, 21 May 2024 10:54:09 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: gcc-patches Cc: Segher Boessenkool , David , "Kewen.Lin" , Peter Bergner , Mikael Morin , "MacLeod, Andrew" , Aldy Hernandez , Jakub Jelinek From: HAO CHEN GUI Subject: [PATCH-3] Value Range: Add range op for builtin isnormal X-TM-AS-GCONF: 00 X-Proofpoint-GUID: RE4ZWGimFsZyLjxBp6UL8e09zbybz50- X-Proofpoint-ORIG-GUID: Wb07UDlCNn0kf_DSuUSjScNbZfc1DRE9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-05-21_02,2024-05-17_03,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 spamscore=0 adultscore=0 mlxlogscore=774 clxscore=1015 bulkscore=0 lowpriorityscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2405210022 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Hi, This patch adds the range op for builtin isnormal. It also adds two help function in frange to detect range of normal floating-point and range of subnormal or zero. Bootstrapped and tested on x86 and powerpc64-linux BE and LE with no regressions. Is it OK for the trunk? Thanks Gui Haochen ChangeLog Value Range: Add range op for builtin isnormal The former patch adds optab for builtin isnormal. Thus builtin isnormal might not be folded at front end. So the range op for isnormal is needed for value range analysis. This patch adds range op for builtin isnormal. gcc/ * gimple-range-op.cc (class cfn_isfinite): New. (op_cfn_finite): New variables. (gimple_range_op_handler::maybe_builtin_call): Handle CFN_BUILT_IN_ISFINITE. * value-range.h (class frange): Declare known_isnormal and known_isdenormal_or_zero. (frange::known_isnormal): Define. (frange::known_isdenormal_or_zero): Define. gcc/testsuite/ * gcc/testsuite/gcc.dg/tree-ssa/range-isnormal.c: New test. patch.diff diff --git a/gcc/gimple-range-op.cc b/gcc/gimple-range-op.cc index d69900d1f56..4c3f9c98282 100644 --- a/gcc/gimple-range-op.cc +++ b/gcc/gimple-range-op.cc @@ -1281,6 +1281,60 @@ public: } } op_cfn_isfinite; +//Implement range operator for CFN_BUILT_IN_ISNORMAL +class cfn_isnormal : public range_operator +{ +public: + using range_operator::fold_range; + using range_operator::op1_range; + virtual bool fold_range (irange &r, tree type, const frange &op1, + const irange &, relation_trio) const override + { + if (op1.undefined_p ()) + return false; + + if (op1.known_isnormal ()) + { + r.set_nonzero (type); + return true; + } + + if (op1.known_isnan () + || op1.known_isinf () + || op1.known_isdenormal_or_zero ()) + { + r.set_zero (type); + return true; + } + + r.set_varying (type); + return true; + } + virtual bool op1_range (frange &r, tree type, const irange &lhs, + const frange &, relation_trio) const override + { + if (lhs.undefined_p ()) + return false; + + if (lhs.zero_p ()) + { + r.set_varying (type); + return true; + } + + if (!range_includes_zero_p (lhs)) + { + nan_state nan (false); + r.set (type, real_min_representable (type), + real_max_representable (type), nan); + return true; + } + + r.set_varying (type); + return true; + } +} op_cfn_isnormal; + // Implement range operator for CFN_BUILT_IN_ class cfn_parity : public range_operator { @@ -1383,6 +1437,11 @@ gimple_range_op_handler::maybe_builtin_call () m_operator = &op_cfn_isfinite; break; + case CFN_BUILT_IN_ISNORMAL: + m_op1 = gimple_call_arg (call, 0); + m_operator = &op_cfn_isnormal; + break; + CASE_CFN_COPYSIGN_ALL: m_op1 = gimple_call_arg (call, 0); m_op2 = gimple_call_arg (call, 1); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/range-isnormal.c b/gcc/testsuite/gcc.dg/tree-ssa/range-isnormal.c new file mode 100644 index 00000000000..c4df4d839b0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/range-isnormal.c @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-evrp" } */ + +#include +void link_error(); + +void test1 (double x) +{ + if (x < __DBL_MAX__ && x > __DBL_MIN__ && !__builtin_isnormal (x)) + link_error (); + + if (x < -__DBL_MIN__ && x > -__DBL_MAX__ && !__builtin_isnormal (x)) + link_error (); +} + +void test2 (float x) +{ + if (x < __FLT_MAX__ && x > __FLT_MIN__ && !__builtin_isnormal (x)) + link_error (); + + if (x < -__FLT_MIN__ && x > - __FLT_MAX__ && !__builtin_isnormal (x)) + link_error (); +} + +void test3 (double x) +{ + if (__builtin_isnormal (x) && __builtin_isinf (x)) + link_error (); +} + +void test4 (float x) +{ + if (__builtin_isnormal (x) && __builtin_isinf (x)) + link_error (); +} + +/* { dg-final { scan-tree-dump-not "link_error" "evrp" } } */ diff --git a/gcc/value-range.h b/gcc/value-range.h index 37ce91dc52d..1443d1906e5 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -588,6 +588,8 @@ public: bool maybe_isinf () const; bool signbit_p (bool &signbit) const; bool nan_signbit_p (bool &signbit) const; + bool known_isnormal () const; + bool known_isdenormal_or_zero () const; protected: virtual bool contains_p (tree cst) const override; @@ -1650,6 +1652,33 @@ frange::known_isfinite () const return (!maybe_isnan () && !real_isinf (&m_min) && !real_isinf (&m_max)); } +// Return TRUE if range is known to be normal. + +inline bool +frange::known_isnormal () const +{ + if (!known_isfinite ()) + return false; + + machine_mode mode = TYPE_MODE (type ()); + return (!real_isdenormal (&m_min, mode) && !real_isdenormal (&m_max, mode) + && !real_iszero (&m_min) && !real_iszero (&m_max) + && (!real_isneg (&m_min) || real_isneg (&m_max))); +} + +// Return TRUE if range is known to be denormal. + +inline bool +frange::known_isdenormal_or_zero () const +{ + if (!known_isfinite ()) + return false; + + machine_mode mode = TYPE_MODE (type ()); + return ((real_isdenormal (&m_min, mode) || real_iszero (&m_min)) + && (real_isdenormal (&m_max, mode) || real_iszero (&m_max))); +} + // Return TRUE if range may be infinite. inline bool