diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2024-05-22 19:27:01 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2024-05-28 17:43:54 -0400 |
commit | 6f36cc2535c11b9406715836daeb87169fa79473 (patch) | |
tree | b1d0e44eadc539951c6b24d785e22fe5cc4d1c88 | |
parent | 802a98d128f9b0eea2432f6511328d14e0bd721b (diff) | |
download | gcc-6f36cc2535c11b9406715836daeb87169fa79473.zip gcc-6f36cc2535c11b9406715836daeb87169fa79473.tar.gz gcc-6f36cc2535c11b9406715836daeb87169fa79473.tar.bz2 |
More tweaks from gimple_outgoing_range changes.
the dom_ranger used for fast vrp no longer needs a local
gimple_outgoing_range object as it is now always available from the
range_query parent class.
The builtin_unreachable code for adjusting globals and removing the
builtin calls during the final VRP pass can now function with just
a range_query object rather than a specific ranger. This adjusts it to
use the extra methods in the range_query API.
This will now allow removal of builtin_unreachable calls even if there is no
active ranger with dependency info available.
* gimple-range.cc (dom_ranger::dom_ranger): Do not initialize m_out.
(dom_ranger::maybe_push_edge): Use gori () rather than m_out.
* gimple-range.h (dom_ranger::m_out): Remove.
* tree-vrp.cc (remove_unreachable::remove_unreachable): Use a
range-query ranther than a gimple_ranger.
(remove_unreachable::remove): New.
(remove_unreachable::m_ranger): Change to a range_query.
(remove_unreachable::handle_early): If there is no dependency
information, do nothing.
(remove_unreachable::remove_and_update_globals): Do not update
globals if there is no dependecy info to use.
-rw-r--r-- | gcc/gimple-range.cc | 4 | ||||
-rw-r--r-- | gcc/gimple-range.h | 1 | ||||
-rw-r--r-- | gcc/tree-vrp.cc | 47 |
3 files changed, 47 insertions, 5 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 0749c9fa..711646a 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -922,7 +922,7 @@ assume_query::dump (FILE *f) // Create a DOM based ranger for use by a DOM walk pass. -dom_ranger::dom_ranger () : m_global (), m_out () +dom_ranger::dom_ranger () : m_global () { m_freelist.create (0); m_freelist.truncate (0); @@ -1156,7 +1156,7 @@ dom_ranger::maybe_push_edge (edge e, bool edge_0) e_cache = m_freelist.pop (); else e_cache = new ssa_lazy_cache; - gori_on_edge (*e_cache, e, this, &m_out); + gori_on_edge (*e_cache, e, this, &gori ()); if (e_cache->empty_p ()) m_freelist.safe_push (e_cache); else diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h index 1532951..180090b 100644 --- a/gcc/gimple-range.h +++ b/gcc/gimple-range.h @@ -121,7 +121,6 @@ protected: DISABLE_COPY_AND_ASSIGN (dom_ranger); void maybe_push_edge (edge e, bool edge_0); ssa_cache m_global; - gimple_outgoing_range m_out; vec<ssa_lazy_cache *> m_freelist; vec<ssa_lazy_cache *> m_e0; vec<ssa_lazy_cache *> m_e1; diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index 7d7f9fe..1c7b451 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -85,14 +85,15 @@ along with GCC; see the file COPYING3. If not see class remove_unreachable { public: - remove_unreachable (gimple_ranger &r, bool all) : m_ranger (r), final_p (all) + remove_unreachable (range_query &r, bool all) : m_ranger (r), final_p (all) { m_list.create (30); } ~remove_unreachable () { m_list.release (); } void handle_early (gimple *s, edge e); void maybe_register (gimple *s); + bool remove (); bool remove_and_update_globals (); vec<std::pair<int, int> > m_list; - gimple_ranger &m_ranger; + range_query &m_ranger; bool final_p; }; @@ -195,6 +196,9 @@ fully_replaceable (tree name, basic_block bb) void remove_unreachable::handle_early (gimple *s, edge e) { + // If there is no gori_ssa, there is no early processsing. + if (!m_ranger.gori_ssa ()) + return ; bool lhs_p = TREE_CODE (gimple_cond_lhs (s)) == SSA_NAME; bool rhs_p = TREE_CODE (gimple_cond_rhs (s)) == SSA_NAME; // Do not remove __builtin_unreachable if it confers a relation, or @@ -253,6 +257,41 @@ remove_unreachable::handle_early (gimple *s, edge e) } } +// Process the edges in the list, change the conditions and removing any +// dead code feeding those conditions. This removes the unreachables, but +// makes no attempt to set globals values. + +bool +remove_unreachable::remove () +{ + if (!final_p || m_list.length () == 0) + return false; + + bool change = false; + unsigned i; + for (i = 0; i < m_list.length (); i++) + { + auto eb = m_list[i]; + basic_block src = BASIC_BLOCK_FOR_FN (cfun, eb.first); + basic_block dest = BASIC_BLOCK_FOR_FN (cfun, eb.second); + if (!src || !dest) + continue; + edge e = find_edge (src, dest); + gimple *s = gimple_outgoing_range_stmt_p (e->src); + gcc_checking_assert (gimple_code (s) == GIMPLE_COND); + + change = true; + // Rewrite the condition. + if (e->flags & EDGE_TRUE_VALUE) + gimple_cond_make_true (as_a<gcond *> (s)); + else + gimple_cond_make_false (as_a<gcond *> (s)); + update_stmt (s); + } + + return change; +} + // Process the edges in the list, change the conditions and removing any // dead code feeding those conditions. Calculate the range of any @@ -266,6 +305,10 @@ remove_unreachable::remove_and_update_globals () if (m_list.length () == 0) return false; + // If there is no import/export info, just remove unreachables if necessary. + if (!m_ranger.gori_ssa ()) + return remove (); + // Ensure the cache in SCEV has been cleared before processing // globals to be removed. scev_reset (); |