]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Implement operator_bitwise_and for prange.
authorAldy Hernandez <aldyh@redhat.com>
Wed, 20 Mar 2024 09:23:31 +0000 (10:23 +0100)
committerAldy Hernandez <aldyh@redhat.com>
Sat, 4 May 2024 08:25:51 +0000 (10:25 +0200)
gcc/ChangeLog:

* range-op-mixed.h: Add overloaded declarations for pointer variants.
* range-op-ptr.cc (operator_bitwise_and::fold_range): New.
(operator_bitwise_and::pointers_handled_p): New.

gcc/range-op-mixed.h
gcc/range-op-ptr.cc

index 0df300781f18638da31684409c05093332caead9..6158fc51f8e478ecc65cc8042577cd7d169e7f19 100644 (file)
@@ -712,10 +712,15 @@ private:
 class operator_bitwise_and : public range_operator
 {
 public:
+  using range_operator::fold_range;
   using range_operator::op1_range;
   using range_operator::op2_range;
   using range_operator::lhs_op1_relation;
   using range_operator::update_bitmask;
+  bool fold_range (prange &r, tree type,
+                  const prange &op1,
+                  const prange &op2,
+                  relation_trio) const final override;
   bool op1_range (irange &r, tree type,
                  const irange &lhs, const irange &op2,
                  relation_trio rel = TRIO_VARYING) const override;
@@ -730,6 +735,7 @@ public:
   // Check compatibility of all operands.
   bool operand_check_p (tree t1, tree t2, tree t3) const final override
     { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
+  bool pointers_handled_p (range_op_dispatch_type, unsigned) const final override;
 protected:
   void wi_fold (irange &r, tree type, const wide_int &lh_lb,
                const wide_int &lh_ub, const wide_int &rh_lb,
index b90b8bb9f65c24922263983a9f9d1e0fc498239c..8d5049b1daf8a5a98e5e5d5e809fdc61a2724815 100644 (file)
@@ -1189,6 +1189,36 @@ operator_addr_expr::pointers_handled_p (range_op_dispatch_type type,
     }
 }
 
+bool
+operator_bitwise_and::fold_range (prange &r, tree type,
+                                 const prange &op1,
+                                 const prange &op2 ATTRIBUTE_UNUSED,
+                                 relation_trio) const
+{
+  // For pointer types, we are really only interested in asserting
+  // whether the expression evaluates to non-NULL.
+  if (op1.zero_p () || op2.zero_p ())
+    r.set_zero (type);
+  else
+    r.set_varying (type);
+
+  update_known_bitmask (r, BIT_AND_EXPR, op1, op2);
+  return true;
+}
+
+bool
+operator_bitwise_and::pointers_handled_p (range_op_dispatch_type type,
+                                         unsigned dispatch) const
+{
+  switch (type)
+    {
+    case DISPATCH_FOLD_RANGE:
+      return dispatch == RO_PPP;
+    default:
+      return true;
+    }
+}
+
 // Initialize any pointer operators to the primary table
 
 void