aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2022-05-09 15:35:14 -0400
committerAndrew MacLeod <amacleod@redhat.com>2022-05-17 14:38:03 -0400
commitb7501739f3b14ac7749aace93f636d021fd607f7 (patch)
tree5c359661a70191c7ee4cc92b6d001a78ff26c099 /gcc/gimple-range.cc
parent451894cadcf1210883ceefb2d69a0ed2d6a8cd8b (diff)
downloadgcc-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.cc27
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;