diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2022-05-09 15:35:14 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2022-05-17 14:38:03 -0400 |
commit | b7501739f3b14ac7749aace93f636d021fd607f7 (patch) | |
tree | 5c359661a70191c7ee4cc92b6d001a78ff26c099 /gcc/gimple-range.cc | |
parent | 451894cadcf1210883ceefb2d69a0ed2d6a8cd8b (diff) | |
download | gcc-b7501739f3b14ac7749aace93f636d021fd607f7.zip gcc-b7501739f3b14ac7749aace93f636d021fd607f7.tar.gz gcc-b7501739f3b14ac7749aace93f636d021fd607f7.tar.bz2 |
Add side effect infrastructure.
Replace the non-null procesing with a generic side effect implementation that
can handle arbitrary side effects.
* Makefile.in (OBJS): Add gimple-range-side-effect.o.
* gimple-range-cache.cc (non_null_ref::non_null_ref): Delete.
(non_null_ref::~non_null_ref): Delete.
(non_null_ref::set_nonnull): Delete.
(non_null_ref::non_null_deref_p): Delete.
(non_null_ref::process_name): Delete.
(ranger_cache::ranger_cache): Initialize m_exit object.
(ranger_cache::fill_block_cache): Use m_exit object intead of nonnull.
(ranger_cache::range_from_dom): Use side_effect class and m_exit object.
(ranger_cache::update_to_nonnull): Delete.
(non_null_loadstore): Delete.
(ranger_cache::block_apply_nonnull): Delete.
(ranger_cache::apply_side_effects): New.
* gimple-range-cache.h (class non_null_ref): Delete.
(non_null_ref::adjust_range): Delete.
(class ranger_cache): Adjust prototypes, add side effect manager.
* gimple-range-path.cc (path_range_query::range_defined_in_block): Use
side effect manager for queries.
(path_range_query::adjust_for_non_null_uses): Ditto.
* gimple-range-path.h (class path_range_query): Delete non_null_ref.
* gimple-range-side-effect.cc: New.
* gimple-range-side-effect.h: New.
* gimple-range.cc (gimple_ranger::gimple_ranger): Update contructor.
(gimple_ranger::range_of_expr): Check def block for override value.
(gimple_ranger::range_on_entry): Don't scan dominators for non-null.
(gimple_ranger::range_on_edge): Check for outgoing side-effects.
(gimple_ranger::register_side_effects): Call apply_side_effects.
(enable_ranger): Update contructor.
* gimple-range.h (class gimple_ranger): Update prototype.
(enable_ranger): Update prototype.
* tree-vrp.cc (execute_ranger_vrp): Invoke without immediate-use flag.
Diffstat (limited to 'gcc/gimple-range.cc')
-rw-r--r-- | gcc/gimple-range.cc | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 1fdee02..f5e9e77 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -37,9 +37,9 @@ along with GCC; see the file COPYING3. If not see #include "gimple-fold.h" #include "gimple-walk.h" -gimple_ranger::gimple_ranger () : +gimple_ranger::gimple_ranger (bool use_imm_uses) : non_executable_edge_flag (cfun), - m_cache (non_executable_edge_flag), + m_cache (non_executable_edge_flag, use_imm_uses), tracer (""), current_bb (NULL) { @@ -118,9 +118,11 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt) // If name is defined in this block, try to get an range from S. if (def_stmt && gimple_bb (def_stmt) == bb) { - // Check for a definition override from a block walk. - if (!POINTER_TYPE_P (TREE_TYPE (expr)) - || !m_cache.block_range (r, bb, expr, false)) + // Declared in ths block, if it has a global set, check for an + // override from a block walk, otherwise calculate it. + if (m_cache.get_global_range (r, expr)) + m_cache.block_range (r, bb, expr, false); + else range_of_stmt (r, def_stmt, expr); } // Otherwise OP comes from outside this block, use range on entry. @@ -154,13 +156,6 @@ gimple_ranger::range_on_entry (irange &r, basic_block bb, tree name) if (m_cache.block_range (entry_range, bb, name)) r.intersect (entry_range); - if (dom_info_available_p (CDI_DOMINATORS)) - { - basic_block dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb); - if (dom_bb) - m_cache.m_non_null.adjust_range (r, name, dom_bb, true); - } - if (idx) tracer.trailer (idx, "range_on_entry", true, name, r); } @@ -237,7 +232,7 @@ gimple_ranger::range_on_edge (irange &r, edge e, tree name) range_on_exit (r, e->src, name); // If this is not an abnormal edge, check for a non-null exit . if ((e->flags & (EDGE_EH | EDGE_ABNORMAL)) == 0) - m_cache.m_non_null.adjust_range (r, name, e->src, false); + m_cache.m_exit.maybe_adjust_range (r, name, e->src); gcc_checking_assert (r.undefined_p () || range_compatible_p (r.type(), TREE_TYPE (name))); @@ -480,7 +475,7 @@ gimple_ranger::register_side_effects (gimple *s) fputc ('\n', dump_file); } } - m_cache.block_apply_nonnull (s); + m_cache.apply_side_effects (s); } // This routine will export whatever global ranges are known to GCC @@ -625,12 +620,12 @@ gimple_ranger::debug () resources. */ gimple_ranger * -enable_ranger (struct function *fun) +enable_ranger (struct function *fun, bool use_imm_uses) { gimple_ranger *r; gcc_checking_assert (!fun->x_range_query); - r = new gimple_ranger; + r = new gimple_ranger (use_imm_uses); fun->x_range_query = r; return r; |