Ranger : Do not process abnormal ssa-names.
* gimple-range-fold.h (gimple_range_ssa_p): Don't process names that occur in abnormal phis. * gimple-range.cc (gimple_ranger::range_on_edge): Return false for abnormal and EH edges. * gimple-ssa-evrp.c (rvrp_folder::value_of_expr): Ditto. (rvrp_folder::value_on_edge): Ditto. (rvrp_folder::value_of_stmt): Ditto. (hybrid_folder::value_of_expr): Ditto for ranger queries. (hybrid_folder::value_on_edge): Ditto. (hybrid_folder::value_of_stmt): Ditto. * value-query.cc (gimple_range_global): Always return a range if the type is supported.
This commit is contained in:
parent
a10794eafb
commit
93ac832f18
|
@ -93,6 +93,7 @@ gimple_range_ssa_p (tree exp)
|
|||
{
|
||||
if (exp && TREE_CODE (exp) == SSA_NAME &&
|
||||
!SSA_NAME_IS_VIRTUAL_OPERAND (exp) &&
|
||||
!SSA_NAME_OCCURS_IN_ABNORMAL_PHI (exp) &&
|
||||
irange::supports_type_p (TREE_TYPE (exp)))
|
||||
return exp;
|
||||
return NULL_TREE;
|
||||
|
|
|
@ -180,6 +180,10 @@ gimple_ranger::range_on_edge (irange &r, edge e, tree name)
|
|||
int_range_max edge_range;
|
||||
gcc_checking_assert (irange::supports_type_p (TREE_TYPE (name)));
|
||||
|
||||
// Do not process values along abnormal or EH edges.
|
||||
if (e->flags & (EDGE_ABNORMAL|EDGE_EH))
|
||||
return false;
|
||||
|
||||
unsigned idx;
|
||||
if ((idx = tracer.header ("range_on_edge (")))
|
||||
{
|
||||
|
|
|
@ -137,6 +137,9 @@ public:
|
|||
|
||||
tree value_of_expr (tree name, gimple *s = NULL) OVERRIDE
|
||||
{
|
||||
// Shortcircuit subst_and_fold callbacks for abnormal ssa_names.
|
||||
if (TREE_CODE (name) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
|
||||
return NULL;
|
||||
tree ret = m_ranger->value_of_expr (name, s);
|
||||
if (!ret && supported_pointer_equiv_p (name))
|
||||
ret = m_pta->get_equiv (name);
|
||||
|
@ -145,6 +148,9 @@ public:
|
|||
|
||||
tree value_on_edge (edge e, tree name) OVERRIDE
|
||||
{
|
||||
// Shortcircuit subst_and_fold callbacks for abnormal ssa_names.
|
||||
if (TREE_CODE (name) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
|
||||
return NULL;
|
||||
tree ret = m_ranger->value_on_edge (e, name);
|
||||
if (!ret && supported_pointer_equiv_p (name))
|
||||
ret = m_pta->get_equiv (name);
|
||||
|
@ -153,6 +159,9 @@ public:
|
|||
|
||||
tree value_of_stmt (gimple *s, tree name = NULL) OVERRIDE
|
||||
{
|
||||
// Shortcircuit subst_and_fold callbacks for abnormal ssa_names.
|
||||
if (TREE_CODE (name) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
|
||||
return NULL;
|
||||
return m_ranger->value_of_stmt (s, name);
|
||||
}
|
||||
|
||||
|
@ -283,9 +292,15 @@ tree
|
|||
hybrid_folder::value_of_expr (tree op, gimple *stmt)
|
||||
{
|
||||
tree evrp_ret = evrp_folder::value_of_expr (op, stmt);
|
||||
tree ranger_ret = m_ranger->value_of_expr (op, stmt);
|
||||
if (!ranger_ret && supported_pointer_equiv_p (op))
|
||||
ranger_ret = m_pta->get_equiv (op);
|
||||
tree ranger_ret;
|
||||
if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
|
||||
ranger_ret = NULL;
|
||||
else
|
||||
{
|
||||
ranger_ret = m_ranger->value_of_expr (op, stmt);
|
||||
if (!ranger_ret && supported_pointer_equiv_p (op))
|
||||
ranger_ret = m_pta->get_equiv (op);
|
||||
}
|
||||
return choose_value (evrp_ret, ranger_ret);
|
||||
}
|
||||
|
||||
|
@ -295,9 +310,15 @@ hybrid_folder::value_on_edge (edge e, tree op)
|
|||
// Call evrp::value_of_expr directly. Otherwise another dual call is made
|
||||
// via hybrid_folder::value_of_expr, but without an edge.
|
||||
tree evrp_ret = evrp_folder::value_of_expr (op, NULL);
|
||||
tree ranger_ret = m_ranger->value_on_edge (e, op);
|
||||
if (!ranger_ret && supported_pointer_equiv_p (op))
|
||||
ranger_ret = m_pta->get_equiv (op);
|
||||
tree ranger_ret;
|
||||
if (TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
|
||||
ranger_ret = NULL;
|
||||
else
|
||||
{
|
||||
ranger_ret = m_ranger->value_on_edge (e, op);
|
||||
if (!ranger_ret && supported_pointer_equiv_p (op))
|
||||
ranger_ret = m_pta->get_equiv (op);
|
||||
}
|
||||
return choose_value (evrp_ret, ranger_ret);
|
||||
}
|
||||
|
||||
|
@ -312,7 +333,11 @@ hybrid_folder::value_of_stmt (gimple *stmt, tree op)
|
|||
else
|
||||
evrp_ret = NULL_TREE;
|
||||
|
||||
tree ranger_ret = m_ranger->value_of_stmt (stmt, op);
|
||||
tree ranger_ret;
|
||||
if (op && TREE_CODE (op) == SSA_NAME && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
|
||||
ranger_ret = NULL;
|
||||
else
|
||||
ranger_ret = m_ranger->value_of_stmt (stmt, op);
|
||||
return choose_value (evrp_ret, ranger_ret);
|
||||
}
|
||||
|
||||
|
|
|
@ -416,8 +416,9 @@ get_range_global (irange &r, tree name)
|
|||
value_range
|
||||
gimple_range_global (tree name)
|
||||
{
|
||||
gcc_checking_assert (gimple_range_ssa_p (name));
|
||||
tree type = TREE_TYPE (name);
|
||||
gcc_checking_assert (TREE_CODE (name) == SSA_NAME
|
||||
&& irange::supports_type_p (type));
|
||||
|
||||
if (SSA_NAME_IS_DEFAULT_DEF (name) || (cfun && cfun->after_inlining)
|
||||
|| is_a<gphi *> (SSA_NAME_DEF_STMT (name)))
|
||||
|
|
Loading…
Reference in New Issue