aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range-cache.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2023-07-28 11:00:57 -0400
committerAndrew MacLeod <amacleod@redhat.com>2023-07-28 16:32:12 -0400
commit72fb44ca53fda15024e0c272052b74b1f32735b1 (patch)
tree75a13d05d7bb52bf773ec88574f33897f56eff28 /gcc/gimple-range-cache.cc
parent619641397a558bf65c24b99a4c52878bd940fcbe (diff)
downloadgcc-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.cc45
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