diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2021-11-01 13:32:11 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2021-11-03 10:01:21 -0400 |
commit | fc4076752067fb400b43adbd629081df658da246 (patch) | |
tree | 4df0890738e8abd42d6e29e743b072c880135572 /gcc/gimple-range.cc | |
parent | 1967fd8f2197f2b0334ab0fbc26abc3d9efe56c9 (diff) | |
download | gcc-fc4076752067fb400b43adbd629081df658da246.zip gcc-fc4076752067fb400b43adbd629081df658da246.tar.gz gcc-fc4076752067fb400b43adbd629081df658da246.tar.bz2 |
Provide some context to folding via ranger.
Provide an internal mechanism to supply context to range_of_expr for calls
to ::fold_stmt.
* gimple-range.cc (gimple_ranger::gimple_ranger): Initialize current_bb.
(gimple_ranger::range_of_expr): Pick up range_on_entry when there is
no explcit context and current_bb is set.
(gimple_ranger::fold_stmt): New.
* gimple-range.h (current_bb, fold_stmt): New.
* tree-vrp.c (rvrp_folder::fold_stmt): Call ranger's fold_stmt.
Diffstat (limited to 'gcc/gimple-range.cc')
-rw-r--r-- | gcc/gimple-range.cc | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 2c9715a..e1177b1 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -34,11 +34,13 @@ along with GCC; see the file COPYING3. If not see #include "cfgloop.h" #include "tree-scalar-evolution.h" #include "gimple-range.h" +#include "gimple-fold.h" gimple_ranger::gimple_ranger () : non_executable_edge_flag (cfun), m_cache (non_executable_edge_flag), - tracer ("") + tracer (""), + current_bb (NULL) { // If the cache has a relation oracle, use it. m_oracle = m_cache.oracle (); @@ -82,8 +84,19 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt) // If there is no statement, just get the global value. if (!stmt) { + int_range_max tmp; if (!m_cache.get_global_range (r, expr)) r = gimple_range_global (expr); + // Pick up implied context information from the on-entry cache + // if current_bb is set. + if (current_bb && m_cache.block_range (tmp, current_bb, expr)) + { + r.intersect (tmp); + char str[80]; + sprintf (str, "picked up range from bb %d\n",current_bb->index); + if (idx) + tracer.print (idx, str); + } } // For a debug stmt, pick the best value currently available, do not // trigger new value calculations. PR 100781. @@ -295,6 +308,19 @@ gimple_ranger::range_of_stmt (irange &r, gimple *s, tree name) return res; } +// This routine will invoke the gimple fold_stmt routine, providing context to +// range_of_expr calls via an private interal API. + +bool +gimple_ranger::fold_stmt (gimple_stmt_iterator *gsi, tree (*valueize) (tree)) +{ + gimple *stmt = gsi_stmt (*gsi); + current_bb = gimple_bb (stmt); + bool ret = ::fold_stmt (gsi, valueize); + current_bb = NULL; + return ret; +} + // This routine will export whatever global ranges are known to GCC // SSA_RANGE_NAME_INFO and SSA_NAME_PTR_INFO fields. |