public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Value range: Add range op for __builtin_isfinite
@ 2024-04-12  5:30 HAO CHEN GUI
  2024-04-23  9:10 ` rep.dot.nop
  0 siblings, 1 reply; 3+ messages in thread
From: HAO CHEN GUI @ 2024-04-12  5:30 UTC (permalink / raw)
  To: gcc-patches; +Cc: Segher Boessenkool, David, Kewen.Lin, Peter Bergner

Hi,
  The former patch adds isfinite optab for __builtin_isfinite.
https://gcc.gnu.org/pipermail/gcc-patches/2024-April/649339.html

  Thus the builtin might not be folded at front end. The range op for
isfinite is needed for value range analysis. This patch adds them.

  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 9de130b4022..99c511728d3 100644
--- a/gcc/gimple-range-op.cc
+++ b/gcc/gimple-range-op.cc
@@ -1192,6 +1192,56 @@ public:
   }
 } op_cfn_isinf;

+//Implement range operator for CFN_BUILT_IN_ISFINITE
+class cnf_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 ())
+      {
+	r.set_nonzero (type);
+	return true;
+      }
+
+    if (op1.known_isnan ()
+	|| op1.known_isinf ())
+      {
+	r.set_zero (type);
+	return true;
+      }
+
+    return false;
+  }
+  virtual bool op1_range (frange &r, tree type, const irange &lhs,
+			  const frange &, relation_trio) const override
+  {
+    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;
+      }
+
+    return false;
+  }
+} op_cfn_isfinite;
+
 // Implement range operator for CFN_BUILT_IN_
 class cfn_parity : public range_operator
 {
@@ -1288,6 +1338,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" } } */

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Value range: Add range op for __builtin_isfinite
  2024-04-12  5:30 [PATCH] Value range: Add range op for __builtin_isfinite HAO CHEN GUI
@ 2024-04-23  9:10 ` rep.dot.nop
  2024-04-24  1:55   ` HAO CHEN GUI
  0 siblings, 1 reply; 3+ messages in thread
From: rep.dot.nop @ 2024-04-23  9:10 UTC (permalink / raw)
  To: gcc-patches, HAO CHEN GUI, gcc-patches
  Cc: Segher Boessenkool, David, Kewen.Lin, Peter Bergner

On 12 April 2024 07:30:10 CEST, HAO CHEN GUI <guihaoc@linux.ibm.com> wrote:


>
>
>patch.diff
>diff --git a/gcc/gimple-range-op.cc b/gcc/gimple-range-op.cc
>index 9de130b4022..99c511728d3 100644
>--- a/gcc/gimple-range-op.cc
>+++ b/gcc/gimple-range-op.cc
>@@ -1192,6 +1192,56 @@ public:
>   }
> } op_cfn_isinf;
>
>+//Implement range operator for CFN_BUILT_IN_ISFINITE
>+class cnf_isfinite : public range_operator
>+{


s/cnf/cfn/g
I guess.
thanks

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Value range: Add range op for __builtin_isfinite
  2024-04-23  9:10 ` rep.dot.nop
@ 2024-04-24  1:55   ` HAO CHEN GUI
  0 siblings, 0 replies; 3+ messages in thread
From: HAO CHEN GUI @ 2024-04-24  1:55 UTC (permalink / raw)
  To: rep.dot.nop, gcc-patches
  Cc: Segher Boessenkool, David, Kewen.Lin, Peter Bergner

Yes, it's my typo.

Thanks.
Gui Haochen

在 2024/4/23 17:10, rep.dot.nop@gmail.com 写道:
> On 12 April 2024 07:30:10 CEST, HAO CHEN GUI <guihaoc@linux.ibm.com> wrote:
> 
> 
>>
>>
>> patch.diff
>> diff --git a/gcc/gimple-range-op.cc b/gcc/gimple-range-op.cc
>> index 9de130b4022..99c511728d3 100644
>> --- a/gcc/gimple-range-op.cc
>> +++ b/gcc/gimple-range-op.cc
>> @@ -1192,6 +1192,56 @@ public:
>>   }
>> } op_cfn_isinf;
>>
>> +//Implement range operator for CFN_BUILT_IN_ISFINITE
>> +class cnf_isfinite : public range_operator
>> +{
> 
> 
> s/cnf/cfn/g
> I guess.
> thanks

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-04-24  1:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-12  5:30 [PATCH] Value range: Add range op for __builtin_isfinite HAO CHEN GUI
2024-04-23  9:10 ` rep.dot.nop
2024-04-24  1:55   ` HAO CHEN GUI

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).