Limit new value calculations to first order effects.

When utilzing poor values during propagation, we mostly care about values that
were undefined/processed directly used in calcualting the SSA_NAME being
processed.  2nd level derivations of such poor values rarely affect the
inital calculation.  Leave them to when they are directly encountered.

	* gimple-range-cache.cc (ranger_cache::ranger_cache): Adjust.
	(ranger_cache::enable_new_values): Set to specified value and
	return the old value.
	(ranger_cache::disable_new_values): Delete.
	(ranger_cache::fill_block_cache): Disable non 1st order derived
	poor values.
	* gimple-range-cache.h (ranger_cache): Adjust prototypes.
	* gimple-range.cc (gimple_ranger::range_of_expr): Adjust.
This commit is contained in:
Andrew MacLeod 2021-06-14 15:33:59 -04:00
parent c37b5ddcc8
commit ecc5644fa3
3 changed files with 16 additions and 18 deletions

View File

@ -727,7 +727,7 @@ ranger_cache::ranger_cache (gimple_ranger &q) : query (q)
if (bb)
m_gori.exports (bb);
}
enable_new_values ();
enable_new_values (true);
}
ranger_cache::~ranger_cache ()
@ -748,21 +748,15 @@ ranger_cache::dump (FILE *f)
fprintf (f, "\n");
}
// Allow the cache to flag and query new values when propagation is forced
// to use an unknown value.
// Allow or disallow the cache to flag and query new values when propagation
// is forced to use an unknown value. The previous state is returned.
void
ranger_cache::enable_new_values ()
bool
ranger_cache::enable_new_values (bool state)
{
m_new_value_p = true;
}
// Disable new value querying.
void
ranger_cache::disable_new_values ()
{
m_new_value_p = false;
bool ret = m_new_value_p;
m_new_value_p = state;
return ret;
}
// Dump the caches for basic block BB to file F.
@ -1343,7 +1337,12 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
// Calculate a range at the exit from the block so the caches feeding
// this block will be filled, and we'll get a "better" value.
// Disallow additonal "poor values" during this phase to avoid
// iterations that are unlikely to be profitable for this name.
// See PR 101014.
bool state = enable_new_values (false);
query.range_on_exit (tmp, calc_bb, rec.calc);
enable_new_values (state);
// Then ask for NAME to be re-evaluated on outgoing edges and
// use any new values.

View File

@ -101,8 +101,7 @@ public:
bool get_non_stale_global_range (irange &r, tree name);
void set_global_range (tree name, const irange &r);
void enable_new_values ();
void disable_new_values ();
bool enable_new_values (bool state);
non_null_ref m_non_null;
gori_compute m_gori;

View File

@ -1173,9 +1173,9 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt)
// trigger new value calculations. PR 100781.
if (is_gimple_debug (stmt))
{
m_cache.disable_new_values ();
bool state = m_cache.enable_new_values (false);
m_cache.range_of_expr (r, expr, stmt);
m_cache.enable_new_values ();
m_cache.enable_new_values (state);
return true;
}
basic_block bb = gimple_bb (stmt);