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" } } */