diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2023-08-01 14:33:09 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2023-08-03 14:19:54 -0400 |
commit | 9fedc3c010ff81f290e4e97cbcd0847ca803dcc4 (patch) | |
tree | 5992855c966e51ac98a42c5c064ed986f1619191 /gcc/gimple-range-fold.cc | |
parent | 33f080a7f1d70440d02de70af8f08eca21714abb (diff) | |
download | gcc-9fedc3c010ff81f290e4e97cbcd0847ca803dcc4.zip gcc-9fedc3c010ff81f290e4e97cbcd0847ca803dcc4.tar.gz gcc-9fedc3c010ff81f290e4e97cbcd0847ca803dcc4.tar.bz2 |
Add operand ranges to op1_op2_relation API.
With additional floating point relations in the pipeline, we can no
longer tell based on the LHS what the relation of X < Y is without knowing
the type of X and Y.
* gimple-range-fold.cc (fold_using_range::range_of_range_op): Add
ranges to the call to relation_fold_and_or.
(fold_using_range::relation_fold_and_or): Add op1 and op2 ranges.
(fur_source::register_outgoing_edges): Add op1 and op2 ranges.
* gimple-range-fold.h (relation_fold_and_or): Adjust params.
* gimple-range-gori.cc (gori_compute::compute_operand_range): Add
a varying op1 and op2 to call.
* range-op-float.cc (range_operator::op1_op2_relation): New dafaults.
(operator_equal::op1_op2_relation): New float version.
(operator_not_equal::op1_op2_relation): Ditto.
(operator_lt::op1_op2_relation): Ditto.
(operator_le::op1_op2_relation): Ditto.
(operator_gt::op1_op2_relation): Ditto.
(operator_ge::op1_op2_relation) Ditto.
* range-op-mixed.h (operator_equal::op1_op2_relation): New float
prototype.
(operator_not_equal::op1_op2_relation): Ditto.
(operator_lt::op1_op2_relation): Ditto.
(operator_le::op1_op2_relation): Ditto.
(operator_gt::op1_op2_relation): Ditto.
(operator_ge::op1_op2_relation): Ditto.
* range-op.cc (range_op_handler::op1_op2_relation): Dispatch new
variations.
(range_operator::op1_op2_relation): Add extra params.
(operator_equal::op1_op2_relation): Ditto.
(operator_not_equal::op1_op2_relation): Ditto.
(operator_lt::op1_op2_relation): Ditto.
(operator_le::op1_op2_relation): Ditto.
(operator_gt::op1_op2_relation): Ditto.
(operator_ge::op1_op2_relation): Ditto.
* range-op.h (range_operator): New prototypes.
(range_op_handler): Ditto.
Diffstat (limited to 'gcc/gimple-range-fold.cc')
-rw-r--r-- | gcc/gimple-range-fold.cc | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc index ab2d996..7fa5a27 100644 --- a/gcc/gimple-range-fold.cc +++ b/gcc/gimple-range-fold.cc @@ -700,7 +700,7 @@ fold_using_range::range_of_range_op (vrange &r, relation_trio::op1_op2 (rel))) r.set_varying (type); if (irange::supports_p (type)) - relation_fold_and_or (as_a <irange> (r), s, src); + relation_fold_and_or (as_a <irange> (r), s, src, range1, range2); if (lhs) { if (src.gori ()) @@ -1103,7 +1103,8 @@ fold_using_range::range_of_ssa_name_with_loop_info (vrange &r, tree name, void fold_using_range::relation_fold_and_or (irange& lhs_range, gimple *s, - fur_source &src) + fur_source &src, vrange &op1, + vrange &op2) { // No queries or already folded. if (!src.gori () || !src.query ()->oracle () || lhs_range.singleton_p ()) @@ -1164,9 +1165,8 @@ fold_using_range::relation_fold_and_or (irange& lhs_range, gimple *s, return; int_range<2> bool_one = range_true (); - - 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, op1, op2); + relation_kind relation2 = handler2.op1_op2_relation (bool_one, op1, op2); if (relation1 == VREL_VARYING || relation2 == VREL_VARYING) return; @@ -1201,7 +1201,8 @@ fold_using_range::relation_fold_and_or (irange& lhs_range, gimple *s, // Register any outgoing edge relations from a conditional branch. void -fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge e1) +fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, + edge e0, edge e1) { int_range<2> e0_range, e1_range; tree name; @@ -1236,17 +1237,20 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge // if (a_2 < b_5) tree ssa1 = gimple_range_ssa_p (handler.operand1 ()); tree ssa2 = gimple_range_ssa_p (handler.operand2 ()); + Value_Range r1,r2; if (ssa1 && ssa2) { + r1.set_varying (TREE_TYPE (ssa1)); + r2.set_varying (TREE_TYPE (ssa2)); if (e0) { - relation_kind relation = handler.op1_op2_relation (e0_range); + relation_kind relation = handler.op1_op2_relation (e0_range, r1, r2); 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, r1, r2); if (relation != VREL_VARYING) register_relation (e1, relation, ssa1, ssa2); } @@ -1273,17 +1277,19 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge Value_Range r (TREE_TYPE (name)); if (ssa1 && ssa2) { + r1.set_varying (TREE_TYPE (ssa1)); + r2.set_varying (TREE_TYPE (ssa2)); 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, r1, r2); 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, r1, r2); if (relation != VREL_VARYING) register_relation (e1, relation, ssa1, ssa2); } |