diff options
author | Richard Biener <rguenther@suse.de> | 2019-07-31 10:55:27 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-07-31 10:55:27 +0000 |
commit | f86c2e7196bdf285c0245064be96a0b2816e013a (patch) | |
tree | 5204ab9fd288bbc885bb9cf97b5d19de5a1051ae /gcc | |
parent | f39b06395e90d8c70548eedadc30e880f6426b26 (diff) | |
download | gcc-f86c2e7196bdf285c0245064be96a0b2816e013a.zip gcc-f86c2e7196bdf285c0245064be96a0b2816e013a.tar.gz gcc-f86c2e7196bdf285c0245064be96a0b2816e013a.tar.bz2 |
vr-values.h (vr_values::swap_vr_value): New.
2019-07-31 Richard Biener <rguenther@suse.de>
* vr-values.h (vr_values::swap_vr_value): New.
(vr_values::free_value_range): likewise.
* vr-values.c (vr_values::swap_vr_value): Implement.
* gimple-ssa-evrp-analyze.h (evrp_range_analyzer::pop_value_range):
Do not return a range or take a var.
(evrp_range_analyzer::stack): Change back to recording a non-const
value_range *.
* gimple-ssa-evrp-analyze.c
(evrp_range_analyzer::record_ranges_from_stmt): Free unused
value-range.
(evrp_range_analyzer::pop_to_marker): Adjust.
(evrp_range_analyzer::push_value_range): Use new swap_vr_value.
(evrp_range_analyzer::pop_value_range): Likewise. Free the
no longer needed value-range.
From-SVN: r273930
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/gimple-ssa-evrp-analyze.c | 32 | ||||
-rw-r--r-- | gcc/gimple-ssa-evrp-analyze.h | 4 | ||||
-rw-r--r-- | gcc/vr-values.c | 12 | ||||
-rw-r--r-- | gcc/vr-values.h | 5 |
5 files changed, 53 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 564bd70..f5b0ab6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2019-07-31 Richard Biener <rguenther@suse.de> + + * vr-values.h (vr_values::swap_vr_value): New. + (vr_values::free_value_range): likewise. + * vr-values.c (vr_values::swap_vr_value): Implement. + * gimple-ssa-evrp-analyze.h (evrp_range_analyzer::pop_value_range): + Do not return a range or take a var. + (evrp_range_analyzer::stack): Change back to recording a non-const + value_range *. + * gimple-ssa-evrp-analyze.c + (evrp_range_analyzer::record_ranges_from_stmt): Free unused + value-range. + (evrp_range_analyzer::pop_to_marker): Adjust. + (evrp_range_analyzer::push_value_range): Use new swap_vr_value. + (evrp_range_analyzer::pop_value_range): Likewise. Free the + no longer needed value-range. + 2019-07-31 Martin Liska <mliska@suse.cz> * tree-ssa-dce.c (propagate_necessity): Delete operator can diff --git a/gcc/gimple-ssa-evrp-analyze.c b/gcc/gimple-ssa-evrp-analyze.c index 3f813ba..1c4fc8d 100644 --- a/gcc/gimple-ssa-evrp-analyze.c +++ b/gcc/gimple-ssa-evrp-analyze.c @@ -214,7 +214,10 @@ evrp_range_analyzer::record_ranges_from_incoming_edge (basic_block bb) old_vr->max ()); tem.intersect (vrs[i].second); if (tem.equal_p (*old_vr)) - continue; + { + vr_values->free_value_range (vrs[i].second); + continue; + } push_value_range (vrs[i].first, vrs[i].second); if (is_fallthru && m_update_global_ranges @@ -393,7 +396,7 @@ evrp_range_analyzer::pop_to_marker (void) { gcc_checking_assert (!stack.is_empty ()); while (stack.last ().first != NULL_TREE) - pop_value_range (stack.last ().first); + pop_value_range (); stack.pop (); } @@ -421,17 +424,18 @@ evrp_range_analyzer::push_value_range (tree var, value_range *vr) dump_value_range (dump_file, vr); fprintf (dump_file, "\n"); } - stack.safe_push (std::make_pair (var, get_value_range (var))); - vr_values->set_vr_value (var, vr); + value_range *old_vr = vr_values->swap_vr_value (var, vr); + stack.safe_push (std::make_pair (var, old_vr)); } -/* Pop the Value Range from the vrp_stack and update VAR with it. */ +/* Pop a Value Range from the vrp_stack. */ -const value_range * -evrp_range_analyzer::pop_value_range (tree var) +void +evrp_range_analyzer::pop_value_range () { - const value_range *vr = stack.last ().second; - gcc_checking_assert (var == stack.last ().first); + std::pair<tree, value_range *> e = stack.pop (); + tree var = e.first; + value_range *vr = e.second; if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "popping range for "); @@ -440,9 +444,9 @@ evrp_range_analyzer::pop_value_range (tree var) dump_value_range (dump_file, vr); fprintf (dump_file, "\n"); } - /* We saved off a lattice entry, now give it back - it can now - be modified again, thus the const casting. */ - vr_values->set_vr_value (var, const_cast <value_range *> (vr)); - stack.pop (); - return vr; + /* We saved off a lattice entry, now give it back and release + the one we popped. */ + value_range *popped_vr = vr_values->swap_vr_value (var, vr); + if (popped_vr) + vr_values->free_value_range (popped_vr); } diff --git a/gcc/gimple-ssa-evrp-analyze.h b/gcc/gimple-ssa-evrp-analyze.h index d252a28..a136cea 100644 --- a/gcc/gimple-ssa-evrp-analyze.h +++ b/gcc/gimple-ssa-evrp-analyze.h @@ -62,14 +62,14 @@ class evrp_range_analyzer DISABLE_COPY_AND_ASSIGN (evrp_range_analyzer); class vr_values *vr_values; - const value_range *pop_value_range (tree var); + void pop_value_range (); value_range *try_find_new_range (tree, tree op, tree_code code, tree limit); void record_ranges_from_incoming_edge (basic_block); void record_ranges_from_phis (basic_block); void set_ssa_range_info (tree, value_range *); /* STACK holds the old VR. */ - auto_vec<std::pair <tree, const value_range*> > stack; + auto_vec<std::pair <tree, value_range *> > stack; /* True if we are updating global ranges, false otherwise. */ bool m_update_global_ranges; diff --git a/gcc/vr-values.c b/gcc/vr-values.c index d033099..3acbdf6 100644 --- a/gcc/vr-values.c +++ b/gcc/vr-values.c @@ -4315,6 +4315,8 @@ vr_values::simplify_stmt_using_ranges (gimple_stmt_iterator *gsi) return false; } +/* Set the lattice entry for VAR to VR. */ + void vr_values::set_vr_value (tree var, value_range *vr) { @@ -4323,3 +4325,13 @@ vr_values::set_vr_value (tree var, value_range *vr) vr_value[SSA_NAME_VERSION (var)] = vr; } +/* Swap the lattice entry for VAR with VR and return the old entry. */ + +value_range * +vr_values::swap_vr_value (tree var, value_range *vr) +{ + if (SSA_NAME_VERSION (var) >= num_vr_values) + return NULL; + std::swap (vr_value[SSA_NAME_VERSION (var)], vr); + return vr; +} diff --git a/gcc/vr-values.h b/gcc/vr-values.h index c26de2c..ec65de3 100644 --- a/gcc/vr-values.h +++ b/gcc/vr-values.h @@ -41,8 +41,9 @@ class vr_values ~vr_values (void); const value_range *get_value_range (const_tree); - void set_vr_value (tree, value_range *); + value_range *swap_vr_value (tree, value_range *); + void set_def_to_varying (const_tree); void set_defs_to_varying (gimple *); bool update_value_range (const_tree, value_range *); @@ -68,6 +69,8 @@ class vr_values /* Allocate a new value_range object. */ value_range *allocate_value_range (void) { return vrp_value_range_pool.allocate (); } + void free_value_range (value_range *vr) + { vrp_value_range_pool.remove (vr); } /* */ void cleanup_edges_and_switches (void); |