vr-values.h (vr_values::swap_vr_value): New.
authorRichard Biener <rguenther@suse.de>
Wed, 31 Jul 2019 10:55:27 +0000 (10:55 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 31 Jul 2019 10:55:27 +0000 (10:55 +0000)
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

gcc/ChangeLog
gcc/gimple-ssa-evrp-analyze.c
gcc/gimple-ssa-evrp-analyze.h
gcc/vr-values.c
gcc/vr-values.h

index 564bd70c4c91eb781b895109b548ce86bbefe383..f5b0ab61a4acac60a3eb33cfe7b12f2b50b186fd 100644 (file)
@@ -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
index 3f813ba3cfe4f003b4addd391615a34775480a43..1c4fc8d8682d1544675ff2ead9ce0e3edde9917b 100644 (file)
@@ -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);
 }
index d252a2812c8f636b701116b4f8f26d1bcb258afc..a136cea4375b87193885a48bcf67be22cccce928 100644 (file)
@@ -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;
index d03309942af4c21109527e174326354a1bf795c5..3acbdf62a561cbc173e77ecaa7a4db407ea7e874 100644 (file)
@@ -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;
+}
index c26de2c2d93438bc03d8d501fa17191a3ad0ce47..ec65de3dab73912119941a3a14fe8a8c23f0d3bb 100644 (file)
@@ -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);