bool
range_query::invoke_range_of_expr (vrange &r, tree expr, gimple *stmt,
- basic_block bbentry, basic_block bbexit)
+ basic_block bbentry, basic_block bbexit,
+ edge e)
{
if (bbentry)
{
- gcc_checking_assert (!stmt && !bbexit);
+ gcc_checking_assert (!stmt && !bbexit && !e);
return range_on_entry (r, bbentry, expr);
}
if (bbexit)
{
- gcc_checking_assert (!stmt);
+ gcc_checking_assert (!stmt && !e);
return range_on_exit (r, bbexit, expr);
}
+ if (e)
+ {
+ gcc_checking_assert (!stmt);
+ return range_on_edge (r, e, expr);
+ }
return range_of_expr (r, expr, stmt);
}
bool
range_query::get_tree_range (vrange &r, tree expr, gimple *stmt,
- basic_block bbentry, basic_block bbexit)
+ basic_block bbentry, basic_block bbexit, edge e)
{
tree type;
if (TYPE_P (expr))
case SSA_NAME:
// If this is not an abnormal or virtual ssa, invoke range_of_expr.
if (gimple_range_ssa_p (expr))
- return invoke_range_of_expr (r, expr, stmt, bbentry, bbexit);
+ return invoke_range_of_expr (r, expr, stmt, bbentry, bbexit, e);
gimple_range_global (r, expr);
return true;
{
value_range r0 (TREE_TYPE (op0));
value_range r1 (TREE_TYPE (op1));
- invoke_range_of_expr (r0, op0, stmt, bbentry, bbexit);
- invoke_range_of_expr (r1, op1, stmt, bbentry, bbexit);
+ invoke_range_of_expr (r0, op0, stmt, bbentry, bbexit, e);
+ invoke_range_of_expr (r1, op1, stmt, bbentry, bbexit, e);
if (!op.fold_range (r, type, r0, r1))
r.set_varying (type);
}
value_range r1 (type);
r1.set_varying (type);
invoke_range_of_expr (r0, TREE_OPERAND (expr, 0), stmt, bbentry,
- bbexit);
+ bbexit, e);
if (!op.fold_range (r, type, r0, r1))
r.set_varying (type);
}
protected:
bool get_tree_range (vrange &v, tree expr, gimple *stmt,
- basic_block bbentry = NULL, basic_block bbexit = NULL);
+ basic_block bbentry = NULL, basic_block bbexit = NULL,
+ edge e = NULL);
bool invoke_range_of_expr (vrange &v, tree expr, gimple *stmt,
- basic_block bbentry, basic_block bbexit);
+ basic_block bbentry, basic_block bbexit, edge e);
bool get_arith_expr_range (vrange &r, tree expr, gimple *stmt);
relation_oracle *m_relation;
infer_range_oracle *m_infer;