aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range-gori.cc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-03-14 13:31:18 +0100
committerAldy Hernandez <aldyh@redhat.com>2022-06-01 10:55:45 +0200
commitcf5bea76f9d84f6218f0a5085db63a50aed9d95a (patch)
tree2470e9411d6fa9eb157d518d206ce414e869c951 /gcc/gimple-range-gori.cc
parent59c8e96dd02383baec4c15665985da3caadaaa5e (diff)
downloadgcc-cf5bea76f9d84f6218f0a5085db63a50aed9d95a.zip
gcc-cf5bea76f9d84f6218f0a5085db63a50aed9d95a.tar.gz
gcc-cf5bea76f9d84f6218f0a5085db63a50aed9d95a.tar.bz2
Convert range-op.* to vrange.
This patch provides the infrastructure to make range-ops type agnostic. First, the range_op_handler function has been replaced with an object of the same name. It's coded in such a way to minimize changes to the code base, and to encapsulate the dispatch code. Instead of: range_operator *op = range_op_handler (code, type); if (op) op->fold_range (...); We now do: range_op_handler op (code, type); if (op) op->fold_range (...); I've folded gimple_range_handler into the range_op_handler class, since it's also a query into the range operators. Instead of: range_operator *handler = gimple_range_handler (stmt); We now do: range_op_handler handler (stmt); This all has the added benefit of moving all the dispatch code into an independent class and avoid polluting range_operator (which we'll further split later when frange and prange come live). There's this annoying "using" keyword that's been added to each operator due to hiding rules in C++. The issue is that we will have different virtual versions of fold_range() for each combination of operands. For example: // Traditional binary op on irange's. fold_range (irange &lhs, const irange &op1, const irange &op2); // For POINTER_DIFF_EXPR: fold_range (irange &lhs, const prange &op1, const prange &op2); // Cast from irange to prange. fold_range (prange &lhs, const irange &op1, const irange &op2); Overloading virtuals when there are multiple same named methods causes hidden virtuals warnings from -Woverloaded-virtual, thus the using keyword. An alternative would be to have different names: fold_range_III, fold_range_IPP, fold_range_PII, but that's uglier still. Tested on x86-64 & ppc64le Linux. gcc/ChangeLog: * gimple-range-edge.cc (gimple_outgoing_range_stmt_p): Adjust for vrange and convert range_op_handler function calls to use the identically named object. * gimple-range-fold.cc (gimple_range_operand1): Same. (gimple_range_operand2): Same. (fold_using_range::fold_stmt): Same. (fold_using_range::range_of_range_op): Same. (fold_using_range::range_of_builtin_ubsan_call): Same. (fold_using_range::relation_fold_and_or): Same. (fur_source::register_outgoing_edges): Same. * gimple-range-fold.h (gimple_range_handler): Remove. * gimple-range-gori.cc (gimple_range_calc_op1): Adjust for vrange. (gimple_range_calc_op2): Same. (range_def_chain::get_def_chain): Same. (gori_compute::compute_operand_range): Same. (gori_compute::condexpr_adjust): Same. * gimple-range.cc (gimple_ranger::prefill_name): Same. (gimple_ranger::prefill_stmt_dependencies): Same. * range-op.cc (get_bool_state): Same. (class operator_equal): Add using clause. (class operator_not_equal): Same. (class operator_lt): Same. (class operator_le): Same. (class operator_gt): Same. (class operator_ge): Same. (class operator_plus): Same. (class operator_minus): Same. (class operator_mult): Same. (class operator_exact_divide): Same. (class operator_lshift): Same. (class operator_rshift): Same. (class operator_cast): Same. (class operator_logical_and): Same. (class operator_bitwise_and): Same. (class operator_logical_or): Same. (class operator_bitwise_or): Same. (class operator_bitwise_xor): Same. (class operator_trunc_mod): Same. (class operator_logical_not): Same. (class operator_bitwise_not): Same. (class operator_cst): Same. (class operator_identity): Same. (class operator_unknown): Same. (class operator_abs): Same. (class operator_negate): Same. (class operator_addr_expr): Same. (class pointer_or_operator): Same. (operator_plus::op1_range): Adjust for vrange. (operator_minus::op1_range): Same. (operator_mult::op1_range): Same. (operator_cast::op1_range): Same. (operator_bitwise_not::fold_range): Same. (operator_negate::fold_range): Same. (range_op_handler): Rename to... (get_handler): ...this. (range_op_handler::range_op_handler): New. (range_op_handler::fold_range): New. (range_op_handler::op1_range): New. (range_op_handler::op2_range): New. (range_op_handler::lhs_op1_relation): New. (range_op_handler::lhs_op2_relation): New. (range_op_handler::op1_op2_relation): New. (range_cast): Adjust for vrange. * range-op.h (range_op_handler): Remove function. (range_cast): Adjust for vrange. (class range_op_handler): New. (get_bool_state): Adjust for vrange. (empty_range_varying): Same. (relop_early_resolve): Same. * tree-data-ref.cc (compute_distributive_range): Same. * tree-vrp.cc (get_range_op_handler): Remove. (range_fold_binary_symbolics_p): Use range_op_handler class instead of get_range_op_handler. (range_fold_unary_symbolics_p): Same. (range_fold_binary_expr): Same. (range_fold_unary_expr): Same. * value-query.cc (range_query::get_tree_range): Adjust for vrange.
Diffstat (limited to 'gcc/gimple-range-gori.cc')
-rw-r--r--gcc/gimple-range-gori.cc41
1 files changed, 21 insertions, 20 deletions
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index 3e15eb5..7203213 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -44,9 +44,9 @@ gimple_range_calc_op1 (irange &r, const gimple *stmt, const irange &lhs_range)
// Unary operations require the type of the first operand in the
// second range position.
tree type = TREE_TYPE (gimple_range_operand1 (stmt));
- int_range<2> type_range (type);
- return gimple_range_handler (stmt)->op1_range (r, type, lhs_range,
- type_range);
+ Value_Range type_range (type);
+ type_range.set_varying (type);
+ return range_op_handler (stmt).op1_range (r, type, lhs_range, type_range);
}
// Calculate what we can determine of the range of this statement's
@@ -72,12 +72,12 @@ gimple_range_calc_op1 (irange &r, const gimple *stmt,
// This is sometimes invoked on single operand stmts.
if (gimple_num_ops (stmt) < 3)
return false;
- int_range<2> trange (TREE_TYPE (gimple_range_operand2 (stmt)));
- return gimple_range_handler (stmt)->op1_range (r, type, lhs_range,
- trange);
+ tree op2_type = TREE_TYPE (gimple_range_operand2 (stmt));
+ Value_Range trange (op2_type);
+ trange.set_varying (op2_type);
+ return range_op_handler (stmt).op1_range (r, type, lhs_range, trange);
}
- return gimple_range_handler (stmt)->op1_range (r, type, lhs_range,
- op2_range);
+ return range_op_handler (stmt).op1_range (r, type, lhs_range, op2_range);
}
// Calculate what we can determine of the range of this statement's
@@ -97,12 +97,13 @@ gimple_range_calc_op2 (irange &r, const gimple *stmt,
// If op1 is undefined, solve as if it is varying.
if (op1_range.undefined_p ())
{
- int_range<2> trange (TREE_TYPE (gimple_range_operand1 (stmt)));
- return gimple_range_handler (stmt)->op2_range (r, type, lhs_range,
- trange);
+ tree op1_type = TREE_TYPE (gimple_range_operand1 (stmt));
+ Value_Range trange (op1_type);
+ trange.set_varying (op1_type);
+ return range_op_handler (stmt).op2_range (r, type, lhs_range, trange);
}
- return gimple_range_handler (stmt)->op2_range (r, type, lhs_range,
- op1_range);
+ return range_op_handler (stmt).op2_range (r, type, lhs_range,
+ op1_range);
}
// Return TRUE if GS is a logical && or || expression.
@@ -346,7 +347,7 @@ range_def_chain::get_def_chain (tree name)
}
gimple *stmt = SSA_NAME_DEF_STMT (name);
- if (gimple_range_handler (stmt))
+ if (range_op_handler (stmt))
{
ssa1 = gimple_range_ssa_p (gimple_range_operand1 (stmt));
ssa2 = gimple_range_ssa_p (gimple_range_operand2 (stmt));
@@ -707,7 +708,7 @@ gori_compute::compute_operand_range (irange &r, gimple *stmt,
if (is_a<gswitch *> (stmt))
return compute_operand_range_switch (r, as_a<gswitch *> (stmt), lhs, name,
src);
- if (!gimple_range_handler (stmt))
+ if (!range_op_handler (stmt))
return false;
tree op1 = gimple_range_ssa_p (gimple_range_operand1 (stmt));
@@ -1328,7 +1329,7 @@ gori_compute::condexpr_adjust (irange &r1, irange &r2, gimple *, tree cond,
tree type = TREE_TYPE (gimple_assign_rhs1 (cond_def));
if (!range_compatible_p (type, TREE_TYPE (gimple_assign_rhs2 (cond_def))))
return false;
- range_operator *hand = range_op_handler (gimple_assign_rhs_code (cond_def), type);
+ range_op_handler hand (gimple_assign_rhs_code (cond_def), type);
if (!hand)
return false;
@@ -1351,18 +1352,18 @@ gori_compute::condexpr_adjust (irange &r1, irange &r2, gimple *, tree cond,
// the op1 or op2 routines based on its location.
if (c1)
{
- if (!hand->op1_range (cond_false, type, m_bool_zero, cr))
+ if (!hand.op1_range (cond_false, type, m_bool_zero, cr))
return false;
- if (!hand->op1_range (cond_true, type, m_bool_one, cr))
+ if (!hand.op1_range (cond_true, type, m_bool_one, cr))
return false;
cond_false.intersect (cl);
cond_true.intersect (cl);
}
else
{
- if (!hand->op2_range (cond_false, type, m_bool_zero, cl))
+ if (!hand.op2_range (cond_false, type, m_bool_zero, cl))
return false;
- if (!hand->op2_range (cond_true, type, m_bool_one, cl))
+ if (!hand.op2_range (cond_true, type, m_bool_one, cl))
return false;
cond_false.intersect (cr);
cond_true.intersect (cr);