aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssanames.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2023-09-27 12:34:16 -0400
committerAndrew MacLeod <amacleod@redhat.com>2023-10-03 10:25:51 -0400
commitec8e86690ee572f03e6ffda288f2d28fd86f9d65 (patch)
treecae7099b27e724aead3b6847e140939fd367a7d8 /gcc/tree-ssanames.cc
parentc44ca7c01226e0768e58c5b274ddd5e161378010 (diff)
downloadgcc-ec8e86690ee572f03e6ffda288f2d28fd86f9d65.zip
gcc-ec8e86690ee572f03e6ffda288f2d28fd86f9d65.tar.gz
gcc-ec8e86690ee572f03e6ffda288f2d28fd86f9d65.tar.bz2
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.
Diffstat (limited to 'gcc/tree-ssanames.cc')
-rw-r--r--gcc/tree-ssanames.cc24
1 files changed, 12 insertions, 12 deletions
diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc
index 23387b9..1eae411 100644
--- a/gcc/tree-ssanames.cc
+++ b/gcc/tree-ssanames.cc
@@ -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. */