* [COMMITTED] x UNORD x should set NAN on the TRUE side (and !NAN on the FALSE side).
2022-10-10 12:49 [COMMITTED] Return non-legacy ranges in range.h Aldy Hernandez
@ 2022-10-10 12:49 ` Aldy Hernandez
2022-10-10 12:49 ` [COMMITTED] The true side of x != x should set NAN Aldy Hernandez
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Aldy Hernandez @ 2022-10-10 12:49 UTC (permalink / raw)
To: GCC patches; +Cc: Andrew MacLeod, Aldy Hernandez
gcc/ChangeLog:
* range-op-float.cc (foperator_unordered::op1_range): Set NAN when
operands are equal and result is TRUE.
---
gcc/range-op-float.cc | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc
index 68578aa6fe7..91833d3f855 100644
--- a/gcc/range-op-float.cc
+++ b/gcc/range-op-float.cc
@@ -1026,23 +1026,27 @@ bool
foperator_unordered::op1_range (frange &r, tree type,
const irange &lhs,
const frange &op2,
- relation_kind) const
+ relation_kind rel) const
{
switch (get_bool_state (r, lhs, type))
{
case BRS_TRUE:
+ if (rel == VREL_EQ)
+ r.set_nan (type);
// Since at least one operand must be NAN, if one of them is
// not, the other must be.
- if (!op2.maybe_isnan ())
+ else if (!op2.maybe_isnan ())
r.set_nan (type);
else
r.set_varying (type);
break;
case BRS_FALSE:
+ if (rel == VREL_EQ)
+ r.clear_nan ();
// A false UNORDERED means both operands are !NAN, so it's
// impossible for op2 to be a NAN.
- if (op2.known_isnan ())
+ else if (op2.known_isnan ())
r.set_undefined ();
else
{
--
2.37.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [COMMITTED] The true side of x != x should set NAN.
2022-10-10 12:49 [COMMITTED] Return non-legacy ranges in range.h Aldy Hernandez
2022-10-10 12:49 ` [COMMITTED] x UNORD x should set NAN on the TRUE side (and !NAN on the FALSE side) Aldy Hernandez
@ 2022-10-10 12:49 ` Aldy Hernandez
2022-10-10 12:49 ` [COMMITTED] Add frange::maybe_isnan (bool sign) Aldy Hernandez
2022-10-10 12:49 ` [COMMITTED] Make range-op-float entries public Aldy Hernandez
3 siblings, 0 replies; 5+ messages in thread
From: Aldy Hernandez @ 2022-10-10 12:49 UTC (permalink / raw)
To: GCC patches; +Cc: Andrew MacLeod, Aldy Hernandez
gcc/ChangeLog:
* range-op-float.cc (foperator_not_equal::op1_range): Set NAN on
TRUE side for x != x.
---
gcc/range-op-float.cc | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc
index 91833d3f855..5ffe38da53a 100644
--- a/gcc/range-op-float.cc
+++ b/gcc/range-op-float.cc
@@ -497,14 +497,17 @@ bool
foperator_not_equal::op1_range (frange &r, tree type,
const irange &lhs,
const frange &op2,
- relation_kind) const
+ relation_kind rel) const
{
switch (get_bool_state (r, lhs, type))
{
case BRS_TRUE:
+ // The TRUE side of op1 != op1 implies op1 is NAN.
+ if (rel == VREL_EQ)
+ r.set_nan (type);
// If the result is true, the only time we know anything is if
// OP2 is a constant.
- if (op2.singleton_p ())
+ else if (op2.singleton_p ())
{
// This is correct even if op1 is NAN, because the following
// range would be ~[tmp, tmp] with the NAN property set to
--
2.37.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [COMMITTED] Make range-op-float entries public.
2022-10-10 12:49 [COMMITTED] Return non-legacy ranges in range.h Aldy Hernandez
` (2 preceding siblings ...)
2022-10-10 12:49 ` [COMMITTED] Add frange::maybe_isnan (bool sign) Aldy Hernandez
@ 2022-10-10 12:49 ` Aldy Hernandez
3 siblings, 0 replies; 5+ messages in thread
From: Aldy Hernandez @ 2022-10-10 12:49 UTC (permalink / raw)
To: GCC patches; +Cc: Andrew MacLeod, Aldy Hernandez
gcc/ChangeLog:
* range-op-float.cc (class foperator_identity): Make members public.
(class foperator_equal): Same.
(class foperator_not_equal): Same.
(class foperator_lt): Same.
(class foperator_le): Same.
(class foperator_gt): Same.
(class foperator_ge): Same.
(class foperator_unordered): Same.
(class foperator_ordered): Same.
---
gcc/range-op-float.cc | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc
index 5ffe38da53a..3cf117d8931 100644
--- a/gcc/range-op-float.cc
+++ b/gcc/range-op-float.cc
@@ -315,7 +315,7 @@ class foperator_identity : public range_operator_float
{
using range_operator_float::fold_range;
using range_operator_float::op1_range;
-
+public:
bool fold_range (frange &r, tree type ATTRIBUTE_UNUSED,
const frange &op1, const frange &op2 ATTRIBUTE_UNUSED,
relation_kind) const final override
@@ -338,7 +338,7 @@ class foperator_equal : public range_operator_float
using range_operator_float::fold_range;
using range_operator_float::op1_range;
using range_operator_float::op2_range;
-
+public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
relation_kind rel) const final override;
@@ -444,7 +444,7 @@ class foperator_not_equal : public range_operator_float
{
using range_operator_float::fold_range;
using range_operator_float::op1_range;
-
+public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
relation_kind rel) const final override;
@@ -545,7 +545,7 @@ class foperator_lt : public range_operator_float
using range_operator_float::fold_range;
using range_operator_float::op1_range;
using range_operator_float::op2_range;
-
+public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
relation_kind rel) const final override;
@@ -660,7 +660,7 @@ class foperator_le : public range_operator_float
using range_operator_float::fold_range;
using range_operator_float::op1_range;
using range_operator_float::op2_range;
-
+public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
relation_kind rel) const final override;
@@ -767,7 +767,7 @@ class foperator_gt : public range_operator_float
using range_operator_float::fold_range;
using range_operator_float::op1_range;
using range_operator_float::op2_range;
-
+public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
relation_kind rel) const final override;
@@ -882,7 +882,7 @@ class foperator_ge : public range_operator_float
using range_operator_float::fold_range;
using range_operator_float::op1_range;
using range_operator_float::op2_range;
-
+public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
relation_kind rel) const final override;
@@ -993,7 +993,6 @@ class foperator_unordered : public range_operator_float
using range_operator_float::fold_range;
using range_operator_float::op1_range;
using range_operator_float::op2_range;
-
public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
@@ -1071,7 +1070,6 @@ class foperator_ordered : public range_operator_float
using range_operator_float::fold_range;
using range_operator_float::op1_range;
using range_operator_float::op2_range;
-
public:
bool fold_range (irange &r, tree type,
const frange &op1, const frange &op2,
--
2.37.3
^ permalink raw reply [flat|nested] 5+ messages in thread