From fc4076752067fb400b43adbd629081df658da246 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Mon, 1 Nov 2021 13:32:11 -0400 Subject: 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. --- gcc/gimple-range.cc | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'gcc/gimple-range.cc') 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. -- cgit v1.1