aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2024-03-20 10:12:47 +0100
committerAldy Hernandez <aldyh@redhat.com>2024-05-04 10:25:51 +0200
commitf803b93feef60c8c2d4f7f7270bfc94650dbc8f5 (patch)
treed71553daaaa3efb0089e16a6700b918cffa882f9
parent86ff3c45ea82452888244476f26a4f628b148ace (diff)
downloadgcc-f803b93feef60c8c2d4f7f7270bfc94650dbc8f5.zip
gcc-f803b93feef60c8c2d4f7f7270bfc94650dbc8f5.tar.gz
gcc-f803b93feef60c8c2d4f7f7270bfc94650dbc8f5.tar.bz2
Implement operator_pointer_diff for prange.
gcc/ChangeLog: * range-op-ptr.cc (operator_pointer_diff::op1_op2_relation_effect): New. (operator_pointer_diff::pointers_handled_p): New.
-rw-r--r--gcc/range-op-ptr.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/range-op-ptr.cc b/gcc/range-op-ptr.cc
index a441821..b90b8bb 100644
--- a/gcc/range-op-ptr.cc
+++ b/gcc/range-op-ptr.cc
@@ -564,12 +564,44 @@ class operator_pointer_diff : public range_operator
const irange &op1_range,
const irange &op2_range,
relation_kind rel) const;
+ virtual bool op1_op2_relation_effect (irange &lhs_range,
+ tree type,
+ const prange &op1_range,
+ const prange &op2_range,
+ relation_kind rel) const final override;
void update_bitmask (irange &r, const irange &lh, const irange &rh) const
{ update_known_bitmask (r, POINTER_DIFF_EXPR, lh, rh); }
+ void update_bitmask (irange &r,
+ const prange &lh, const prange &rh) const final override
+ { update_known_bitmask (r, POINTER_DIFF_EXPR, lh, rh); }
+ bool pointers_handled_p (range_op_dispatch_type, unsigned) const final override;
} op_pointer_diff;
bool
operator_pointer_diff::op1_op2_relation_effect (irange &lhs_range, tree type,
+ const prange &op1_range,
+ const prange &op2_range,
+ relation_kind rel) const
+{
+ int_range<2> op1, op2, tmp;
+ range_op_handler cast (CONVERT_EXPR);
+
+ if (!cast.fold_range (op1, type, op1_range, tmp)
+ || !cast.fold_range (op2, type, op2_range, tmp))
+ return false;
+
+ return minus_op1_op2_relation_effect (lhs_range, type, op1, op2, rel);
+}
+
+bool
+operator_pointer_diff::pointers_handled_p (range_op_dispatch_type,
+ unsigned) const
+{
+ return true;
+}
+
+bool
+operator_pointer_diff::op1_op2_relation_effect (irange &lhs_range, tree type,
const irange &op1_range,
const irange &op2_range,
relation_kind rel) const