mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
Return TRUE only when a global value is updated.
set_range_info should return TRUE only when it sets a new value. VRP no longer overwrites global ranges DOM has set. Check for ranges in the final listing. gcc/ * tree-ssanames.cc (set_range_info): Return true only if the current value changes. gcc/testsuite/ * gcc.dg/pr93917.c: Check for ranges in final optimized listing. * gcc.dg/tree-ssa/vrp-unreachable.c: Ditto.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-vrp2" } */
|
||||
/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-vrp2 -fdump-tree-optimized-alias" } */
|
||||
|
||||
void f3(int n);
|
||||
|
||||
@@ -19,5 +19,5 @@ void f2(int*n)
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "Global Export.*0, \\+INF" 1 "vrp1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "__builtin_unreachable" 1 "vrp1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "Global Export.*0, \\+INF" 1 "vrp2" } } */
|
||||
/* { dg-final { scan-tree-dump-times "__builtin_unreachable" 0 "vrp2" } } */
|
||||
/* { dg-final { scan-tree-dump-times "0, \\+INF" 2 "optimized" } } */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-vrp1-alias -fdump-tree-vrp2-alias" } */
|
||||
/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-vrp2 -fdump-tree-optimized-alias" } */
|
||||
|
||||
void dead (unsigned n);
|
||||
void alive (unsigned n);
|
||||
@@ -39,4 +39,4 @@ void func (unsigned n, unsigned m)
|
||||
/* { dg-final { scan-tree-dump-not "dead" "vrp1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "builtin_unreachable" 1 "vrp1" } } */
|
||||
/* { dg-final { scan-tree-dump-not "builtin_unreachable" "vrp2" } } */
|
||||
/* { dg-final { scan-tree-dump-times "fff8 VALUE 0x0" 4 "vrp2" } } */
|
||||
/* { dg-final { scan-tree-dump-times "fff8 VALUE 0x0" 2 "optimized" } } */
|
||||
|
||||
@@ -418,10 +418,17 @@ set_range_info (tree name, const vrange &r)
|
||||
if (r.undefined_p () || r.varying_p ())
|
||||
return false;
|
||||
|
||||
// Pick up the current range, or VARYING if none.
|
||||
tree type = TREE_TYPE (name);
|
||||
Value_Range tmp (type);
|
||||
if (range_info_p (name))
|
||||
range_info_get_range (name, tmp);
|
||||
else
|
||||
tmp.set_varying (type);
|
||||
|
||||
if (POINTER_TYPE_P (type))
|
||||
{
|
||||
if (r.nonzero_p ())
|
||||
if (r.nonzero_p () && !tmp.nonzero_p ())
|
||||
{
|
||||
set_ptr_nonnull (name);
|
||||
return true;
|
||||
@@ -429,18 +436,11 @@ set_range_info (tree name, const vrange &r)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If a global range already exists, incorporate it. */
|
||||
if (range_info_p (name))
|
||||
{
|
||||
Value_Range tmp (type);
|
||||
range_info_get_range (name, tmp);
|
||||
tmp.intersect (r);
|
||||
if (tmp.undefined_p ())
|
||||
return false;
|
||||
// If the result doesn't change, or is undefined, return false.
|
||||
if (!tmp.intersect (r) || tmp.undefined_p ())
|
||||
return false;
|
||||
|
||||
return range_info_set_range (name, tmp);
|
||||
}
|
||||
return range_info_set_range (name, r);
|
||||
return range_info_set_range (name, tmp);
|
||||
}
|
||||
|
||||
/* Set nonnull attribute to pointer NAME. */
|
||||
|
||||
Reference in New Issue
Block a user