aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range-infer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/gimple-range-infer.cc')
-rw-r--r--gcc/gimple-range-infer.cc25
1 files changed, 14 insertions, 11 deletions
diff --git a/gcc/gimple-range-infer.cc b/gcc/gimple-range-infer.cc
index 14ccd73..a6f7d4e 100644
--- a/gcc/gimple-range-infer.cc
+++ b/gcc/gimple-range-infer.cc
@@ -181,7 +181,7 @@ class exit_range
{
public:
tree name;
- vrange *range;
+ vrange_storage *range;
exit_range *next;
};
@@ -221,7 +221,7 @@ infer_range_manager::infer_range_manager (bool do_search)
// Non-zero elements are very common, so cache them for each ssa-name.
m_nonzero.create (0);
m_nonzero.safe_grow_cleared (num_ssa_names + 1);
- m_range_allocator = new obstack_vrange_allocator;
+ m_range_allocator = new vrange_allocator;
}
// Destruct a range infer manager.
@@ -246,7 +246,8 @@ infer_range_manager::get_nonzero (tree name)
m_nonzero.safe_grow_cleared (num_ssa_names + 20);
if (!m_nonzero[v])
{
- m_nonzero[v] = m_range_allocator->alloc_vrange (TREE_TYPE (name));
+ m_nonzero[v]
+ = (irange *) m_range_allocator->alloc (sizeof (int_range <2>));
m_nonzero[v]->set_nonzero (TREE_TYPE (name));
}
return *(m_nonzero[v]);
@@ -292,7 +293,10 @@ infer_range_manager::maybe_adjust_range (vrange &r, tree name, basic_block bb)
exit_range *ptr = m_on_exit[bb->index].find_ptr (name);
gcc_checking_assert (ptr);
// Return true if this exit range changes R, otherwise false.
- return r.intersect (*(ptr->range));
+ tree type = TREE_TYPE (name);
+ Value_Range tmp (type);
+ ptr->range->get_vrange (tmp, type);
+ return r.intersect (tmp);
}
// Add range R as an inferred range for NAME in block BB.
@@ -320,17 +324,16 @@ infer_range_manager::add_range (tree name, basic_block bb, const vrange &r)
exit_range *ptr = m_on_exit[bb->index].find_ptr (name);
if (ptr)
{
- Value_Range cur (r);
+ tree type = TREE_TYPE (name);
+ Value_Range cur (r), name_range (type);
+ ptr->range->get_vrange (name_range, type);
// If no new info is added, just return.
- if (!cur.intersect (*(ptr->range)))
+ if (!cur.intersect (name_range))
return;
if (ptr->range->fits_p (cur))
- *(ptr->range) = cur;
+ ptr->range->set_vrange (cur);
else
- {
- vrange &v = cur;
- ptr->range = m_range_allocator->clone (v);
- }
+ ptr->range = m_range_allocator->clone (cur);
return;
}