aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-07-31 10:55:27 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-07-31 10:55:27 +0000
commitf86c2e7196bdf285c0245064be96a0b2816e013a (patch)
tree5204ab9fd288bbc885bb9cf97b5d19de5a1051ae /gcc
parentf39b06395e90d8c70548eedadc30e880f6426b26 (diff)
downloadgcc-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/ChangeLog17
-rw-r--r--gcc/gimple-ssa-evrp-analyze.c32
-rw-r--r--gcc/gimple-ssa-evrp-analyze.h4
-rw-r--r--gcc/vr-values.c12
-rw-r--r--gcc/vr-values.h5
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);