]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Provide a routine for NAME == NAME relation.
authorAndrew MacLeod <amacleod@redhat.com>
Wed, 2 Aug 2023 14:58:37 +0000 (10:58 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Thu, 3 Aug 2023 18:19:54 +0000 (14:19 -0400)
We've been assuming x == x s VREL_EQ in GORI, but this is not always going to
be true with floating point.  Provide an API to return the relation.

* gimple-range-gori.cc (gori_compute::compute_operand1_range):
Use identity relation.
(gori_compute::compute_operand2_range): Ditto.
* value-relation.cc (get_identity_relation): New.
* value-relation.h (get_identity_relation): New prototype.

gcc/gimple-range-gori.cc
gcc/value-relation.cc
gcc/value-relation.h

index 6dc15a0ce3fd52aea8b7fbee222b9f843ae2269f..c37e54bcf842a596b3b18ed88a7dbb573c6e911f 100644 (file)
@@ -1142,7 +1142,10 @@ gori_compute::compute_operand1_range (vrange &r,
 
       // If op1 == op2, create a new trio for just this call.
       if (op1 == op2 && gimple_range_ssa_p (op1))
-       trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), VREL_EQ);
+       {
+         relation_kind k = get_identity_relation (op1, op1_range);
+         trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), k);
+       }
       if (!handler.calc_op1 (r, lhs, op2_range, trio))
        return false;
     }
@@ -1218,7 +1221,10 @@ gori_compute::compute_operand2_range (vrange &r,
 
   // If op1 == op2, create a new trio for this stmt.
   if (op1 == op2 && gimple_range_ssa_p (op1))
-    trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), VREL_EQ);
+    {
+      relation_kind k = get_identity_relation (op1, op1_range);
+      trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), k);
+    }
   // Intersect with range for op2 based on lhs and op1.
   if (!handler.calc_op2 (r, lhs, op1_range, trio))
     return false;
index 7df2cd6e961e863011ed520dc41d63c8c1e1da24..f2c668a0193930055b10405ada671ddb069fb536 100644 (file)
@@ -183,6 +183,20 @@ relation_transitive (relation_kind r1, relation_kind r2)
   return relation_kind (rr_transitive_table[r1][r2]);
 }
 
+// When operands of a statement are identical ssa_names, return the
+// approriate relation between operands for NAME == NAME, given RANGE.
+//
+relation_kind
+get_identity_relation (tree name, vrange &range ATTRIBUTE_UNUSED)
+{
+  // Return VREL_UNEQ when it is supported for floats as appropriate.
+  if (frange::supports_p (TREE_TYPE (name)))
+    return VREL_EQ;
+
+  // Otherwise return VREL_EQ.
+  return VREL_EQ;
+}
+
 // This vector maps a relation to the equivalent tree code.
 
 static const tree_code relation_to_code [VREL_LAST] = {
index be6e277421bf16663afae3050e8f7505d6de02c4..f00f84f93b645173f82a25619ea5c5c98d49c04c 100644 (file)
@@ -91,6 +91,9 @@ inline bool relation_equiv_p (relation_kind r)
 
 void print_relation (FILE *f, relation_kind rel);
 
+// Return relation for NAME == NAME with RANGE.
+relation_kind get_identity_relation (tree name, vrange &range);
+
 class relation_oracle
 {
 public: