diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2024-03-20 10:12:47 +0100 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2024-05-04 10:25:51 +0200 |
commit | f803b93feef60c8c2d4f7f7270bfc94650dbc8f5 (patch) | |
tree | d71553daaaa3efb0089e16a6700b918cffa882f9 | |
parent | 86ff3c45ea82452888244476f26a4f628b148ace (diff) | |
download | gcc-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.cc | 32 |
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 |