Do not calculate new values when evaluating a debug statement.

Add a flag to enable/disable immediately improving poor values found during
cache propagation. Then disable it when processing debug statements.

	gcc/
	PR tree-optimization/100781
	* gimple-range-cache.cc (ranger_cache::ranger_cache): Enable new
	value calculation by default.
	(ranger_cache::enable_new_values): New.
	(ranger_cache::disable_new_values): New.
	(ranger_cache::push_poor_value): Check if new values are allowed.
	* gimple-range-cache.h (class ranger_cache): New member/methods.
	* gimple-range.cc (gimple_ranger::range_of_expr): Check for debug
	statement, and disable/renable new value calculation.

	gcc/testsuite/
	PR tree-optimization/100781
	* gcc.dg/pr100781.c: New.
This commit is contained in:
Andrew MacLeod 2021-05-31 12:13:50 -04:00
parent 2e0f3246e0
commit 715914d3f9
4 changed files with 57 additions and 0 deletions

View file

@ -586,6 +586,7 @@ ranger_cache::ranger_cache (gimple_ranger &q) : query (q)
if (bb)
m_gori.exports (bb);
}
enable_new_values ();
}
ranger_cache::~ranger_cache ()
@ -606,6 +607,23 @@ 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.
void
ranger_cache::enable_new_values ()
{
m_new_value_p = true;
}
// Disable new value querying.
void
ranger_cache::disable_new_values ()
{
m_new_value_p = false;
}
// Dump the caches for basic block BB to file F.
void
@ -689,6 +707,8 @@ ranger_cache::set_global_range (tree name, const irange &r)
bool
ranger_cache::push_poor_value (basic_block bb, tree name)
{
if (!m_new_value_p)
return false;
if (m_poor_value_list.length ())
{
// Don't push anything else to the same block. If there are multiple

View file

@ -100,6 +100,8 @@ 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 ();
non_null_ref m_non_null;
gori_compute m_gori;
@ -131,6 +133,7 @@ private:
bool push_poor_value (basic_block bb, tree name);
vec<update_record> m_poor_value_list;
class gimple_ranger &query;
bool m_new_value_p;
};
#endif // GCC_SSA_RANGE_CACHE_H

View file

@ -971,6 +971,15 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt)
return true;
}
// For a debug stmt, pick the best value currently available, do not
// trigger new value calculations. PR 100781.
if (is_gimple_debug (stmt))
{
m_cache.disable_new_values ();
m_cache.range_of_expr (r, expr, stmt);
m_cache.enable_new_values ();
return true;
}
basic_block bb = gimple_bb (stmt);
gimple *def_stmt = SSA_NAME_DEF_STMT (expr);

View file

@ -0,0 +1,25 @@
/* { dg-do compile } */
/* { dg-options "-O2 --param=evrp-mode=ranger -fcompare-debug " } */
struct a {
int b;
};
long c(short d, long e, struct a f) {
g:;
int h = f.b <= e, i = d, n = h >= d;
if (!n)
goto j;
goto k;
j:;
long l = 5;
if (l)
goto m;
d = 0;
m:
if (d)
return f.b;
k:
goto g;
}
int main() { }