Commit f86c2e71 by Richard Biener Committed by Richard Biener

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
parent f39b0639
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> 2019-07-31 Martin Liska <mliska@suse.cz>
* tree-ssa-dce.c (propagate_necessity): Delete operator can * tree-ssa-dce.c (propagate_necessity): Delete operator can
......
...@@ -214,7 +214,10 @@ evrp_range_analyzer::record_ranges_from_incoming_edge (basic_block bb) ...@@ -214,7 +214,10 @@ evrp_range_analyzer::record_ranges_from_incoming_edge (basic_block bb)
old_vr->max ()); old_vr->max ());
tem.intersect (vrs[i].second); tem.intersect (vrs[i].second);
if (tem.equal_p (*old_vr)) 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); push_value_range (vrs[i].first, vrs[i].second);
if (is_fallthru if (is_fallthru
&& m_update_global_ranges && m_update_global_ranges
...@@ -393,7 +396,7 @@ evrp_range_analyzer::pop_to_marker (void) ...@@ -393,7 +396,7 @@ evrp_range_analyzer::pop_to_marker (void)
{ {
gcc_checking_assert (!stack.is_empty ()); gcc_checking_assert (!stack.is_empty ());
while (stack.last ().first != NULL_TREE) while (stack.last ().first != NULL_TREE)
pop_value_range (stack.last ().first); pop_value_range ();
stack.pop (); stack.pop ();
} }
...@@ -421,17 +424,18 @@ evrp_range_analyzer::push_value_range (tree var, value_range *vr) ...@@ -421,17 +424,18 @@ evrp_range_analyzer::push_value_range (tree var, value_range *vr)
dump_value_range (dump_file, vr); dump_value_range (dump_file, vr);
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
stack.safe_push (std::make_pair (var, get_value_range (var))); value_range *old_vr = vr_values->swap_vr_value (var, vr);
vr_values->set_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 * void
evrp_range_analyzer::pop_value_range (tree var) evrp_range_analyzer::pop_value_range ()
{ {
const value_range *vr = stack.last ().second; std::pair<tree, value_range *> e = stack.pop ();
gcc_checking_assert (var == stack.last ().first); tree var = e.first;
value_range *vr = e.second;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
fprintf (dump_file, "popping range for "); fprintf (dump_file, "popping range for ");
...@@ -440,9 +444,9 @@ evrp_range_analyzer::pop_value_range (tree var) ...@@ -440,9 +444,9 @@ evrp_range_analyzer::pop_value_range (tree var)
dump_value_range (dump_file, vr); dump_value_range (dump_file, vr);
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
/* We saved off a lattice entry, now give it back - it can now /* We saved off a lattice entry, now give it back and release
be modified again, thus the const casting. */ the one we popped. */
vr_values->set_vr_value (var, const_cast <value_range *> (vr)); value_range *popped_vr = vr_values->swap_vr_value (var, vr);
stack.pop (); if (popped_vr)
return vr; vr_values->free_value_range (popped_vr);
} }
...@@ -62,14 +62,14 @@ class evrp_range_analyzer ...@@ -62,14 +62,14 @@ class evrp_range_analyzer
DISABLE_COPY_AND_ASSIGN (evrp_range_analyzer); DISABLE_COPY_AND_ASSIGN (evrp_range_analyzer);
class vr_values *vr_values; 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); 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_incoming_edge (basic_block);
void record_ranges_from_phis (basic_block); void record_ranges_from_phis (basic_block);
void set_ssa_range_info (tree, value_range *); void set_ssa_range_info (tree, value_range *);
/* STACK holds the old VR. */ /* 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. */ /* True if we are updating global ranges, false otherwise. */
bool m_update_global_ranges; bool m_update_global_ranges;
......
...@@ -4315,6 +4315,8 @@ vr_values::simplify_stmt_using_ranges (gimple_stmt_iterator *gsi) ...@@ -4315,6 +4315,8 @@ vr_values::simplify_stmt_using_ranges (gimple_stmt_iterator *gsi)
return false; return false;
} }
/* Set the lattice entry for VAR to VR. */
void void
vr_values::set_vr_value (tree var, value_range *vr) vr_values::set_vr_value (tree var, value_range *vr)
{ {
...@@ -4323,3 +4325,13 @@ 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; 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;
}
...@@ -41,8 +41,9 @@ class vr_values ...@@ -41,8 +41,9 @@ class vr_values
~vr_values (void); ~vr_values (void);
const value_range *get_value_range (const_tree); const value_range *get_value_range (const_tree);
void set_vr_value (tree, value_range *); void set_vr_value (tree, value_range *);
value_range *swap_vr_value (tree, value_range *);
void set_def_to_varying (const_tree); void set_def_to_varying (const_tree);
void set_defs_to_varying (gimple *); void set_defs_to_varying (gimple *);
bool update_value_range (const_tree, value_range *); bool update_value_range (const_tree, value_range *);
...@@ -68,6 +69,8 @@ class vr_values ...@@ -68,6 +69,8 @@ class vr_values
/* Allocate a new value_range object. */ /* Allocate a new value_range object. */
value_range *allocate_value_range (void) value_range *allocate_value_range (void)
{ return vrp_value_range_pool.allocate (); } { 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); void cleanup_edges_and_switches (void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment