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:
parent
c37b5ddcc8
commit
ecc5644fa3
@ -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.
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user