public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: HAO CHEN GUI <guihaoc@linux.ibm.com>
To: gcc-patches <gcc-patches@gcc.gnu.org>
Cc: Segher Boessenkool <segher@kernel.crashing.org>,
	David <dje.gcc@gmail.com>, "Kewen.Lin" <linkw@linux.ibm.com>,
	Peter Bergner <bergner@linux.ibm.com>,
	Mikael Morin <morin-mikael@orange.fr>,
	"MacLeod, Andrew" <amacleod@redhat.com>,
	Aldy Hernandez <aldyh@redhat.com>,
	Jakub Jelinek <jakub@redhat.com>,
	Richard Sandiford <richard.sandiford@arm.com>
Subject: Ping^3 [PATCH-1v3] Value Range: Add range op for builtin isinf
Date: Mon, 1 Jul 2024 09:11:05 +0800	[thread overview]
Message-ID: <55e2aa2f-675f-468a-a8f9-d228f9751398@linux.ibm.com> (raw)
In-Reply-To: <e3bc4924-f3b3-4087-9887-a729e9a2c0e9@linux.ibm.com>

Hi,
  Gently ping it.
https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653096.html

Thanks
Gui Haochen

在 2024/6/24 9:40, HAO CHEN GUI 写道:
> Hi,
>   Gently ping it.
> https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653096.html
> 
> Thanks
> Gui Haochen
> 
> 在 2024/6/20 14:56, HAO CHEN GUI 写道:
>> Hi,
>>   Gently ping it.
>> https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653096.html
>>
>> Thanks
>> Gui Haochen
>>
>> 在 2024/5/30 10:46, HAO CHEN GUI 写道:
>>> Hi,
>>>   The builtin isinf is not folded at front end if the corresponding optab
>>> exists. It causes the range evaluation failed on the targets which has
>>> optab_isinf. For instance, range-sincos.c will fail on the targets which
>>> has optab_isinf as it calls builtin_isinf.
>>>
>>>   This patch fixed the problem by adding range op for builtin isinf.
>>>
>>>   Compared with previous version, the main change is to set the range to
>>> 1 if it's infinite number otherwise to 0.
>>> https://gcc.gnu.org/pipermail/gcc-patches/2024-May/652219.html
>>>
>>>   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 isinf
>>>
>>> The builtin isinf is not folded at front end if the corresponding optab
>>> exists.  So the range op for isinf is needed for value range analysis.
>>> This patch adds range op for builtin isinf.
>>>
>>> gcc/
>>> 	* gimple-range-op.cc (class cfn_isinf): New.
>>> 	(op_cfn_isinf): New variables.
>>> 	(gimple_range_op_handler::maybe_builtin_call): Handle
>>> 	CASE_FLT_FN (BUILT_IN_ISINF).
>>>
>>> gcc/testsuite/
>>> 	* gcc/testsuite/gcc.dg/tree-ssa/range-isinf.c: New test.
>>>
>>> patch.diff
>>> diff --git a/gcc/gimple-range-op.cc b/gcc/gimple-range-op.cc
>>> index 55dfbb23ce2..4e60a42eaac 100644
>>> --- a/gcc/gimple-range-op.cc
>>> +++ b/gcc/gimple-range-op.cc
>>> @@ -1175,6 +1175,63 @@ private:
>>>    bool m_is_pos;
>>>  } op_cfn_goacc_dim_size (false), op_cfn_goacc_dim_pos (true);
>>>
>>> +// Implement range operator for CFN_BUILT_IN_ISINF
>>> +class cfn_isinf : 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_isinf ())
>>> +      {
>>> +	wide_int one = wi::one (TYPE_PRECISION (type));
>>> +	r.set (type, one, one);
>>> +	return true;
>>> +      }
>>> +
>>> +    if (op1.known_isnan ()
>>> +	|| (!real_isinf (&op1.lower_bound ())
>>> +	    && !real_isinf (&op1.upper_bound ())))
>>> +      {
>>> +	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 ())
>>> +      {
>>> +	nan_state nan (true);
>>> +	r.set (type, real_min_representable (type),
>>> +	       real_max_representable (type), nan);
>>> +	return true;
>>> +      }
>>> +
>>> +    if (!range_includes_zero_p (lhs))
>>> +      {
>>> +	// The range is [-INF,-INF][+INF,+INF], but it can't be represented.
>>> +	// Set range to [-INF,+INF]
>>> +	r.set_varying (type);
>>> +	r.clear_nan ();
>>> +	return true;
>>> +      }
>>> +
>>> +    r.set_varying (type);
>>> +    return true;
>>> +  }
>>> +} op_cfn_isinf;
>>>
>>>  // Implement range operator for CFN_BUILT_IN_
>>>  class cfn_parity : public range_operator
>>> @@ -1268,6 +1325,11 @@ gimple_range_op_handler::maybe_builtin_call ()
>>>        m_operator = &op_cfn_signbit;
>>>        break;
>>>
>>> +    CASE_FLT_FN (BUILT_IN_ISINF):
>>> +      m_op1 = gimple_call_arg (call, 0);
>>> +      m_operator = &op_cfn_isinf;
>>> +      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-isinf.c b/gcc/testsuite/gcc.dg/tree-ssa/range-isinf.c
>>> new file mode 100644
>>> index 00000000000..468f1bcf5c7
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gcc.dg/tree-ssa/range-isinf.c
>>> @@ -0,0 +1,44 @@
>>> +/* { dg-do compile } */
>>> +/* { dg-options "-O2 -fdump-tree-evrp" } */
>>> +
>>> +#include <math.h>
>>> +void link_error();
>>> +
>>> +void
>>> +test1 (double x)
>>> +{
>>> +  if (x > __DBL_MAX__ && !__builtin_isinf (x))
>>> +    link_error ();
>>> +  if (x < -__DBL_MAX__ && !__builtin_isinf (x))
>>> +    link_error ();
>>> +}
>>> +
>>> +void
>>> +test2 (float x)
>>> +{
>>> +  if (x > __FLT_MAX__ && !__builtin_isinf (x))
>>> +    link_error ();
>>> +  if (x < -__FLT_MAX__ && !__builtin_isinf (x))
>>> +    link_error ();
>>> +}
>>> +
>>> +void
>>> +test3 (double x)
>>> +{
>>> +  if (!__builtin_isinf (x) && !__builtin_isnan (x) && x > __DBL_MAX__)
>>> +    link_error ();
>>> +  if (!__builtin_isinf (x) && !__builtin_isnan (x) && x < -__DBL_MAX__)
>>> +    link_error ();
>>> +}
>>> +
>>> +void
>>> +test4 (float x)
>>> +{
>>> +  if (!__builtin_isinf (x) && !__builtin_isnan (x) && x > __FLT_MAX__)
>>> +    link_error ();
>>> +  if (!__builtin_isinf (x) && !__builtin_isnan (x) && x < -__FLT_MAX__)
>>> +    link_error ();
>>> +}
>>> +
>>> +/* { dg-final { scan-tree-dump-not "link_error" "evrp" } } */
>>> +

      reply	other threads:[~2024-07-01 12:36 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-30  2:46 HAO CHEN GUI
2024-06-20  6:56 ` Ping " HAO CHEN GUI
2024-06-24  1:40   ` Ping^2 " HAO CHEN GUI
2024-07-01  1:11     ` HAO CHEN GUI [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=55e2aa2f-675f-468a-a8f9-d228f9751398@linux.ibm.com \
    --to=guihaoc@linux.ibm.com \
    --cc=aldyh@redhat.com \
    --cc=amacleod@redhat.com \
    --cc=bergner@linux.ibm.com \
    --cc=dje.gcc@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    --cc=linkw@linux.ibm.com \
    --cc=morin-mikael@orange.fr \
    --cc=richard.sandiford@arm.com \
    --cc=segher@kernel.crashing.org \
    /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).