commit 3715234f2cba21f2b9ec6c609b6f058d1d8af500 Author: Andrew MacLeod Date: Tue Apr 11 12:25:49 2023 -0400 Add op1 and op2 ranges to op1_op2_relation. * gimple-range-fold.cc (fold_using_range::relation_fold_and_or): Provide VARYING for op1 and op2 when calling op1_op2_relation. (fur_source::register_outgoing_edges): Ditto. * gimple-range-gori.cc (gori_compute::compute_operand1_range): Pass op1 and op2 ranges to op1_op2_relation. (gori_compute::compute_operand2_range): Ditto. * range-op-float.cc (*::op1_op2_relation): Adjust params. * range-op.cc (*::op1_op2_relation): Adjust params. * range-op.h (*::op1_op2_relation): Adjust params. diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc index e81f6b3699e..3170b1e71a1 100644 --- a/gcc/gimple-range-fold.cc +++ b/gcc/gimple-range-fold.cc @@ -1051,9 +1051,11 @@ fold_using_range::relation_fold_and_or (irange& lhs_range, gimple *s, return; int_range<2> bool_one (boolean_true_node, boolean_true_node); + Value_Range op (TREE_TYPE (ssa1)); + op.set_varying (TREE_TYPE (ssa1)); - relation_kind relation1 = handler1.op1_op2_relation (bool_one); - relation_kind relation2 = handler2.op1_op2_relation (bool_one); + relation_kind relation1 = handler1.op1_op2_relation (bool_one, op, op); + relation_kind relation2 = handler2.op1_op2_relation (bool_one, op, op); if (relation1 == VREL_VARYING || relation2 == VREL_VARYING) return; @@ -1125,15 +1127,17 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge tree ssa2 = gimple_range_ssa_p (handler.operand2 ()); if (ssa1 && ssa2) { + Value_Range op (TREE_TYPE (ssa1)); + op.set_varying (TREE_TYPE (ssa1)); if (e0) { - relation_kind relation = handler.op1_op2_relation (e0_range); + relation_kind relation = handler.op1_op2_relation (e0_range, op, op); if (relation != VREL_VARYING) register_relation (e0, relation, ssa1, ssa2); } if (e1) { - relation_kind relation = handler.op1_op2_relation (e1_range); + relation_kind relation = handler.op1_op2_relation (e1_range, op, op); if (relation != VREL_VARYING) register_relation (e1, relation, ssa1, ssa2); } @@ -1160,17 +1164,19 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge Value_Range r (TREE_TYPE (name)); if (ssa1 && ssa2) { + Value_Range op (TREE_TYPE (ssa1)); + op.set_varying (TREE_TYPE (ssa1)); if (e0 && gori ()->outgoing_edge_range_p (r, e0, name, *m_query) && r.singleton_p ()) { - relation_kind relation = handler.op1_op2_relation (r); + relation_kind relation = handler.op1_op2_relation (r, op, op); if (relation != VREL_VARYING) register_relation (e0, relation, ssa1, ssa2); } if (e1 && gori ()->outgoing_edge_range_p (r, e1, name, *m_query) && r.singleton_p ()) { - relation_kind relation = handler.op1_op2_relation (r); + relation_kind relation = handler.op1_op2_relation (r, op, op); if (relation != VREL_VARYING) register_relation (e1, relation, ssa1, ssa2); } diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc index d77e1f51ac2..a488c230f6c 100644 --- a/gcc/gimple-range-gori.cc +++ b/gcc/gimple-range-gori.cc @@ -1105,7 +1105,8 @@ gori_compute::compute_operand1_range (vrange &r, // This allows multiple relations to be processed in compound logicals. if (gimple_range_ssa_p (op1) && gimple_range_ssa_p (op2)) { - relation_kind k = handler.op1_op2_relation (lhs); + relation_kind k = handler.op1_op2_relation (lhs, op1_range, + op2_range); if (k != VREL_VARYING) { op_op = k; @@ -1210,7 +1211,7 @@ gori_compute::compute_operand2_range (vrange &r, // This allows multiple relations to be processed in compound logicals. if (gimple_range_ssa_p (op1) && gimple_range_ssa_p (op2)) { - relation_kind k = handler.op1_op2_relation (lhs); + relation_kind k = handler.op1_op2_relation (lhs, op1_range, op2_range); if (k != VREL_VARYING) { op_op = k; diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc index e0e91bad44d..72de8f2a856 100644 --- a/gcc/range-op-float.cc +++ b/gcc/range-op-float.cc @@ -233,13 +233,17 @@ range_operator_float::lhs_op2_relation (const frange &lhs ATTRIBUTE_UNUSED, } relation_kind -range_operator_float::op1_op2_relation (const irange &lhs ATTRIBUTE_UNUSED) const +range_operator_float::op1_op2_relation (const irange &lhs ATTRIBUTE_UNUSED, + const frange &op1 ATTRIBUTE_UNUSED, + const frange &op2 ATTRIBUTE_UNUSED) const { return VREL_VARYING; } relation_kind -range_operator_float::op1_op2_relation (const frange &lhs ATTRIBUTE_UNUSED) const +range_operator_float::op1_op2_relation (const frange &lhs ATTRIBUTE_UNUSED, + const frange &op1 ATTRIBUTE_UNUSED, + const frange &op2 ATTRIBUTE_UNUSED) const { return VREL_VARYING; } @@ -578,7 +582,8 @@ public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, relation_trio = TRIO_VARYING) const final override; - relation_kind op1_op2_relation (const irange &lhs) const final override + relation_kind op1_op2_relation (const irange &lhs, const frange &, + const frange &) const final override { return equal_op1_op2_relation (lhs); } @@ -706,7 +711,8 @@ public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, relation_trio rel = TRIO_VARYING) const final override; - relation_kind op1_op2_relation (const irange &lhs) const final override + relation_kind op1_op2_relation (const irange &lhs, const frange &, + const frange &) const final override { return not_equal_op1_op2_relation (lhs); } @@ -829,7 +835,8 @@ public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, relation_trio = TRIO_VARYING) const final override; - relation_kind op1_op2_relation (const irange &lhs) const final override + relation_kind op1_op2_relation (const irange &lhs, const frange &, + const frange &) const final override { return lt_op1_op2_relation (lhs); } @@ -945,7 +952,8 @@ public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, relation_trio rel = TRIO_VARYING) const final override; - relation_kind op1_op2_relation (const irange &lhs) const final override + relation_kind op1_op2_relation (const irange &lhs, const frange &, + const frange &) const final override { return le_op1_op2_relation (lhs); } @@ -1055,7 +1063,8 @@ public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, relation_trio = TRIO_VARYING) const final override; - relation_kind op1_op2_relation (const irange &lhs) const final override + relation_kind op1_op2_relation (const irange &lhs, const frange &, + const frange &) const final override { return gt_op1_op2_relation (lhs); } @@ -1175,7 +1184,8 @@ public: bool fold_range (irange &r, tree type, const frange &op1, const frange &op2, relation_trio = TRIO_VARYING) const final override; - relation_kind op1_op2_relation (const irange &lhs) const final override + relation_kind op1_op2_relation (const irange &lhs, const frange &, + const frange &) const final override { return ge_op1_op2_relation (lhs); } diff --git a/gcc/range-op.cc b/gcc/range-op.cc index f90e78dcfbc..876747110a9 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -368,11 +368,14 @@ range_operator::lhs_op2_relation (const irange &lhs ATTRIBUTE_UNUSED, } relation_kind -range_operator::op1_op2_relation (const irange &lhs ATTRIBUTE_UNUSED) const +range_operator::op1_op2_relation (const irange &lhs ATTRIBUTE_UNUSED, + const irange &op1 ATTRIBUTE_UNUSED, + const irange &op2 ATTRIBUTE_UNUSED) const { return VREL_VARYING; } + // Default is no relation affects the LHS. bool @@ -565,7 +568,9 @@ public: const irange &lhs, const irange &val, relation_trio = TRIO_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, + const irange &, + const irange &) const; } op_equal; // Check if the LHS range indicates a relation between OP1 and OP2. @@ -587,7 +592,8 @@ equal_op1_op2_relation (const irange &lhs) } relation_kind -operator_equal::op1_op2_relation (const irange &lhs) const +operator_equal::op1_op2_relation (const irange &lhs, const irange &, + const irange &) const { return equal_op1_op2_relation (lhs); } @@ -685,7 +691,8 @@ public: const irange &lhs, const irange &op1, relation_trio = TRIO_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, const irange &, + const irange &) const; } op_not_equal; // Check if the LHS range indicates a relation between OP1 and OP2. @@ -707,7 +714,8 @@ not_equal_op1_op2_relation (const irange &lhs) } relation_kind -operator_not_equal::op1_op2_relation (const irange &lhs) const +operator_not_equal::op1_op2_relation (const irange &lhs, const irange &, + const irange &) const { return not_equal_op1_op2_relation (lhs); } @@ -865,7 +873,8 @@ public: const irange &lhs, const irange &op1, relation_trio = TRIO_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, const irange &, + const irange &) const; } op_lt; // Check if the LHS range indicates a relation between OP1 and OP2. @@ -887,7 +896,8 @@ lt_op1_op2_relation (const irange &lhs) } relation_kind -operator_lt::op1_op2_relation (const irange &lhs) const +operator_lt::op1_op2_relation (const irange &lhs, const irange &, + const irange &) const { return lt_op1_op2_relation (lhs); } @@ -985,7 +995,8 @@ public: const irange &lhs, const irange &op1, relation_trio = TRIO_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, const irange &, + const irange &) const; } op_le; // Check if the LHS range indicates a relation between OP1 and OP2. @@ -1007,7 +1018,8 @@ le_op1_op2_relation (const irange &lhs) } relation_kind -operator_le::op1_op2_relation (const irange &lhs) const +operator_le::op1_op2_relation (const irange &lhs, const irange &, + const irange &) const { return le_op1_op2_relation (lhs); } @@ -1102,7 +1114,8 @@ public: const irange &lhs, const irange &op1, relation_trio = TRIO_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, const irange &, + const irange &) const; } op_gt; // Check if the LHS range indicates a relation between OP1 and OP2. @@ -1124,7 +1137,8 @@ gt_op1_op2_relation (const irange &lhs) } relation_kind -operator_gt::op1_op2_relation (const irange &lhs) const +operator_gt::op1_op2_relation (const irange &lhs, const irange &, + const irange &) const { return gt_op1_op2_relation (lhs); } @@ -1218,7 +1232,8 @@ public: const irange &lhs, const irange &op1, relation_trio = TRIO_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, const irange &, + const irange &) const; } op_ge; // Check if the LHS range indicates a relation between OP1 and OP2. @@ -1240,7 +1255,8 @@ ge_op1_op2_relation (const irange &lhs) } relation_kind -operator_ge::op1_op2_relation (const irange &lhs) const +operator_ge::op1_op2_relation (const irange &lhs, const irange &, + const irange &) const { return ge_op1_op2_relation (lhs); } @@ -4845,14 +4861,21 @@ range_op_handler::lhs_op2_relation (const vrange &lhs, } relation_kind -range_op_handler::op1_op2_relation (const vrange &lhs) const +range_op_handler::op1_op2_relation (const vrange &lhs, const vrange &op1, + const vrange &op2) const { gcc_checking_assert (m_valid); if (m_int) - return m_int->op1_op2_relation (as_a (lhs)); + return m_int->op1_op2_relation (as_a (lhs), + as_a (op1), + as_a (op2)); if (is_a (lhs)) - return m_float->op1_op2_relation (as_a (lhs)); - return m_float->op1_op2_relation (as_a (lhs)); + return m_float->op1_op2_relation (as_a (lhs), + as_a (op1), + as_a (op2)); + return m_float->op1_op2_relation (as_a (lhs), + as_a (op1), + as_a (op2)); } // Cast the range in R to TYPE. diff --git a/gcc/range-op.h b/gcc/range-op.h index 03ef6b98542..310302b4ec9 100644 --- a/gcc/range-op.h +++ b/gcc/range-op.h @@ -89,7 +89,9 @@ public: const irange &op1, const irange &op2, relation_kind = VREL_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, + const irange &op1, + const irange &op2) const; protected: // Perform an integral operation between 2 sub-ranges and return it. virtual void wi_fold (irange &r, tree type, @@ -178,8 +180,12 @@ public: const frange &op1, const frange &op2, relation_kind = VREL_VARYING) const; - virtual relation_kind op1_op2_relation (const irange &lhs) const; - virtual relation_kind op1_op2_relation (const frange &lhs) const; + virtual relation_kind op1_op2_relation (const irange &lhs, + const frange &op1, + const frange &op2) const; + virtual relation_kind op1_op2_relation (const frange &lhs, + const frange &op1, + const frange &op2) const; }; class range_op_handler @@ -209,7 +215,8 @@ public: const vrange &op1, const vrange &op2, relation_kind = VREL_VARYING) const; - relation_kind op1_op2_relation (const vrange &lhs) const; + relation_kind op1_op2_relation (const vrange &lhs, const vrange &op1, + const vrange &op2) const; protected: void set_op_handler (enum tree_code code, tree type); bool m_valid;