diff mbox series

[COMMITTED,frange] Add op2_range for operator_not_equal.

Message ID 20230919163052.865027-1-aldyh@redhat.com
State New
Headers show
Series [COMMITTED,frange] Add op2_range for operator_not_equal. | expand

Commit Message

Aldy Hernandez Sept. 19, 2023, 4:30 p.m. UTC
We're missing an op2_range entry for operator_not_equal so GORI can
calculate an outgoing edge.  The false side of != is true and
guarantees we don't have a NAN, so it's important to get this right.
We eventually get it through an intersection of various ranges in
ranger, but it's best to get things correct as early as possible.

gcc/ChangeLog:

	* range-op-float.cc (operator_not_equal::op2_range): New.
	* range-op-mixed.h: Add operator_not_equal::op2_range.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/vrp-float-13.c: New test.
---
 gcc/range-op-float.cc                        |  8 ++++++++
 gcc/range-op-mixed.h                         |  3 +++
 gcc/testsuite/gcc.dg/tree-ssa/vrp-float-13.c | 16 ++++++++++++++++
 3 files changed, 27 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp-float-13.c
diff mbox series

Patch

diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc
index cc729e12a9e..91d3096fdac 100644
--- a/gcc/range-op-float.cc
+++ b/gcc/range-op-float.cc
@@ -900,6 +900,14 @@  operator_not_equal::op1_range (frange &r, tree type,
   return true;
 }
 
+bool
+operator_not_equal::op2_range (frange &r, tree type,
+			       const irange &lhs,
+			       const frange &op1,
+			       relation_trio trio) const
+{
+  return op1_range (r, type, lhs, op1, trio);
+}
 
 // Check if the LHS range indicates a relation between OP1 and OP2.
 
diff --git a/gcc/range-op-mixed.h b/gcc/range-op-mixed.h
index ef562326c1f..f7ff47b2725 100644
--- a/gcc/range-op-mixed.h
+++ b/gcc/range-op-mixed.h
@@ -164,6 +164,9 @@  public:
   bool op2_range (irange &r, tree type,
 		  const irange &lhs, const irange &op1,
 		  relation_trio = TRIO_VARYING) const final override;
+  bool op2_range (frange &r, tree type,
+		  const irange &lhs, const frange &op1,
+		  relation_trio = TRIO_VARYING) const final override;
 
   relation_kind op1_op2_relation (const irange &lhs, const irange &,
 				  const irange &) const final override;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp-float-13.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp-float-13.c
new file mode 100644
index 00000000000..f5a0164dd91
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp-float-13.c
@@ -0,0 +1,16 @@ 
+// { dg-do compile }
+// { dg-options "-O2 -fno-thread-jumps -fdisable-tree-fre1 -fdump-tree-evrp-details" }
+
+void a(float, float);
+void b(float, float);
+
+void foo(float x, float y)
+{
+  if (x != y)
+    a (x,y);
+  else if (x < y)
+    b (x,y);
+}
+
+// Test that the false side of if(x != y) has a range for y.
+// { dg-final { scan-tree-dump "2->4  \\(F\\) y_3\\(D\\)" "evrp" } }