diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2022-05-22 20:17:40 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2022-06-01 11:11:15 +0200 |
commit | 45c8523dd3e50daa5f0bba040099fdfd2ad1aaaa (patch) | |
tree | 9e8f023eab39b290d2c5194cea3692525a4a3d8f /gcc/gimple-range-cache.cc | |
parent | d8474337a0b2bf1b3c84863957cef1da92811ffe (diff) | |
download | gcc-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.cc | 140 |
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 ¤t_p) +ranger_cache::get_global_range (vrange &r, tree name, bool ¤t_p) { bool had_global = get_global_range (r, name); @@ -847,7 +856,7 @@ ranger_cache::get_global_range (irange &r, tree name, bool ¤t_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)) |