aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2021-11-01 13:32:11 -0400
committerAndrew MacLeod <amacleod@redhat.com>2021-11-03 10:01:21 -0400
commitfc4076752067fb400b43adbd629081df658da246 (patch)
tree4df0890738e8abd42d6e29e743b072c880135572
parent1967fd8f2197f2b0334ab0fbc26abc3d9efe56c9 (diff)
downloadgcc-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.
-rw-r--r--gcc/gimple-range.cc28
-rw-r--r--gcc/gimple-range.h2
-rw-r--r--gcc/tree-vrp.c2
3 files changed, 30 insertions, 2 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.
diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h
index 0713af4..615496e 100644
--- a/gcc/gimple-range.h
+++ b/gcc/gimple-range.h
@@ -58,10 +58,12 @@ public:
void debug ();
void dump_bb (FILE *f, basic_block bb);
auto_edge_flag non_executable_edge_flag;
+ bool fold_stmt (gimple_stmt_iterator *gsi, tree (*) (tree));
protected:
bool fold_range_internal (irange &r, gimple *s, tree name);
ranger_cache m_cache;
range_tracer tracer;
+ basic_block current_bb;
};
/* Create a new ranger instance and associate it with a function.
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index dc3e250..5380508 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -4323,7 +4323,7 @@ public:
{
if (m_simplifier.simplify (gsi))
return true;
- return ::fold_stmt (gsi, follow_single_use_edges);
+ return m_ranger->fold_stmt (gsi, follow_single_use_edges);
}
private: