diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2022-10-13 18:03:58 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2022-10-17 09:20:39 -0400 |
commit | b565ac19264a5827162d28537bccc8531c25e817 (patch) | |
tree | 52a1122cf961dd409f02c3eb5c34811ed5e1f3e7 /gcc/range-op-float.cc | |
parent | 04874fedae8074b252abbd70fea68bf3dd0a605b (diff) | |
download | gcc-b565ac19264a5827162d28537bccc8531c25e817.zip gcc-b565ac19264a5827162d28537bccc8531c25e817.tar.gz gcc-b565ac19264a5827162d28537bccc8531c25e817.tar.bz2 |
Add relation_trio class for range-ops.
There are 3 possible relations range-ops might care about, but only the one
most likely to be needed is supplied. This patch provides a new class
relation_trio which allows 3 relations to be passed in a single word.
fold_range (), op1_range (), and op2_range () are adjusted to take a
relation_trio class instead of a relation_kind, then the routine can
extract which relation it wants to work with.
* gimple-range-fold.cc (fold_using_range::range_of_range_op):
Provide relation_trio class.
* gimple-range-gori.cc (gori_compute::refine_using_relation):
Provide relation_trio class.
(gori_compute::refine_using_relation): Ditto.
(gori_compute::compute_operand1_range): Provide lhs_op2 and
op1_op2 relations via relation_trio class.
(gori_compute::compute_operand2_range): Ditto.
* gimple-range-op.cc (gimple_range_op_handler::calc_op1): Use
relation_trio instead of relation_kind.
(gimple_range_op_handler::calc_op2): Ditto.
(*::fold_range): Ditto.
* gimple-range-op.h (gimple_range_op::calc_op1): Adjust prototypes.
(gimple_range_op::calc_op2): Adjust prototypes.
* range-op-float.cc (*::fold_range): Use relation_trio instead of
relation_kind.
(*::op1_range): Ditto.
(*::op2_range): Ditto.
* range-op.cc (*::fold_range): Use relation_trio instead of
relation_kind.
(*::op1_range): Ditto.
(*::op2_range): Ditto.
* range-op.h (class range_operator): Adjust prototypes.
(class range_operator_float): Ditto.
(class range_op_handler): Adjust prototypes.
(relop_early_resolve): Pickup op1_op2 relation from relation_trio.
* value-relation.cc (VREL_LAST): Adjust use to be one past the end of
the enum.
(relation_oracle::validate_relation): Use relation_trio in call
to fold_range.
* value-relation.h (enum relation_kind_t): Add VREL_LAST as
final element.
(class relation_trio): New.
(TRIO_VARYING, TRIO_SHIFT, TRIO_MASK): New.
Diffstat (limited to 'gcc/range-op-float.cc')
-rw-r--r-- | gcc/range-op-float.cc | 170 |
1 files changed, 87 insertions, 83 deletions
diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc index 6cf2180..e733479 100644 --- a/gcc/range-op-float.cc +++ b/gcc/range-op-float.cc @@ -53,7 +53,7 @@ range_operator_float::fold_range (frange &r ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED, const frange &lh ATTRIBUTE_UNUSED, const frange &rh ATTRIBUTE_UNUSED, - relation_kind rel ATTRIBUTE_UNUSED) const + relation_trio) const { return false; } @@ -63,7 +63,7 @@ range_operator_float::fold_range (irange &r ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED, const frange &lh ATTRIBUTE_UNUSED, const irange &rh ATTRIBUTE_UNUSED, - relation_kind rel ATTRIBUTE_UNUSED) const + relation_trio) const { return false; } @@ -73,7 +73,7 @@ range_operator_float::fold_range (irange &r ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED, const frange &lh ATTRIBUTE_UNUSED, const frange &rh ATTRIBUTE_UNUSED, - relation_kind rel ATTRIBUTE_UNUSED) const + relation_trio) const { return false; } @@ -83,7 +83,7 @@ range_operator_float::op1_range (frange &r ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED, const frange &lhs ATTRIBUTE_UNUSED, const frange &op2 ATTRIBUTE_UNUSED, - relation_kind rel ATTRIBUTE_UNUSED) const + relation_trio) const { return false; } @@ -93,7 +93,7 @@ range_operator_float::op1_range (frange &r ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED, const irange &lhs ATTRIBUTE_UNUSED, const frange &op2 ATTRIBUTE_UNUSED, - relation_kind rel ATTRIBUTE_UNUSED) const + relation_trio) const { return false; } @@ -103,7 +103,7 @@ range_operator_float::op2_range (frange &r ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED, const frange &lhs ATTRIBUTE_UNUSED, const frange &op1 ATTRIBUTE_UNUSED, - relation_kind rel ATTRIBUTE_UNUSED) const + relation_trio) const { return false; } @@ -113,7 +113,7 @@ range_operator_float::op2_range (frange &r ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED, const irange &lhs ATTRIBUTE_UNUSED, const frange &op1 ATTRIBUTE_UNUSED, - relation_kind rel ATTRIBUTE_UNUSED) const + relation_trio) const { return false; } @@ -188,7 +188,7 @@ finite_operands_p (const frange &op1, const frange &op2) inline bool frelop_early_resolve (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel, relation_kind my_rel) + relation_trio rel, relation_kind my_rel) { // If either operand is undefined, return VARYING. if (empty_range_varying (r, type, op1, op2)) @@ -324,14 +324,14 @@ class foperator_identity : public range_operator_float public: bool fold_range (frange &r, tree type ATTRIBUTE_UNUSED, const frange &op1, const frange &op2 ATTRIBUTE_UNUSED, - relation_kind = VREL_VARYING) const final override + relation_trio = TRIO_VARYING) const final override { r = op1; return true; } bool op1_range (frange &r, tree type ATTRIBUTE_UNUSED, const frange &lhs, const frange &op2 ATTRIBUTE_UNUSED, - relation_kind = VREL_VARYING) const final override + relation_trio = TRIO_VARYING) const final override { r = lhs; return true; @@ -348,26 +348,26 @@ class foperator_equal : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; relation_kind op1_op2_relation (const irange &lhs) const final override { return equal_op1_op2_relation (lhs); } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { - return op1_range (r, type, lhs, op1, rel); + return op1_range (r, type, lhs, op1, rel.swap_op1_op2 ()); } } fop_equal; bool foperator_equal::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel) const + relation_trio rel) const { if (frelop_early_resolve (r, type, op1, op2, rel, VREL_EQ)) return true; @@ -403,8 +403,9 @@ bool foperator_equal::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind rel) const + relation_trio trio) const { + relation_kind rel = trio.op1_op2 (); switch (get_bool_state (r, lhs, type)) { case BRS_TRUE: @@ -455,20 +456,20 @@ class foperator_not_equal : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel = VREL_VARYING) const final override; + relation_trio rel = TRIO_VARYING) const final override; relation_kind op1_op2_relation (const irange &lhs) const final override { return not_equal_op1_op2_relation (lhs); } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; } fop_not_equal; bool foperator_not_equal::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel) const + relation_trio rel) const { if (frelop_early_resolve (r, type, op1, op2, rel, VREL_NE)) return true; @@ -505,8 +506,9 @@ bool foperator_not_equal::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind rel) const + relation_trio trio) const { + relation_kind rel = trio.op1_op2 (); switch (get_bool_state (r, lhs, type)) { case BRS_TRUE: @@ -557,23 +559,23 @@ class foperator_lt : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; relation_kind op1_op2_relation (const irange &lhs) const final override { return lt_op1_op2_relation (lhs); } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; } fop_lt; bool foperator_lt::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel) const + relation_trio rel) const { if (frelop_early_resolve (r, type, op1, op2, rel, VREL_LT)) return true; @@ -599,7 +601,7 @@ foperator_lt::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -634,7 +636,7 @@ foperator_lt::op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -673,23 +675,23 @@ class foperator_le : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel = VREL_VARYING) const final override; + relation_trio rel = TRIO_VARYING) const final override; relation_kind op1_op2_relation (const irange &lhs) const final override { return le_op1_op2_relation (lhs); } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind rel = VREL_VARYING) const final override; + relation_trio rel = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind rel = VREL_VARYING) const final override; + relation_trio rel = TRIO_VARYING) const final override; } fop_le; bool foperator_le::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel) const + relation_trio rel) const { if (frelop_early_resolve (r, type, op1, op2, rel, VREL_LE)) return true; @@ -715,7 +717,7 @@ foperator_le::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -746,7 +748,7 @@ foperator_le::op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -781,23 +783,23 @@ class foperator_gt : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; relation_kind op1_op2_relation (const irange &lhs) const final override { return gt_op1_op2_relation (lhs); } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; } fop_gt; bool foperator_gt::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel) const + relation_trio rel) const { if (frelop_early_resolve (r, type, op1, op2, rel, VREL_GT)) return true; @@ -823,7 +825,7 @@ foperator_gt::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -858,7 +860,7 @@ foperator_gt::op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -897,23 +899,23 @@ class foperator_ge : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; relation_kind op1_op2_relation (const irange &lhs) const final override { return ge_op1_op2_relation (lhs); } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; } fop_ge; bool foperator_ge::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel) const + relation_trio rel) const { if (frelop_early_resolve (r, type, op1, op2, rel, VREL_GE)) return true; @@ -939,7 +941,7 @@ foperator_ge::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -969,7 +971,7 @@ bool foperator_ge::op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -1008,22 +1010,22 @@ class foperator_unordered : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { - return op1_range (r, type, lhs, op1, rel); + return op1_range (r, type, lhs, op1, rel.swap_op1_op2 ()); } } fop_unordered; bool foperator_unordered::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind) const + relation_trio) const { // UNORDERED is TRUE if either operand is a NAN. if (op1.known_isnan () || op2.known_isnan ()) @@ -1040,8 +1042,9 @@ bool foperator_unordered::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind rel) const + relation_trio trio) const { + relation_kind rel = trio.op1_op2 (); switch (get_bool_state (r, lhs, type)) { case BRS_TRUE: @@ -1081,22 +1084,22 @@ class foperator_ordered : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { - return op1_range (r, type, lhs, op1, rel); + return op1_range (r, type, lhs, op1, rel.swap_op1_op2 ()); } } fop_ordered; bool foperator_ordered::fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind) const + relation_trio) const { if (op1.known_isnan () || op2.known_isnan ()) r = range_false (type); @@ -1111,8 +1114,9 @@ bool foperator_ordered::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind rel) const + relation_trio trio) const { + relation_kind rel = trio.op1_op2 (); switch (get_bool_state (r, lhs, type)) { case BRS_TRUE: @@ -1148,7 +1152,7 @@ class foperator_negate : public range_operator_float public: bool fold_range (frange &r, tree type, const frange &op1, const frange &op2, - relation_kind = VREL_VARYING) const final override + relation_trio = TRIO_VARYING) const final override { if (empty_range_varying (r, type, op1, op2)) return true; @@ -1181,7 +1185,7 @@ public: } bool op1_range (frange &r, tree type, const frange &lhs, const frange &op2, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { return fold_range (r, type, lhs, op2, rel); } @@ -1194,16 +1198,16 @@ class foperator_abs : public range_operator_float public: bool fold_range (frange &r, tree type, const frange &op1, const frange &, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op1_range (frange &r, tree type, const frange &lhs, const frange &op2, - relation_kind rel = VREL_VARYING) const final override; + relation_trio rel = TRIO_VARYING) const final override; } fop_abs; bool foperator_abs::fold_range (frange &r, tree type, const frange &op1, const frange &op2, - relation_kind) const + relation_trio) const { if (empty_range_varying (r, type, op1, op2)) return true; @@ -1253,7 +1257,7 @@ foperator_abs::fold_range (frange &r, tree type, bool foperator_abs::op1_range (frange &r, tree type, const frange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { if (empty_range_varying (r, type, lhs, op2)) return true; @@ -1282,7 +1286,7 @@ class foperator_unordered_lt : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { if (op1.known_isnan () || op2.known_isnan ()) { @@ -1311,7 +1315,7 @@ class foperator_unordered_le : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { if (op1.known_isnan () || op2.known_isnan ()) { @@ -1332,16 +1336,16 @@ public: } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; } fop_unordered_le; bool foperator_unordered_le::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -1365,7 +1369,7 @@ foperator_unordered_le::op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -1392,7 +1396,7 @@ class foperator_unordered_gt : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { if (op1.known_isnan () || op2.known_isnan ()) { @@ -1413,10 +1417,10 @@ public: } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; } fop_unordered_gt; bool @@ -1424,7 +1428,7 @@ foperator_unordered_gt::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -1448,7 +1452,7 @@ foperator_unordered_gt::op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -1475,7 +1479,7 @@ class foperator_unordered_ge : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { if (op1.known_isnan () || op2.known_isnan ()) { @@ -1496,10 +1500,10 @@ public: } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; } fop_unordered_ge; bool @@ -1507,7 +1511,7 @@ foperator_unordered_ge::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -1530,7 +1534,7 @@ bool foperator_unordered_ge::op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { @@ -1557,7 +1561,7 @@ class foperator_unordered_equal : public range_operator_float public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { if (op1.known_isnan () || op2.known_isnan ()) { @@ -1578,12 +1582,12 @@ public: } bool op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind = VREL_VARYING) const final override; + relation_trio = TRIO_VARYING) const final override; bool op2_range (frange &r, tree type, const irange &lhs, const frange &op1, - relation_kind rel = VREL_VARYING) const final override + relation_trio rel = TRIO_VARYING) const final override { - return op1_range (r, type, lhs, op1, rel); + return op1_range (r, type, lhs, op1, rel.swap_op1_op2 ()); } } fop_unordered_equal; @@ -1591,7 +1595,7 @@ bool foperator_unordered_equal::op1_range (frange &r, tree type, const irange &lhs, const frange &op2, - relation_kind) const + relation_trio) const { switch (get_bool_state (r, lhs, type)) { |