aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range-fold.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2023-08-01 14:33:09 -0400
committerAndrew MacLeod <amacleod@redhat.com>2023-08-03 14:19:54 -0400
commit9fedc3c010ff81f290e4e97cbcd0847ca803dcc4 (patch)
tree5992855c966e51ac98a42c5c064ed986f1619191 /gcc/gimple-range-fold.cc
parent33f080a7f1d70440d02de70af8f08eca21714abb (diff)
downloadgcc-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.cc26
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);
}