diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2023-09-27 12:34:16 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2023-10-03 10:25:51 -0400 |
commit | ec8e86690ee572f03e6ffda288f2d28fd86f9d65 (patch) | |
tree | cae7099b27e724aead3b6847e140939fd367a7d8 /gcc/tree-ssanames.cc | |
parent | c44ca7c01226e0768e58c5b274ddd5e161378010 (diff) | |
download | gcc-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.cc | 24 |
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. */ |