aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range-cache.cc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-05-22 20:17:40 +0200
committerAldy Hernandez <aldyh@redhat.com>2022-06-01 11:11:15 +0200
commit45c8523dd3e50daa5f0bba040099fdfd2ad1aaaa (patch)
tree9e8f023eab39b290d2c5194cea3692525a4a3d8f /gcc/gimple-range-cache.cc
parentd8474337a0b2bf1b3c84863957cef1da92811ffe (diff)
downloadgcc-45c8523dd3e50daa5f0bba040099fdfd2ad1aaaa.zip
gcc-45c8523dd3e50daa5f0bba040099fdfd2ad1aaaa.tar.gz
gcc-45c8523dd3e50daa5f0bba040099fdfd2ad1aaaa.tar.bz2
Convert ranger and clients to vrange.
Finally, the meat of the work. Convert ranger and associated clients to vrange. Everything's relatively mechanical given the previous patches. I did include a minor cleanup in the edge code. There's no need to check that the type of the switch is an integer as non-integer switches are invalid. I verified this with an appropriately coded assert. Tested on x86-64 & ppc64le Linux. gcc/ChangeLog: * gimple-range-cache.cc (ssa_block_ranges::dump): Convert to vrange. (sbr_vector::sbr_vector): Same. (sbr_vector::grow): Same. (sbr_vector::set_bb_range): Same. (sbr_vector::get_bb_range): Same. (sbr_sparse_bitmap::sbr_sparse_bitmap): Same. (sbr_sparse_bitmap::set_bb_range): Same. (sbr_sparse_bitmap::get_bb_range): Same. (block_range_cache::set_bb_range): Same. (block_range_cache::get_bb_range): Same. (block_range_cache::dump): Same. (ssa_global_cache::get_global_range): Same. (ssa_global_cache::set_global_range): Same. (ssa_global_cache::clear): Same. (ssa_global_cache::dump): Same. (ranger_cache::get_global_range): Same. (ranger_cache::set_global_range): Same. (ranger_cache::range_of_def): Same. (ranger_cache::entry_range): Same. (ranger_cache::exit_range): Same. (ranger_cache::edge_range): Same. (ranger_cache::range_of_expr): Same. (ranger_cache::range_on_edge): Same. (ranger_cache::block_range): Same. (ranger_cache::propagate_cache): Same. (ranger_cache::fill_block_cache): Same. (ranger_cache::range_from_dom): Same. * gimple-range-cache.h: Same. * gimple-range-edge.cc (gimple_outgoing_range::get_edge_range): Same. (gimple_outgoing_range::switch_edge_range): Same. (gimple_outgoing_range::edge_range_p): Same. * gimple-range-edge.h: Same. * gimple-range-fold.cc (fur_source::get_operand): Same. (fur_source::get_phi_operand): Same. (fur_edge::get_operand): Same. (fur_edge::get_phi_operand): Same. (fur_stmt::get_operand): Same. (fur_stmt::get_phi_operand): Same. (fur_list::fur_list): Same. (fur_list::get_operand): Same. (fur_list::get_phi_operand): Same. (fold_range): Same. (adjust_imagpart_expr): Same. (adjust_realpart_expr): Same. (gimple_range_adjustment): Same. (fold_using_range::fold_stmt): Same. (fold_using_range::range_of_range_op): Same. (fold_using_range::range_of_address): Same. (fold_using_range::range_of_phi): Same. (fold_using_range::range_of_call): Same. (fold_using_range::range_of_builtin_call): Same. (fold_using_range::range_of_builtin_int_call): Same. (fold_using_range::range_of_cond_expr): Same. (fur_source::register_outgoing_edges): Same. * gimple-range-fold.h (fold_range): Same. (gimple_range_type): Same. (gimple_range_ssa_p): Same. * gimple-range-gori.cc (gimple_range_calc_op1): Same. (gimple_range_calc_op2): Same. (gori_compute::compute_operand_range_switch): Same. (gori_compute::compute_operand_range): Same. (gori_compute::logical_combine): Same. (gori_compute::compute_logical_operands): Same. (gori_compute::compute_operand1_range): Same. (gori_compute::compute_operand2_range): Same. (gori_compute::compute_operand1_and_operand2_range): Same. (gori_compute::outgoing_edge_range_p): Same. (gori_compute::condexpr_adjust): Same. * gimple-range-gori.h (gimple_range_calc_op1): Same. (gimple_range_calc_op2): Same. * gimple-range-path.cc (path_range_query::get_cache): Same. (path_range_query::set_cache): Same. (path_range_query::range_on_path_entry): Same. (path_range_query::internal_range_of_expr): Same. (path_range_query::range_of_expr): Same. (path_range_query::ssa_range_in_phi): Same. (path_range_query::range_defined_in_block): Same. (path_range_query::compute_ranges_in_phis): Same. (path_range_query::compute_ranges_in_block): Same. (path_range_query::add_to_imports): Same. (path_range_query::range_of_stmt): Same. * gimple-range-path.h: Same. * gimple-range-infer.cc (gimple_infer_range::add_range): Same. (gimple_infer_range::~side_effect_manager): Same. (gimple_infer_range::get_nonzero): Same. (gimple_infer_range::maybe_adjust_range): Same. (gimple_infer_range::add_range): Same. * gimple-range-infer.h: Same. * gimple-range-tests.cc: Same. * gimple-range-trace.cc (range_tracer::trailer): Same. (debug_seed_ranger): Same. * gimple-range-trace.h: Same. * gimple-range.cc (gimple_ranger::range_of_expr): Same. (gimple_ranger::range_on_entry): Same. (gimple_ranger::range_on_exit): Same. (gimple_ranger::range_on_edge): Same. (gimple_ranger::fold_range_internal): Same. (gimple_ranger::range_of_stmt): Same. (gimple_ranger::prefill_name): Same. (gimple_ranger::prefill_stmt_dependencies): Same. (gimple_ranger::export_global_ranges): Same. (gimple_ranger::dump_bb): Same. * gimple-range.h: Same. * gimple-ssa-warn-access.cc (check_nul_terminated_array): Same. (memmodel_to_uhwi): Same. * tree-ssa-loop-niter.cc (refine_value_range_using_guard): Same. (determine_value_range): Same. (record_nonwrapping_iv): Same. (infer_loop_bounds_from_signedness): Same. (scev_var_range_cant_overflow): Same. * tree-ssa-threadedge.cc (hybrid_jt_simplifier::simplify): Same. * value-query.cc (range_query::range_on_edge): Same. (range_query::range_of_stmt): Same. (range_query::value_of_expr): Same. (range_query::value_on_edge): Same. (range_query::value_of_stmt): Same. (range_query::get_tree_range): Same. (update_global_range): Same. (get_range_global): Same. (gimple_range_global): Same. (global_range_query::range_of_expr): Same. (range_query::query_relation): Same. * value-query.h (gimple_range_global): Same. (update_global_range): Same. * vr-values.cc (vr_values::range_of_expr): Same. (bounds_of_var_in_loop): Same. (simplify_using_ranges::vrp_visit_cond_stmt): Same. * vr-values.h (class vr_values): Same. * tree-ssa-loop-unswitch.cc (unswitch_predicate): Same.
Diffstat (limited to 'gcc/gimple-range-cache.cc')
-rw-r--r--gcc/gimple-range-cache.cc140
1 files changed, 75 insertions, 65 deletions
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index 25ade13..85eed44 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -44,11 +44,14 @@ along with GCC; see the file COPYING3. If not see
class ssa_block_ranges
{
public:
- virtual bool set_bb_range (const_basic_block bb, const irange &r) = 0;
- virtual bool get_bb_range (irange &r, const_basic_block bb) = 0;
+ ssa_block_ranges (tree t) : m_type (t) { }
+ virtual bool set_bb_range (const_basic_block bb, const vrange &r) = 0;
+ virtual bool get_bb_range (vrange &r, const_basic_block bb) = 0;
virtual bool bb_range_p (const_basic_block bb) = 0;
void dump(FILE *f);
+private:
+ tree m_type;
};
// Print the list of known ranges for file F in a nice format.
@@ -57,7 +60,7 @@ void
ssa_block_ranges::dump (FILE *f)
{
basic_block bb;
- int_range_max r;
+ Value_Range r (m_type);
FOR_EACH_BB_FN (bb, cfun)
if (get_bb_range (r, bb))
@@ -77,14 +80,14 @@ class sbr_vector : public ssa_block_ranges
public:
sbr_vector (tree t, vrange_allocator *allocator);
- virtual bool set_bb_range (const_basic_block bb, const irange &r) override;
- virtual bool get_bb_range (irange &r, const_basic_block bb) override;
+ virtual bool set_bb_range (const_basic_block bb, const vrange &r) override;
+ virtual bool get_bb_range (vrange &r, const_basic_block bb) override;
virtual bool bb_range_p (const_basic_block bb) override;
protected:
- irange **m_tab; // Non growing vector.
+ vrange **m_tab; // Non growing vector.
int m_tab_size;
- int_range<2> m_varying;
- int_range<2> m_undefined;
+ vrange *m_varying;
+ vrange *m_undefined;
tree m_type;
vrange_allocator *m_range_allocator;
void grow ();
@@ -94,18 +97,21 @@ protected:
// Initialize a block cache for an ssa_name of type T.
sbr_vector::sbr_vector (tree t, vrange_allocator *allocator)
+ : ssa_block_ranges (t)
{
gcc_checking_assert (TYPE_P (t));
m_type = t;
m_range_allocator = allocator;
m_tab_size = last_basic_block_for_fn (cfun) + 1;
- m_tab = static_cast <irange **>
- (allocator->alloc (m_tab_size * sizeof (irange *)));
- memset (m_tab, 0, m_tab_size * sizeof (irange *));
+ m_tab = static_cast <vrange **>
+ (allocator->alloc (m_tab_size * sizeof (vrange *)));
+ memset (m_tab, 0, m_tab_size * sizeof (vrange *));
// Create the cached type range.
- m_varying.set_varying (t);
- m_undefined.set_undefined ();
+ m_varying = m_range_allocator->alloc_vrange (t);
+ m_undefined = m_range_allocator->alloc_vrange (t);
+ m_varying->set_varying (t);
+ m_undefined->set_undefined ();
}
// Grow the vector when the CFG has increased in size.
@@ -122,10 +128,10 @@ sbr_vector::grow ()
int new_size = inc + curr_bb_size;
// Allocate new memory, copy the old vector and clear the new space.
- irange **t = static_cast <irange **>
- (m_range_allocator->alloc (new_size * sizeof (irange *)));
- memcpy (t, m_tab, m_tab_size * sizeof (irange *));
- memset (t + m_tab_size, 0, (new_size - m_tab_size) * sizeof (irange *));
+ vrange **t = static_cast <vrange **>
+ (m_range_allocator->alloc (new_size * sizeof (vrange *)));
+ memcpy (t, m_tab, m_tab_size * sizeof (vrange *));
+ memset (t + m_tab_size, 0, (new_size - m_tab_size) * sizeof (vrange *));
m_tab = t;
m_tab_size = new_size;
@@ -134,15 +140,15 @@ sbr_vector::grow ()
// Set the range for block BB to be R.
bool
-sbr_vector::set_bb_range (const_basic_block bb, const irange &r)
+sbr_vector::set_bb_range (const_basic_block bb, const vrange &r)
{
- irange *m;
+ vrange *m;
if (bb->index >= m_tab_size)
grow ();
if (r.varying_p ())
- m = &m_varying;
+ m = m_varying;
else if (r.undefined_p ())
- m = &m_undefined;
+ m = m_undefined;
else
m = m_range_allocator->clone (r);
m_tab[bb->index] = m;
@@ -153,11 +159,11 @@ sbr_vector::set_bb_range (const_basic_block bb, const irange &r)
// there is no range.
bool
-sbr_vector::get_bb_range (irange &r, const_basic_block bb)
+sbr_vector::get_bb_range (vrange &r, const_basic_block bb)
{
if (bb->index >= m_tab_size)
return false;
- irange *m = m_tab[bb->index];
+ vrange *m = m_tab[bb->index];
if (m)
{
r = *m;
@@ -193,14 +199,14 @@ class sbr_sparse_bitmap : public ssa_block_ranges
{
public:
sbr_sparse_bitmap (tree t, vrange_allocator *allocator, bitmap_obstack *bm);
- virtual bool set_bb_range (const_basic_block bb, const irange &r) override;
- virtual bool get_bb_range (irange &r, const_basic_block bb) override;
+ virtual bool set_bb_range (const_basic_block bb, const vrange &r) override;
+ virtual bool get_bb_range (vrange &r, const_basic_block bb) override;
virtual bool bb_range_p (const_basic_block bb) override;
private:
void bitmap_set_quad (bitmap head, int quad, int quad_value);
int bitmap_get_quad (const_bitmap head, int quad);
vrange_allocator *m_range_allocator;
- irange *m_range[SBR_NUM];
+ vrange *m_range[SBR_NUM];
bitmap_head bitvec;
tree m_type;
};
@@ -209,6 +215,7 @@ private:
sbr_sparse_bitmap::sbr_sparse_bitmap (tree t, vrange_allocator *allocator,
bitmap_obstack *bm)
+ : ssa_block_ranges (t)
{
gcc_checking_assert (TYPE_P (t));
m_type = t;
@@ -216,16 +223,14 @@ sbr_sparse_bitmap::sbr_sparse_bitmap (tree t, vrange_allocator *allocator,
bitmap_tree_view (&bitvec);
m_range_allocator = allocator;
// Pre-cache varying.
- m_range[0] = static_cast <irange *> (m_range_allocator->alloc_vrange (t));
+ m_range[0] = m_range_allocator->alloc_vrange (t);
m_range[0]->set_varying (t);
// Pre-cache zero and non-zero values for pointers.
if (POINTER_TYPE_P (t))
{
- m_range[1]
- = static_cast <irange *> (m_range_allocator->alloc_vrange (t));
+ m_range[1] = m_range_allocator->alloc_vrange (t);
m_range[1]->set_nonzero (t);
- m_range[2]
- = static_cast <irange *> (m_range_allocator->alloc_vrange (t));
+ m_range[2] = m_range_allocator->alloc_vrange (t);
m_range[2]->set_zero (t);
}
else
@@ -257,7 +262,7 @@ sbr_sparse_bitmap::bitmap_get_quad (const_bitmap head, int quad)
// Set the range on entry to basic block BB to R.
bool
-sbr_sparse_bitmap::set_bb_range (const_basic_block bb, const irange &r)
+sbr_sparse_bitmap::set_bb_range (const_basic_block bb, const vrange &r)
{
if (r.undefined_p ())
{
@@ -283,7 +288,7 @@ sbr_sparse_bitmap::set_bb_range (const_basic_block bb, const irange &r)
// there is no range.
bool
-sbr_sparse_bitmap::get_bb_range (irange &r, const_basic_block bb)
+sbr_sparse_bitmap::get_bb_range (vrange &r, const_basic_block bb)
{
int value = bitmap_get_quad (&bitvec, bb->index);
@@ -333,7 +338,7 @@ block_range_cache::~block_range_cache ()
bool
block_range_cache::set_bb_range (tree name, const_basic_block bb,
- const irange &r)
+ const vrange &r)
{
unsigned v = SSA_NAME_VERSION (name);
if (v >= m_ssa_ranges.length ())
@@ -379,7 +384,7 @@ block_range_cache::query_block_ranges (tree name)
// is one.
bool
-block_range_cache::get_bb_range (irange &r, tree name, const_basic_block bb)
+block_range_cache::get_bb_range (vrange &r, tree name, const_basic_block bb)
{
ssa_block_ranges *ptr = query_block_ranges (name);
if (ptr)
@@ -423,12 +428,13 @@ void
block_range_cache::dump (FILE *f, basic_block bb, bool print_varying)
{
unsigned x;
- int_range_max r;
bool summarize_varying = false;
for (x = 1; x < m_ssa_ranges.length (); ++x)
{
if (!gimple_range_ssa_p (ssa_name (x)))
continue;
+
+ Value_Range r (TREE_TYPE (ssa_name (x)));
if (m_ssa_ranges[x] && m_ssa_ranges[x]->get_bb_range (r, bb))
{
if (!print_varying && r.varying_p ())
@@ -450,6 +456,8 @@ block_range_cache::dump (FILE *f, basic_block bb, bool print_varying)
{
if (!gimple_range_ssa_p (ssa_name (x)))
continue;
+
+ Value_Range r (TREE_TYPE (ssa_name (x)));
if (m_ssa_ranges[x] && m_ssa_ranges[x]->get_bb_range (r, bb))
{
if (r.varying_p ())
@@ -485,13 +493,13 @@ ssa_global_cache::~ssa_global_cache ()
// Return the value in R.
bool
-ssa_global_cache::get_global_range (irange &r, tree name) const
+ssa_global_cache::get_global_range (vrange &r, tree name) const
{
unsigned v = SSA_NAME_VERSION (name);
if (v >= m_tab.length ())
return false;
- irange *stow = m_tab[v];
+ vrange *stow = m_tab[v];
if (!stow)
return false;
r = *stow;
@@ -502,13 +510,13 @@ ssa_global_cache::get_global_range (irange &r, tree name) const
// Return TRUE if there was already a range set, otherwise false.
bool
-ssa_global_cache::set_global_range (tree name, const irange &r)
+ssa_global_cache::set_global_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);
- irange *m = m_tab[v];
+ vrange *m = m_tab[v];
if (m && m->fits_p (r))
*m = r;
else
@@ -533,7 +541,7 @@ void
ssa_global_cache::clear ()
{
if (m_tab.address ())
- memset (m_tab.address(), 0, m_tab.length () * sizeof (irange *));
+ memset (m_tab.address(), 0, m_tab.length () * sizeof (vrange *));
}
// Dump the contents of the global cache to F.
@@ -545,9 +553,10 @@ ssa_global_cache::dump (FILE *f)
bool print_header = true;
for (unsigned x = 1; x < num_ssa_names; x++)
{
- int_range_max r;
- if (gimple_range_ssa_p (ssa_name (x)) &&
- get_global_range (r, ssa_name (x)) && !r.varying_p ())
+ if (!gimple_range_ssa_p (ssa_name (x)))
+ continue;
+ Value_Range r (TREE_TYPE (ssa_name (x)));
+ if (get_global_range (r, ssa_name (x)) && !r.varying_p ())
{
if (print_header)
{
@@ -809,11 +818,11 @@ ranger_cache::dump_bb (FILE *f, basic_block bb)
// global range is not set, and return the legacy global value in R.
bool
-ranger_cache::get_global_range (irange &r, tree name) const
+ranger_cache::get_global_range (vrange &r, tree name) const
{
if (m_globals.get_global_range (r, name))
return true;
- r = gimple_range_global (name);
+ gimple_range_global (r, name);
return false;
}
@@ -825,7 +834,7 @@ ranger_cache::get_global_range (irange &r, tree name) const
// After this call, the global cache will have a value.
bool
-ranger_cache::get_global_range (irange &r, tree name, bool &current_p)
+ranger_cache::get_global_range (vrange &r, tree name, bool &current_p)
{
bool had_global = get_global_range (r, name);
@@ -847,7 +856,7 @@ ranger_cache::get_global_range (irange &r, tree name, bool &current_p)
// Set the global range of NAME to R and give it a timestamp.
void
-ranger_cache::set_global_range (tree name, const irange &r)
+ranger_cache::set_global_range (tree name, const vrange &r)
{
if (m_globals.set_global_range (name, r))
{
@@ -882,7 +891,7 @@ ranger_cache::set_global_range (tree name, const irange &r)
// get the best global value available.
void
-ranger_cache::range_of_def (irange &r, tree name, basic_block bb)
+ranger_cache::range_of_def (vrange &r, tree name, basic_block bb)
{
gcc_checking_assert (gimple_range_ssa_p (name));
gcc_checking_assert (!bb || bb == gimple_bb (SSA_NAME_DEF_STMT (name)));
@@ -895,7 +904,7 @@ ranger_cache::range_of_def (irange &r, tree name, basic_block bb)
if (gimple_get_lhs (s) == name)
fold_range (r, s, get_global_range_query ());
else
- r = gimple_range_global (name);
+ gimple_range_global (r, name);
}
}
@@ -903,12 +912,12 @@ ranger_cache::range_of_def (irange &r, tree name, basic_block bb)
// lookups.
void
-ranger_cache::entry_range (irange &r, tree name, basic_block bb,
+ranger_cache::entry_range (vrange &r, tree name, basic_block bb,
enum rfd_mode mode)
{
if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
{
- r = gimple_range_global (name);
+ gimple_range_global (r, name);
return;
}
@@ -923,12 +932,12 @@ ranger_cache::entry_range (irange &r, tree name, basic_block bb,
// lookups.
void
-ranger_cache::exit_range (irange &r, tree name, basic_block bb,
+ranger_cache::exit_range (vrange &r, tree name, basic_block bb,
enum rfd_mode mode)
{
if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
{
- r = gimple_range_global (name);
+ gimple_range_global (r, name);
return;
}
@@ -944,7 +953,7 @@ ranger_cache::exit_range (irange &r, tree name, basic_block bb,
// Always returns a range and true.
bool
-ranger_cache::edge_range (irange &r, edge e, tree name, enum rfd_mode mode)
+ranger_cache::edge_range (vrange &r, edge e, tree name, enum rfd_mode mode)
{
exit_range (r, name, e->src, mode);
// If this is not an abnormal edge, check for inferred ranges on exit.
@@ -961,7 +970,7 @@ ranger_cache::edge_range (irange &r, edge e, tree name, enum rfd_mode mode)
// Implement range_of_expr.
bool
-ranger_cache::range_of_expr (irange &r, tree name, gimple *stmt)
+ranger_cache::range_of_expr (vrange &r, tree name, gimple *stmt)
{
if (!gimple_range_ssa_p (name))
{
@@ -985,7 +994,7 @@ ranger_cache::range_of_expr (irange &r, tree name, gimple *stmt)
// the current cache values.
bool
-ranger_cache::range_on_edge (irange &r, edge e, tree expr)
+ranger_cache::range_on_edge (vrange &r, edge e, tree expr)
{
if (gimple_range_ssa_p (expr))
return edge_range (r, e, expr, RFD_NONE);
@@ -997,7 +1006,7 @@ ranger_cache::range_on_edge (irange &r, edge e, tree expr)
// def block for NAME. Otherwise, return false if the cache is empty.
bool
-ranger_cache::block_range (irange &r, basic_block bb, tree name, bool calc)
+ranger_cache::block_range (vrange &r, basic_block bb, tree name, bool calc)
{
gcc_checking_assert (gimple_range_ssa_p (name));
@@ -1041,9 +1050,10 @@ ranger_cache::propagate_cache (tree name)
basic_block bb;
edge_iterator ei;
edge e;
- int_range_max new_range;
- int_range_max current_range;
- int_range_max e_range;
+ tree type = TREE_TYPE (name);
+ Value_Range new_range (type);
+ Value_Range current_range (type);
+ Value_Range e_range (type);
// Process each block by seeing if its calculated range on entry is
// the same as its cached value. If there is a difference, update
@@ -1178,8 +1188,8 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
{
edge_iterator ei;
edge e;
- int_range_max block_result;
- int_range_max undefined;
+ Value_Range block_result (TREE_TYPE (name));
+ Value_Range undefined (TREE_TYPE (name));
// At this point we shouldn't be looking at the def, entry or exit block.
gcc_checking_assert (bb != def_bb && bb != ENTRY_BLOCK_PTR_FOR_FN (cfun) &&
@@ -1232,7 +1242,7 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
FOR_EACH_EDGE (e, ei, node->preds)
{
basic_block pred = e->src;
- int_range_max r;
+ Value_Range r (TREE_TYPE (name));
if (DEBUG_RANGE_CACHE)
fprintf (dump_file, " %d->%d ",e->src->index, e->dest->index);
@@ -1306,7 +1316,7 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
// dominator tree based on MODE.
bool
-ranger_cache::range_from_dom (irange &r, tree name, basic_block start_bb,
+ranger_cache::range_from_dom (vrange &r, tree name, basic_block start_bb,
enum rfd_mode mode)
{
if (mode == RFD_NONE || !dom_info_available_p (CDI_DOMINATORS))