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:
parent
2e0f3246e0
commit
715914d3f9
4 changed files with 57 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
25
gcc/testsuite/gcc.dg/pr100781.c
Normal file
25
gcc/testsuite/gcc.dg/pr100781.c
Normal 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() { }
|
||||
|
Loading…
Add table
Reference in a new issue