diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2023-07-28 11:00:57 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2023-07-28 16:32:12 -0400 |
commit | 72fb44ca53fda15024e0c272052b74b1f32735b1 (patch) | |
tree | 75a13d05d7bb52bf773ec88574f33897f56eff28 /gcc/gimple-range-cache.cc | |
parent | 619641397a558bf65c24b99a4c52878bd940fcbe (diff) | |
download | gcc-72fb44ca53fda15024e0c272052b74b1f32735b1.zip gcc-72fb44ca53fda15024e0c272052b74b1f32735b1.tar.gz gcc-72fb44ca53fda15024e0c272052b74b1f32735b1.tar.bz2 |
Add a merge_range to ssa_cache and use it. add empty_p and param tweaks.
* gimple-range-cache.cc (ssa_cache::merge_range): New.
(ssa_lazy_cache::merge_range): New.
* gimple-range-cache.h (class ssa_cache): Adjust protoypes.
(class ssa_lazy_cache): Ditto.
* gimple-range.cc (assume_query::calculate_op): Use merge_range.
Diffstat (limited to 'gcc/gimple-range-cache.cc')
-rw-r--r-- | gcc/gimple-range-cache.cc | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index 52165d2..5b74681 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -605,6 +605,32 @@ ssa_cache::set_range (tree name, const vrange &r) return m != NULL; } +// If NAME has a range, intersect it with R, otherwise set it to R. +// Return TRUE if there was already a range set, otherwise false. + +bool +ssa_cache::merge_range (tree name, const vrange &r) +{ + unsigned v = SSA_NAME_VERSION (name); + if (v >= m_tab.length ()) + m_tab.safe_grow_cleared (num_ssa_names + 1); + + vrange_storage *m = m_tab[v]; + if (m) + { + Value_Range curr (TREE_TYPE (name)); + m->get_vrange (curr, TREE_TYPE (name)); + curr.intersect (r); + if (m->fits_p (curr)) + m->set_vrange (curr); + else + m_tab[v] = m_range_allocator->clone (curr); + } + else + m_tab[v] = m_range_allocator->clone (r); + return m != NULL; +} + // Set the range for NAME to R in the ssa cache. void @@ -689,6 +715,25 @@ ssa_lazy_cache::set_range (tree name, const vrange &r) return false; } +// If NAME has a range, intersect it with R, otherwise set it to R. +// Return TRUE if there was already a range set, otherwise false. + +bool +ssa_lazy_cache::merge_range (tree name, const vrange &r) +{ + unsigned v = SSA_NAME_VERSION (name); + if (!bitmap_set_bit (active_p, v)) + { + // There is already an entry, simply merge it. + gcc_checking_assert (v < m_tab.length ()); + return ssa_cache::merge_range (name, r); + } + if (v >= m_tab.length ()) + m_tab.safe_grow (num_ssa_names + 1); + m_tab[v] = m_range_allocator->clone (r); + return false; +} + // Return TRUE if NAME has a range, and return it in R. bool |