Some ssa-names get incorrectly marked as always_current.

When range_of_stmt invokes prefill_name to evaluate unvisited dependencies
it should not mark already visited names as always_current.

	PR tree-optimization/110875
	gcc/
	* gimple-range.cc (gimple_ranger::prefill_name): Only invoke
	cache-prefilling routine when the ssa-name has no global value.

	gcc/testsuite/
	* gcc.dg/pr110875.c: New.
This commit is contained in:
Andrew MacLeod
2023-09-07 11:15:50 -04:00
parent ab4bdad497
commit cf2ae3fff4
2 changed files with 41 additions and 3 deletions

View File

@@ -351,10 +351,14 @@ gimple_ranger::prefill_name (vrange &r, tree name)
if (!gimple_range_op_handler::supported_p (stmt) && !is_a<gphi *> (stmt))
return;
bool current;
// If this op has not been processed yet, then push it on the stack
if (!m_cache.get_global_range (r, name, current))
m_stmt_list.safe_push (name);
if (!m_cache.get_global_range (r, name))
{
bool current;
// Set the global cache value and mark as alway_current.
m_cache.get_global_range (r, name, current);
m_stmt_list.safe_push (name);
}
}
// This routine will seed the global cache with most of the dependencies of

View File

@@ -0,0 +1,34 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp2" } */
void foo(void);
static int a, b;
static int *c = &a, *d;
static unsigned e;
static short f;
static unsigned g(unsigned char h, char i) { return h + i; }
int main() {
d = &a;
int *j = d;
e = -27;
for (; e > 18; e = g(e, 6)) {
a = 0;
for (; a != -3; a--) {
if (0 != a ^ *j)
for (; b; b++) f = -f;
else if (*c) {
foo();
break;
}
if (!(((e) >= 235) && ((e) <= 4294967269))) {
__builtin_unreachable();
}
b = 0;
}
}
}
/* { dg-final { scan-tree-dump-not "foo" "vrp2" } } */