diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2021-10-07 10:12:29 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2021-10-15 12:00:41 -0400 |
commit | 93ac832f1846e4867aa6537f76f510fab8e3e87d (patch) | |
tree | 886ff8d895cff2de9887de2a77ad4e48d5d6f324 | |
parent | a10794eafb151b9274d673dfae93459d437cbe4a (diff) | |
download | gcc-93ac832f1846e4867aa6537f76f510fab8e3e87d.zip gcc-93ac832f1846e4867aa6537f76f510fab8e3e87d.tar.gz gcc-93ac832f1846e4867aa6537f76f510fab8e3e87d.tar.bz2 |
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.
-rw-r--r-- | gcc/gimple-range-fold.h | 1 | ||||
-rw-r--r-- | gcc/gimple-range.cc | 4 | ||||
-rw-r--r-- | gcc/gimple-ssa-evrp.c | 39 | ||||
-rw-r--r-- | gcc/value-query.cc | 3 |
4 files changed, 39 insertions, 8 deletions
diff --git a/gcc/gimple-range-fold.h b/gcc/gimple-range-fold.h index bc0874b..350e2c4 100644 --- a/gcc/gimple-range-fold.h +++ b/gcc/gimple-range-fold.h @@ -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; diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 6eb3f71..85ef974 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -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 ("))) { diff --git a/gcc/gimple-ssa-evrp.c b/gcc/gimple-ssa-evrp.c index 437f194..7f20555 100644 --- a/gcc/gimple-ssa-evrp.c +++ b/gcc/gimple-ssa-evrp.c @@ -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); } diff --git a/gcc/value-query.cc b/gcc/value-query.cc index 730a214..ab133aa 100644 --- a/gcc/value-query.cc +++ b/gcc/value-query.cc @@ -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))) |