From: Andrew MacLeod Date: Mon, 1 Nov 2021 17:32:11 +0000 (-0400) Subject: Provide some context to folding via ranger. X-Git-Tag: upstream/12.2.0~3831 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fc4076752067fb400b43adbd629081df658da246;p=platform%2Fupstream%2Fgcc.git 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. --- 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: