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

Thanks
Gui Haochen

在 2024/6/24 9:41, HAO CHEN GUI 写道:
> Hi,
>   Gently ping it.
> https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653094.html
> 
> Thanks
> Gui Haochen
> 
> 在 2024/6/20 14:57, HAO CHEN GUI 写道:
>> Hi,
>>   Gently ping it.
>> https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653094.html
>>
>> Thanks
>> Gui Haochen
>>
>> 在 2024/5/30 10:46, HAO CHEN GUI 写道:
>>> Hi,
>>>   This patch adds the range op for builtin isfinite.
>>>
>>>   Compared to previous version, the main change is to set the range to
>>> 1 if it's finite number otherwise to 0.
>>> https://gcc.gnu.org/pipermail/gcc-patches/2024-May/652220.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 isfinite
>>>
>>> The former patch adds optab for builtin isfinite. Thus builtin isfinite
>>> might not be folded at front end.  So the range op for isfinite is needed
>>> for value range analysis.  This patch adds range op for builtin isfinite.
>>>
>>> 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.
>>>
>>> gcc/testsuite/
>>>     * gcc/testsuite/gcc.dg/tree-ssa/range-isfinite.c: New test.
>>>
>>> patch.diff
>>> diff --git a/gcc/gimple-range-op.cc b/gcc/gimple-range-op.cc
>>> index 4e60a42eaac..5ec5c828fa4 100644
>>> --- a/gcc/gimple-range-op.cc
>>> +++ b/gcc/gimple-range-op.cc
>>> @@ -1233,6 +1233,62 @@ public:
>>>    }
>>>  } op_cfn_isinf;
>>>
>>> +//Implement range operator for CFN_BUILT_IN_ISFINITE
>>> +class cfn_isfinite : 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_isfinite ())
>>> +      {
>>> +   wide_int one = wi::one (TYPE_PRECISION (type));
>>> +   r.set (type, one, one);
>>> +   return true;
>>> +      }
>>> +
>>> +    if (op1.known_isnan ()
>>> +   || op1.known_isinf ())
>>> +      {
>>> +   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 ())
>>> +      {
>>> +   // The range is [-INF,-INF][+INF,+INF] NAN, but it can't be represented.
>>> +   // Set range to varying
>>> +   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_isfinite;
>>> +
>>>  // Implement range operator for CFN_BUILT_IN_
>>>  class cfn_parity : public range_operator
>>>  {
>>> @@ -1330,6 +1386,11 @@ gimple_range_op_handler::maybe_builtin_call ()
>>>        m_operator = &op_cfn_isinf;
>>>        break;
>>>
>>> +    case CFN_BUILT_IN_ISFINITE:
>>> +      m_op1 = gimple_call_arg (call, 0);
>>> +      m_operator = &op_cfn_isfinite;
>>> +      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-isfinite.c 
>>> b/gcc/testsuite/gcc.dg/tree-ssa/range-isfinite.c
>>> new file mode 100644
>>> index 00000000000..f5dce0a0486
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gcc.dg/tree-ssa/range-isfinite.c
>>> @@ -0,0 +1,31 @@
>>> +/* { dg-do compile } */
>>> +/* { dg-options "-O2 -fdump-tree-evrp" } */
>>> +
>>> +#include <math.h>
>>> +void link_error();
>>> +
>>> +void test1 (double x)
>>> +{
>>> +  if (x < __DBL_MAX__ && x > -__DBL_MAX__ && !__builtin_isfinite (x))
>>> +    link_error ();
>>> +}
>>> +
>>> +void test2 (float x)
>>> +{
>>> +  if (x < __FLT_MAX__ && x > -__FLT_MAX__ && !__builtin_isfinite (x))
>>> +    link_error ();
>>> +}
>>> +
>>> +void test3 (double x)
>>> +{
>>> +  if (__builtin_isfinite (x) && __builtin_isinf (x))
>>> +    link_error ();
>>> +}
>>> +
>>> +void test4 (float x)
>>> +{
>>> +  if (__builtin_isfinite (x) && __builtin_isinf (x))
>>> +    link_error ();
>>> +}
>>> +
>>> +/* { dg-final { scan-tree-dump-not "link_error" "evrp" } } */

Reply via email to