cfg.c (free_edge): Add function argument and use it instead of cfun.
authorRichard Biener <rguenther@suse.de>
Tue, 27 Oct 2015 08:56:03 +0000 (08:56 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 27 Oct 2015 08:56:03 +0000 (08:56 +0000)
2015-10-27  Richard Biener  <rguenther@suse.de>

* cfg.c (free_edge): Add function argument and use it instead of cfun.
(clear_edges): Likewise.
* cfg.h (clear_edges): Adjust prototype.
* cfgexpand.c (pass_expand::execute): Adjust.
* cfgloop.c (release_recorded_exits): Add function argument and use
it instead of cfun.
* cfgloop.h (release_recorded_exits): Adjust prototype.
(loops_state_satisfies_p): Add overload with function argument.
(loops_state_set): Likewise.
(loops_state_clear): Likewise.
(struct loop_iterator): Add function argument to constructor
and iterator and use it instead of cfun.
(FOR_EACH_LOOP_FN): New macro.
(loop_optimizer_finalize): Add overload with function argument.
* loop-init.c (loop_optimizer_init): Adjust.
(fix_loop_structure): Likewise.
(loop_optimizer_finaliz): Add function argument and use it
instead of cfun.
* tree-cfg.c (delete_tree_cfg_annotations): Likewise.
* tree-cfg.h (delete_tree_cfg_annotations): Adjust prototype.
* cgraph.c (release_function_body): Do not push/pop cfun.
* final.c (rest_of_clean_state): Adjust.
* graphite.c (graphite_finalize): Likewise.
* tree-ssa-copy.c (fini_copy_prop): Likewise.
* tree-ssa-dce.c (perform_tree_ssa_dce): Likewise.
* tree-ssa-loop-ivcanon.c (canonicalize_induction_variables): Likewise.
(tree_unroll_loops_completely): Likewise.
(pass_complete_unrolli::execute): Likewise.
* tree-ssa-loop-niter.c (free_numbers_of_iterations_estimates):
Add function argument and use it instead of cfun.
* tree-ssa-loop-niter.h (free_numbers_of_iterations_estimates):
Adjust prototype.
* tree-ssa-loop.c (tree_ssa_loop_done): Adjust.
* tree-ssa.c (delete_tree_ssa): Add function argument and use it
instead of cfun.
* tree-ssa.h (delete_tree_ssa): Adjust prototype.
* tree-ssanames.c (fini_ssanames): Add function argument and use it
instead of cfun.
* tree-ssanames.c (fini_ssanames): Adjust prototype.
* tree-vrp.c (execute_vrp): Adjust.
* value-prof.c (free_histograms): Add function argument and use it
instead of cfun.
* value-prof.h (free_histograms): Adjust prototype.

From-SVN: r229405

25 files changed:
gcc/ChangeLog
gcc/cfg.c
gcc/cfg.h
gcc/cfgexpand.c
gcc/cfgloop.c
gcc/cfgloop.h
gcc/cgraph.c
gcc/final.c
gcc/graphite.c
gcc/loop-init.c
gcc/tree-cfg.c
gcc/tree-cfg.h
gcc/tree-ssa-copy.c
gcc/tree-ssa-dce.c
gcc/tree-ssa-loop-ivcanon.c
gcc/tree-ssa-loop-niter.c
gcc/tree-ssa-loop-niter.h
gcc/tree-ssa-loop.c
gcc/tree-ssa.c
gcc/tree-ssa.h
gcc/tree-ssanames.c
gcc/tree-ssanames.h
gcc/tree-vrp.c
gcc/value-prof.c
gcc/value-prof.h

index 20fd5ececa797455c0229c7ea505ad37071459a6..6f8f756c7282796febdc89f1b3aac163469e58b7 100644 (file)
@@ -1,3 +1,49 @@
+2015-10-27  Richard Biener  <rguenther@suse.de>
+
+       * cfg.c (free_edge): Add function argument and use it instead of cfun.
+       (clear_edges): Likewise.
+       * cfg.h (clear_edges): Adjust prototype.
+       * cfgexpand.c (pass_expand::execute): Adjust.
+       * cfgloop.c (release_recorded_exits): Add function argument and use
+       it instead of cfun.
+       * cfgloop.h (release_recorded_exits): Adjust prototype.
+       (loops_state_satisfies_p): Add overload with function argument.
+       (loops_state_set): Likewise.
+       (loops_state_clear): Likewise.
+       (struct loop_iterator): Add function argument to constructor
+       and iterator and use it instead of cfun.
+       (FOR_EACH_LOOP_FN): New macro.
+       (loop_optimizer_finalize): Add overload with function argument.
+       * loop-init.c (loop_optimizer_init): Adjust.
+       (fix_loop_structure): Likewise.
+       (loop_optimizer_finaliz): Add function argument and use it
+       instead of cfun.
+       * tree-cfg.c (delete_tree_cfg_annotations): Likewise.
+       * tree-cfg.h (delete_tree_cfg_annotations): Adjust prototype.
+       * cgraph.c (release_function_body): Do not push/pop cfun.
+       * final.c (rest_of_clean_state): Adjust.
+       * graphite.c (graphite_finalize): Likewise.
+       * tree-ssa-copy.c (fini_copy_prop): Likewise.
+       * tree-ssa-dce.c (perform_tree_ssa_dce): Likewise.
+       * tree-ssa-loop-ivcanon.c (canonicalize_induction_variables): Likewise.
+       (tree_unroll_loops_completely): Likewise.
+       (pass_complete_unrolli::execute): Likewise.
+       * tree-ssa-loop-niter.c (free_numbers_of_iterations_estimates):
+       Add function argument and use it instead of cfun.
+       * tree-ssa-loop-niter.h (free_numbers_of_iterations_estimates):
+       Adjust prototype.
+       * tree-ssa-loop.c (tree_ssa_loop_done): Adjust.
+       * tree-ssa.c (delete_tree_ssa): Add function argument and use it
+       instead of cfun.
+       * tree-ssa.h (delete_tree_ssa): Adjust prototype.
+       * tree-ssanames.c (fini_ssanames): Add function argument and use it
+       instead of cfun.
+       * tree-ssanames.c (fini_ssanames): Adjust prototype.
+       * tree-vrp.c (execute_vrp): Adjust.
+       * value-prof.c (free_histograms): Add function argument and use it
+       instead of cfun.
+       * value-prof.h (free_histograms): Adjust prototype.
+
 2015-10-27  Thomas Schwinge  <thomas@codesourcery.com>
 
        * tree.h (OACC_PARALLEL_BODY, OACC_PARALLEL_CLAUSES)
index 2bc785731f773abf94769aaf4f17e9ef9c55e528..4c4531a7cd3cf9f01c13ee7d817efc3358b2650a 100644 (file)
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -88,35 +88,35 @@ init_flow (struct function *the_fun)
    without actually removing it from the pred/succ arrays.  */
 
 static void
-free_edge (edge e)
+free_edge (function *fn, edge e)
 {
-  n_edges_for_fn (cfun)--;
+  n_edges_for_fn (fn)--;
   ggc_free (e);
 }
 
 /* Free the memory associated with the edge structures.  */
 
 void
-clear_edges (void)
+clear_edges (struct function *fn)
 {
   basic_block bb;
   edge e;
   edge_iterator ei;
 
-  FOR_EACH_BB_FN (bb, cfun)
+  FOR_EACH_BB_FN (bb, fn)
     {
       FOR_EACH_EDGE (e, ei, bb->succs)
-       free_edge (e);
+       free_edge (fn, e);
       vec_safe_truncate (bb->succs, 0);
       vec_safe_truncate (bb->preds, 0);
     }
 
-  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
-    free_edge (e);
-  vec_safe_truncate (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds, 0);
-  vec_safe_truncate (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs, 0);
+  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (fn)->succs)
+    free_edge (fn, e);
+  vec_safe_truncate (EXIT_BLOCK_PTR_FOR_FN (fn)->preds, 0);
+  vec_safe_truncate (ENTRY_BLOCK_PTR_FOR_FN (fn)->succs, 0);
 
-  gcc_assert (!n_edges_for_fn (cfun));
+  gcc_assert (!n_edges_for_fn (fn));
 }
 \f
 /* Allocate memory for basic_block.  */
@@ -350,7 +350,7 @@ remove_edge_raw (edge e)
   disconnect_src (e);
   disconnect_dest (e);
 
-  free_edge (e);
+  free_edge (cfun, e);
 }
 
 /* Redirect an edge's successor from one block to another.  */
index 7674667100b259d4057c6118c090c11dc7c1d53e..9cc624c592805235ad2e50476ee6defddb49678c 100644 (file)
--- a/gcc/cfg.h
+++ b/gcc/cfg.h
@@ -74,8 +74,8 @@ struct GTY(()) control_flow_graph {
 };
 
 
-extern void init_flow (struct function *);
-extern void clear_edges (void);
+extern void init_flow (function *);
+extern void clear_edges (function *);
 extern basic_block alloc_block (void);
 extern void link_block (basic_block, basic_block);
 extern void unlink_block (basic_block);
index eaad859f513b6402566d9b41a73c140a7b45bcfa..8d5fb640e178e0a0b2bf4bcd49b340f2684bbe3a 100644 (file)
@@ -6304,7 +6304,7 @@ pass_expand::execute (function *fun)
   /* Free stuff we no longer need after GIMPLE optimizations.  */
   free_dominance_info (CDI_DOMINATORS);
   free_dominance_info (CDI_POST_DOMINATORS);
-  delete_tree_cfg_annotations ();
+  delete_tree_cfg_annotations (fun);
 
   timevar_push (TV_OUT_OF_SSA);
   finish_out_of_ssa (&SA);
@@ -6318,7 +6318,7 @@ pass_expand::execute (function *fun)
   /* Expansion is used by optimization passes too, set maybe_hot_insn_p
      conservatively to true until they are all profile aware.  */
   delete lab_rtx_for_bb;
-  free_histograms ();
+  free_histograms (fun);
 
   construct_exit_block ();
   insn_locations_finalize ();
index b8a1244aaa652c4076864788c1b8c89ea5516d69..5c13b3737c29ede716f9e8b8f3122d007d91ed0e 100644 (file)
@@ -1114,12 +1114,12 @@ dump_recorded_exits (FILE *file)
 /* Releases lists of loop exits.  */
 
 void
-release_recorded_exits (void)
+release_recorded_exits (function *fn)
 {
-  gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS));
-  current_loops->exits->empty ();
-  current_loops->exits = NULL;
-  loops_state_clear (LOOPS_HAVE_RECORDED_EXITS);
+  gcc_assert (loops_state_satisfies_p (fn, LOOPS_HAVE_RECORDED_EXITS));
+  loops_for_fn (fn)->exits->empty ();
+  loops_for_fn (fn)->exits = NULL;
+  loops_state_clear (fn, LOOPS_HAVE_RECORDED_EXITS);
 }
 
 /* Returns the list of the exit edges of a LOOP.  */
index 07b070bcf3e42401d041ef8beb4e9815fb702c9c..cd4a4c990961588cbc0c5e98230ef73826af488b 100644 (file)
@@ -264,7 +264,7 @@ extern void flow_loop_free (struct loop *);
 int flow_loop_nodes_find (basic_block, struct loop *);
 unsigned fix_loop_structure (bitmap changed_bbs);
 bool mark_irreducible_loops (void);
-void release_recorded_exits (void);
+void release_recorded_exits (function *);
 void record_loop_exits (void);
 void rescan_loop_exit (edge, bool, bool);
 
@@ -491,28 +491,46 @@ number_of_loops (struct function *fn)
 /* Returns true if state of the loops satisfies all properties
    described by FLAGS.  */
 
+static inline bool
+loops_state_satisfies_p (function *fn, unsigned flags)
+{
+  return (loops_for_fn (fn)->state & flags) == flags;
+}
+
 static inline bool
 loops_state_satisfies_p (unsigned flags)
 {
-  return (current_loops->state & flags) == flags;
+  return loops_state_satisfies_p (cfun, flags);
 }
 
 /* Sets FLAGS to the loops state.  */
 
+static inline void
+loops_state_set (function *fn, unsigned flags)
+{
+  loops_for_fn (fn)->state |= flags;
+}
+
 static inline void
 loops_state_set (unsigned flags)
 {
-  current_loops->state |= flags;
+  loops_state_set (cfun, flags);
 }
 
 /* Clears FLAGS from the loops state.  */
 
+static inline void
+loops_state_clear (function *fn, unsigned flags)
+{
+  loops_for_fn (fn)->state &= ~flags;
+}
+
 static inline void
 loops_state_clear (unsigned flags)
 {
   if (!current_loops)
     return;
-  current_loops->state &= ~flags;
+  loops_state_clear (cfun, flags);
 }
 
 /* Loop iterators.  */
@@ -531,11 +549,14 @@ enum li_flags
 
 struct loop_iterator
 {
-  loop_iterator (loop_p *loop, unsigned flags);
+  loop_iterator (function *fn, loop_p *loop, unsigned flags);
   ~loop_iterator ();
 
   inline loop_p next ();
 
+  /* The function we are visiting.  */
+  function *fn;
+
   /* The list of loops to visit.  */
   vec<int> to_visit;
 
@@ -551,7 +572,7 @@ loop_iterator::next ()
   while (this->to_visit.iterate (this->idx, &anum))
     {
       this->idx++;
-      loop_p loop = get_loop (cfun, anum);
+      loop_p loop = get_loop (fn, anum);
       if (loop)
        return loop;
     }
@@ -560,26 +581,27 @@ loop_iterator::next ()
 }
 
 inline
-loop_iterator::loop_iterator (loop_p *loop, unsigned flags)
+loop_iterator::loop_iterator (function *fn, loop_p *loop, unsigned flags)
 {
   struct loop *aloop;
   unsigned i;
   int mn;
 
   this->idx = 0;
-  if (!current_loops)
+  this->fn = fn;
+  if (!loops_for_fn (fn))
     {
       this->to_visit.create (0);
       *loop = NULL;
       return;
     }
 
-  this->to_visit.create (number_of_loops (cfun));
+  this->to_visit.create (number_of_loops (fn));
   mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
 
   if (flags & LI_ONLY_INNERMOST)
     {
-      for (i = 0; vec_safe_iterate (current_loops->larray, i, &aloop); i++)
+      for (i = 0; vec_safe_iterate (loops_for_fn (fn)->larray, i, &aloop); i++)
        if (aloop != NULL
            && aloop->inner == NULL
            && aloop->num >= mn)
@@ -588,7 +610,7 @@ loop_iterator::loop_iterator (loop_p *loop, unsigned flags)
   else if (flags & LI_FROM_INNERMOST)
     {
       /* Push the loops to LI->TO_VISIT in postorder.  */
-      for (aloop = current_loops->tree_root;
+      for (aloop = loops_for_fn (fn)->tree_root;
           aloop->inner != NULL;
           aloop = aloop->inner)
        continue;
@@ -614,7 +636,7 @@ loop_iterator::loop_iterator (loop_p *loop, unsigned flags)
   else
     {
       /* Push the loops to LI->TO_VISIT in preorder.  */
-      aloop = current_loops->tree_root;
+      aloop = loops_for_fn (fn)->tree_root;
       while (1)
        {
          if (aloop->num >= mn)
@@ -643,7 +665,12 @@ loop_iterator::~loop_iterator ()
 }
 
 #define FOR_EACH_LOOP(LOOP, FLAGS) \
-  for (loop_iterator li(&(LOOP), FLAGS); \
+  for (loop_iterator li(cfun, &(LOOP), FLAGS); \
+       (LOOP); \
+       (LOOP) = li.next ())
+
+#define FOR_EACH_LOOP_FN(FN, LOOP, FLAGS) \
+  for (loop_iterator li(fn, &(LOOP), FLAGS); \
        (LOOP); \
        (LOOP) = li.next ())
 
@@ -691,7 +718,12 @@ extern void init_set_costs (void);
 
 /* Loop optimizer initialization.  */
 extern void loop_optimizer_init (unsigned);
-extern void loop_optimizer_finalize (void);
+extern void loop_optimizer_finalize (function *);
+inline void
+loop_optimizer_finalize ()
+{
+  loop_optimizer_finalize (cfun);
+}
 
 /* Optimization passes.  */
 enum
index 1a64d7892eedacaac0026783c9b9bfdf33920bc2..cfcfaf3ed7652816cc4b15dbef2811c88df7578b 100644 (file)
@@ -1685,39 +1685,38 @@ cgraph_node::remove_callers (void)
 void
 release_function_body (tree decl)
 {
-  if (DECL_STRUCT_FUNCTION (decl))
+  function *fn = DECL_STRUCT_FUNCTION (decl);
+  if (fn)
     {
-      if (DECL_STRUCT_FUNCTION (decl)->cfg
-         || DECL_STRUCT_FUNCTION (decl)->gimple_df)
+      if (fn->cfg
+         || fn->gimple_df)
        {
-         push_cfun (DECL_STRUCT_FUNCTION (decl));
-         if (cfun->cfg
-             && current_loops)
+         if (fn->cfg
+             && loops_for_fn (fn))
            {
-             cfun->curr_properties &= ~PROP_loops;
-             loop_optimizer_finalize ();
+             fn->curr_properties &= ~PROP_loops;
+             loop_optimizer_finalize (fn);
            }
-         if (cfun->gimple_df)
+         if (fn->gimple_df)
            {
-             delete_tree_ssa ();
-             delete_tree_cfg_annotations ();
-             cfun->eh = NULL;
+             delete_tree_ssa (fn);
+             delete_tree_cfg_annotations (fn);
+             fn->eh = NULL;
            }
-         if (cfun->cfg)
+         if (fn->cfg)
            {
-             gcc_assert (!dom_info_available_p (CDI_DOMINATORS));
-             gcc_assert (!dom_info_available_p (CDI_POST_DOMINATORS));
-             clear_edges ();
-             cfun->cfg = NULL;
+             gcc_assert (!dom_info_available_p (fn, CDI_DOMINATORS));
+             gcc_assert (!dom_info_available_p (fn, CDI_POST_DOMINATORS));
+             clear_edges (fn);
+             fn->cfg = NULL;
            }
-         if (cfun->value_histograms)
-           free_histograms ();
-         pop_cfun ();
+         if (fn->value_histograms)
+           free_histograms (fn);
        }
       gimple_set_body (decl, NULL);
       /* Struct function hangs a lot of data that would leak if we didn't
          removed all pointers to it.   */
-      ggc_free (DECL_STRUCT_FUNCTION (decl));
+      ggc_free (fn);
       DECL_STRUCT_FUNCTION (decl) = NULL;
     }
   DECL_SAVED_TREE (decl) = NULL;
index 18faa63e26d0afd689f9d1b7d2e095f04ab06fe9..9bc0933ef471d9cfda2d3dc4f2b55826fa5bac47 100644 (file)
@@ -4676,7 +4676,7 @@ rest_of_clean_state (void)
 
   free_bb_for_insn ();
 
-  delete_tree_ssa ();
+  delete_tree_ssa (cfun);
 
   /* We can reduce stack alignment on call site only when we are sure that
      the function body just produced will be actually used in the final
index 808665f7da35c948ef431b8a07c6dc114fab646f..773203e24f68eb11060f202795a0f18ed309eb57 100644 (file)
@@ -268,7 +268,7 @@ graphite_finalize (bool need_cfg_cleanup_p)
       scev_reset ();
       cleanup_tree_cfg ();
       profile_status_for_fn (cfun) = PROFILE_ABSENT;
-      release_recorded_exits ();
+      release_recorded_exits (cfun);
       tree_estimate_probability ();
     }
 
index a9a3d6fa98af46c266e740f7b54fff5cdc380449..2a38a0f75663afd18b9f64ecdb65c526728d1a5c 100644 (file)
@@ -111,7 +111,7 @@ loop_optimizer_init (unsigned flags)
 
       /* Clear all flags.  */
       if (recorded_exits)
-       release_recorded_exits ();
+       release_recorded_exits (cfun);
       loops_state_clear (~0U);
 
       if (needs_fixup)
@@ -139,43 +139,41 @@ loop_optimizer_init (unsigned flags)
 /* Finalize loop structures.  */
 
 void
-loop_optimizer_finalize (void)
+loop_optimizer_finalize (struct function *fn)
 {
   struct loop *loop;
   basic_block bb;
 
   timevar_push (TV_LOOP_FINI);
 
-  if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
-    release_recorded_exits ();
+  if (loops_state_satisfies_p (fn, LOOPS_HAVE_RECORDED_EXITS))
+    release_recorded_exits (fn);
 
-  free_numbers_of_iterations_estimates ();
+  free_numbers_of_iterations_estimates (fn);
 
   /* If we should preserve loop structure, do not free it but clear
      flags that advanced properties are there as we are not preserving
      that in full.  */
-  if (cfun->curr_properties & PROP_loops)
+  if (fn->curr_properties & PROP_loops)
     {
-      loops_state_clear (LOOP_CLOSED_SSA
+      loops_state_clear (fn, LOOP_CLOSED_SSA
                         | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
                         | LOOPS_HAVE_PREHEADERS
                         | LOOPS_HAVE_SIMPLE_LATCHES
                         | LOOPS_HAVE_FALLTHRU_PREHEADERS);
-      loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
+      loops_state_set (fn, LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
       goto loop_fini_done;
     }
 
-  gcc_assert (current_loops != NULL);
-
-  FOR_EACH_LOOP (loop, 0)
+  FOR_EACH_LOOP_FN (fn, loop, 0)
     free_simple_loop_desc (loop);
 
   /* Clean up.  */
-  flow_loops_free (current_loops);
-  ggc_free (current_loops);
-  current_loops = NULL;
+  flow_loops_free (loops_for_fn (fn));
+  ggc_free (loops_for_fn (fn));
+  set_loops_for_fn (fn, NULL);
 
-  FOR_ALL_BB_FN (bb, cfun)
+  FOR_ALL_BB_FN (bb, fn)
     {
       bb->loop_father = NULL;
     }
@@ -215,7 +213,7 @@ fix_loop_structure (bitmap changed_bbs)
 
   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
     {
-      release_recorded_exits ();
+      release_recorded_exits (cfun);
       record_exits = LOOPS_HAVE_RECORDED_EXITS;
     }
 
index 8e3e810cf894dc667b9b1682d31da85e88fde2d6..40d5eb89ed759cf13d6efdf2f2e9761b3747caf8 100644 (file)
@@ -2570,9 +2570,9 @@ stmt_ends_bb_p (gimple *t)
 /* Remove block annotations and other data structures.  */
 
 void
-delete_tree_cfg_annotations (void)
+delete_tree_cfg_annotations (struct function *fn)
 {
-  vec_free (label_to_block_map_for_fn (cfun));
+  vec_free (label_to_block_map_for_fn (fn));
 }
 
 /* Return the virtual phi in BB.  */
index 1bfa5c4b11da56ce345296dd7500e7f1fe46e725..3581118cfaa7a0b2011afa1904cbf1a5950e959f 100644 (file)
@@ -57,7 +57,7 @@ extern bool is_ctrl_altering_stmt (gimple *);
 extern bool simple_goto_p (gimple *);
 extern bool stmt_ends_bb_p (gimple *);
 extern bool assert_unreachable_fallthru_edge_p (edge);
-extern void delete_tree_cfg_annotations (void);
+extern void delete_tree_cfg_annotations (function *);
 extern gphi *get_virtual_phi (basic_block);
 extern gimple *first_stmt (basic_block);
 extern gimple *last_stmt (basic_block);
index 8e137bd73e989f5da589354eee024e637881e4f8..da9feae71a154bcad34d7de6cb50c1143685ea20 100644 (file)
@@ -561,7 +561,7 @@ fini_copy_prop (void)
   bool changed = substitute_and_fold (get_value, NULL, true);
   if (changed)
     {
-      free_numbers_of_iterations_estimates ();
+      free_numbers_of_iterations_estimates (cfun);
       if (scev_initialized_p ())
        scev_reset ();
     }
index 727b5f0261bd8af9b178fdbb5fdc1e1c64adadb8..3bedb4df12ffb02748ac06de2aa8a1962d369031 100644 (file)
@@ -1669,7 +1669,7 @@ perform_tree_ssa_dce (bool aggressive)
 
   if (something_changed)
     {
-      free_numbers_of_iterations_estimates ();
+      free_numbers_of_iterations_estimates (cfun);
       if (scev_initialized_p ())
        scev_reset ();
       return TODO_update_ssa | TODO_cleanup_cfg;
index 6599ffc743ebf118957235107d5bdf9d4203ffec..38f7c3f4abcd27e378f37e20228b0998e3d3b323 100644 (file)
@@ -1138,7 +1138,7 @@ canonicalize_induction_variables (void)
   bool irred_invalidated = false;
   bitmap loop_closed_ssa_invalidated = BITMAP_ALLOC (NULL);
 
-  free_numbers_of_iterations_estimates ();
+  free_numbers_of_iterations_estimates (cfun);
   estimate_numbers_of_iterations ();
 
   FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
@@ -1326,7 +1326,7 @@ tree_unroll_loops_completely (bool may_increase_size, bool unroll_outer)
       if (loops_state_satisfies_p (LOOP_CLOSED_SSA))
        loop_closed_ssa_invalidated = BITMAP_ALLOC (NULL);
 
-      free_numbers_of_iterations_estimates ();
+      free_numbers_of_iterations_estimates (cfun);
       estimate_numbers_of_iterations ();
 
       changed = tree_unroll_loops_completely_1 (may_increase_size,
@@ -1532,7 +1532,7 @@ pass_complete_unrolli::execute (function *fun)
     {
       scev_initialize ();
       ret = tree_unroll_loops_completely (optimize >= 3, false);
-      free_numbers_of_iterations_estimates ();
+      free_numbers_of_iterations_estimates (fun);
       scev_finalize ();
     }
   loop_optimizer_finalize ();
index 5125af4d7bdaa8b36d8902c6b9f61aca51e57f81..a1c41295259b8df23c50ee67f7192d8ad7aaf365 100644 (file)
@@ -4267,11 +4267,11 @@ free_numbers_of_iterations_estimates_loop (struct loop *loop)
 /* Frees the information on upper bounds on numbers of iterations of loops.  */
 
 void
-free_numbers_of_iterations_estimates (void)
+free_numbers_of_iterations_estimates (function *fn)
 {
   struct loop *loop;
 
-  FOR_EACH_LOOP (loop, 0)
+  FOR_EACH_LOOP_FN (fn, loop, 0)
     {
       free_numbers_of_iterations_estimates_loop (loop);
     }
index 6140e3df6e4871ab7458cfa12383314b8d6328f3..b7140276b6964f6d6fe0aba2cec897d499c7a768 100644 (file)
@@ -45,7 +45,7 @@ extern bool nowrap_type_p (tree);
 extern bool scev_probably_wraps_p (tree, tree, gimple *, struct loop *, bool);
 extern void free_loop_control_ivs (struct loop *);
 extern void free_numbers_of_iterations_estimates_loop (struct loop *);
-extern void free_numbers_of_iterations_estimates (void);
+extern void free_numbers_of_iterations_estimates (function *);
 extern void substitute_in_loop_info (struct loop *, tree, tree);
 
 #endif /* GCC_TREE_SSA_LOOP_NITER_H */
index 078b1d128c70966851a3cb363508520cb3a99d32..6ea7ae09150b08fd28f4d03cc3cf02b3a42489dc 100644 (file)
@@ -426,7 +426,7 @@ make_pass_iv_optimize (gcc::context *ctxt)
 static unsigned int
 tree_ssa_loop_done (void)
 {
-  free_numbers_of_iterations_estimates ();
+  free_numbers_of_iterations_estimates (cfun);
   scev_finalize ();
   loop_optimizer_finalize ();
   return 0;
index 4b869be8da5b07d2207a8ba64b230b8e0ea36555..b652b4c000880920b23386a2bd7cbc0d7d66c32e 100644 (file)
@@ -1118,25 +1118,22 @@ make_pass_init_datastructures (gcc::context *ctxt)
 /* Deallocate memory associated with SSA data structures for FNDECL.  */
 
 void
-delete_tree_ssa (void)
+delete_tree_ssa (struct function *fn)
 {
-  fini_ssanames ();
+  fini_ssanames (fn);
 
   /* We no longer maintain the SSA operand cache at this point.  */
-  if (ssa_operands_active (cfun))
-    fini_ssa_operands (cfun);
-
-  cfun->gimple_df->default_defs->empty ();
-  cfun->gimple_df->default_defs = NULL;
-  pt_solution_reset (&cfun->gimple_df->escaped);
-  if (cfun->gimple_df->decls_to_pointers != NULL)
-    delete cfun->gimple_df->decls_to_pointers;
-  cfun->gimple_df->decls_to_pointers = NULL;
-  cfun->gimple_df->modified_noreturn_calls = NULL;
-  cfun->gimple_df = NULL;
-
-  /* We no longer need the edge variable maps.  */
-  redirect_edge_var_map_destroy ();
+  if (ssa_operands_active (fn))
+    fini_ssa_operands (fn);
+
+  fn->gimple_df->default_defs->empty ();
+  fn->gimple_df->default_defs = NULL;
+  pt_solution_reset (&fn->gimple_df->escaped);
+  if (fn->gimple_df->decls_to_pointers != NULL)
+    delete fn->gimple_df->decls_to_pointers;
+  fn->gimple_df->decls_to_pointers = NULL;
+  fn->gimple_df->modified_noreturn_calls = NULL;
+  fn->gimple_df = NULL;
 }
 
 /* Return true if EXPR is a useless type conversion, otherwise return
index a3b9bedb37028df256c8695c3d10a2844139d350..a2c90a021e7938546a50afe8f9a56c8d11642d99 100644 (file)
@@ -45,8 +45,8 @@ extern void insert_debug_temps_for_defs (gimple_stmt_iterator *);
 extern void reset_debug_uses (gimple *);
 extern void release_defs_bitset (bitmap toremove);
 extern void verify_ssa (bool, bool);
-extern void init_tree_ssa (struct function *);
-extern void delete_tree_ssa (void);
+extern void init_tree_ssa (function *);
+extern void delete_tree_ssa (function *);
 extern bool tree_ssa_useless_type_conversion (tree);
 extern tree tree_ssa_strip_useless_type_conversions (tree);
 
index 4be0e53328d6be99b6956c931355f14fe3e8c1c2..804ec627a2c0a0d655163486c2aacf9cacc9ee57 100644 (file)
@@ -102,11 +102,11 @@ init_ssanames (struct function *fn, int size)
 /* Finalize management of SSA_NAMEs.  */
 
 void
-fini_ssanames (void)
+fini_ssanames (struct function *fn)
 {
-  vec_free (SSANAMES (cfun));
-  vec_free (FREE_SSANAMES (cfun));
-  vec_free (FREE_SSANAMES_QUEUE (cfun));
+  vec_free (SSANAMES (fn));
+  vec_free (FREE_SSANAMES (fn));
+  vec_free (FREE_SSANAMES_QUEUE (fn));
 }
 
 /* Dump some simple statistics regarding the re-use of SSA_NAME nodes.  */
index a915d8f1c517755de1e1a859a3cc38e215a033f2..092ada1db85eeaef257c20f77f65eb12bf871913 100644 (file)
@@ -76,7 +76,7 @@ extern enum value_range_type get_range_info (const_tree, wide_int *,
 extern void set_nonzero_bits (tree, const wide_int_ref &);
 extern wide_int get_nonzero_bits (const_tree);
 extern void init_ssanames (struct function *, int);
-extern void fini_ssanames (void);
+extern void fini_ssanames (struct function *);
 extern void ssanames_print_statistics (void);
 extern tree make_ssa_name_fn (struct function *, tree, gimple *);
 extern void release_ssa_name_fn (struct function *, tree);
index fe34ffdf03e5de6de4d56b277eceae855ef4c10c..0a47d35a1bd5b9590480a251ff448eb3aba00063 100644 (file)
@@ -10281,7 +10281,7 @@ execute_vrp (void)
   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
   vrp_finalize ();
 
-  free_numbers_of_iterations_estimates ();
+  free_numbers_of_iterations_estimates (cfun);
 
   /* ASSERT_EXPRs must be removed before finalizing jump threads
      as finalizing jump threads calls the CFG cleanup code which
index 19e288f483b44bf9b72d088cad65075324df20da..efdb434e236d180822dd0b721e0eb9a62bfdd291 100644 (file)
@@ -603,13 +603,13 @@ free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
 }
 
 void
-free_histograms (void)
+free_histograms (struct function *fn)
 {
-  if (VALUE_HISTOGRAMS (cfun))
+  if (VALUE_HISTOGRAMS (fn))
     {
-      htab_traverse (VALUE_HISTOGRAMS (cfun), free_hist, NULL);
-      htab_delete (VALUE_HISTOGRAMS (cfun));
-      VALUE_HISTOGRAMS (cfun) = NULL;
+      htab_traverse (VALUE_HISTOGRAMS (fn), free_hist, NULL);
+      htab_delete (VALUE_HISTOGRAMS (fn));
+      VALUE_HISTOGRAMS (fn) = NULL;
     }
 }
 
index 6dadb0cc97cf6d85987eda6f217668e9e59a3bf7..2ac77db806e2a7da7d86f3b215915cca42c00401 100644 (file)
@@ -90,7 +90,7 @@ void gimple_duplicate_stmt_histograms (struct function *, gimple *,
                                       struct function *, gimple *);
 void gimple_move_stmt_histograms (struct function *, gimple *, gimple *);
 void verify_histograms (void);
-void free_histograms (void);
+void free_histograms (function *);
 void stringop_block_profile (gimple *, unsigned int *, HOST_WIDE_INT *);
 gcall *gimple_ic (gcall *, struct cgraph_node *, int, gcov_type,
                  gcov_type);