This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 6/6] pass cfun to pass::execute


On Thu, Apr 17, 2014 at 10:37 AM,  <tsaunders@mozilla.com> wrote:
> From: Trevor Saunders <tsaunders@mozilla.com>
>
> Hi,
>
> same as the previous patch.
>
> bootstrap + regtest passed on x86_64-unknown-linux-gnu, ok?

Ok.

Thanks,
Richard.

> Trev
>
> 2014-03-19  Trevor Saunders  <tsaunders@mozilla.com>
>
>         * passes.c (opt_pass::execute): Adjust.
>         (pass_manager::execute_pass_mode_switching): Likewise.
>         (early_local_passes::execute): Likewise.
>         (execute_one_pass): Pass cfun to the pass's execute method.
>         * tree-pass.h (opt_pass::execute): Add function * argument.
>         * asan.c, auto-inc-dec.c, bb-reorder.c, bt-load.c, cfgcleanup.c,
>         cfgexpand.c, cfgrtl.c, cgraphbuild.c, combine-stack-adj.c, combine.c,
>         compare-elim.c, config/arc/arc.c, config/epiphany/mode-switch-use.c,
>         config/epiphany/resolve-sw-modes.c, config/i386/i386.c,
>         config/mips/mips.c, config/rl78/rl78.c, config/s390/s390.c,
>         config/sparc/sparc.c, cprop.c, dce.c, df-core.c, dse.c, dwarf2cfi.c,
>         except.c, final.c, function.c, fwprop.c, gcse.c, gimple-low.c,
>         gimple-ssa-isolate-paths.c, gimple-ssa-strength-reduction.c,
>         graphite.c, ifcvt.c, init-regs.c, ipa-cp.c, ipa-devirt.c,
>         ipa-inline-analysis.c, ipa-inline.c, ipa-profile.c, ipa-pure-const.c,
>         ipa-reference.c, ipa-split.c, ipa.c, ira.c, jump.c, loop-init.c,
>         lower-subreg.c, mode-switching.c, omp-low.c, postreload-gcse.c,
>         postreload.c, predict.c, recog.c, ree.c, reg-stack.c, regcprop.c,
>         reginfo.c, regrename.c, reorg.c, sched-rgn.c, stack-ptr-mod.c,
>         store-motion.c, tracer.c, trans-mem.c, tree-call-cdce.c, tree-cfg.c,
>         tree-cfgcleanup.c, tree-complex.c, tree-eh.c, tree-emutls.c,
>         tree-if-conv.c, tree-into-ssa.c, tree-loop-distribution.c, tree-nrv.c,
>         tree-object-size.c, tree-parloops.c, tree-predcom.c, tree-ssa-ccp.c,
>         tree-ssa-copy.c, tree-ssa-copyrename.c, tree-ssa-dce.c,
>         tree-ssa-dom.c, tree-ssa-dse.c, tree-ssa-forwprop.c,
>         tree-ssa-ifcombine.c, tree-ssa-loop-ch.c, tree-ssa-loop-im.c,
>         tree-ssa-loop-ivcanon.c, tree-ssa-loop-prefetch.c,
>         tree-ssa-loop-unswitch.c, tree-ssa-loop.c, tree-ssa-math-opts.c,
>         tree-ssa-phiopt.c, tree-ssa-phiprop.c, tree-ssa-pre.c,
>         tree-ssa-reassoc.c, tree-ssa-sink.c, tree-ssa-strlen.c,
>         tree-ssa-structalias.c, tree-ssa-uncprop.c, tree-ssa-uninit.c,
>         tree-ssa.c, tree-ssanames.c, tree-stdarg.c, tree-switch-conversion.c,
>         tree-tailcall.c, tree-vect-generic.c, tree-vectorizer.c, tree-vrp.c,
>         tree.c, tsan.c, ubsan.c, var-tracking.c, vtable-verify.c, web.c:
>         Adjust.
>
> diff --git a/gcc/asan.c b/gcc/asan.c
> index 3fe50ef..9f29807 100644
> --- a/gcc/asan.c
> +++ b/gcc/asan.c
> @@ -2505,7 +2505,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_asan (m_ctxt); }
>    virtual bool gate (function *) { return gate_asan (); }
> -  unsigned int execute () { return asan_instrument (); }
> +  virtual unsigned int execute (function *) { return asan_instrument (); }
>
>  }; // class pass_asan
>
> @@ -2543,7 +2543,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return !optimize && gate_asan (); }
> -  unsigned int execute () { return asan_instrument (); }
> +  virtual unsigned int execute (function *) { return asan_instrument (); }
>
>  }; // class pass_asan_O0
>
> @@ -2557,12 +2557,42 @@ make_pass_asan_O0 (gcc::context *ctxt)
>
>  /* Perform optimization of sanitize functions.  */
>
> -static unsigned int
> -execute_sanopt (void)
> +namespace {
> +
> +const pass_data pass_data_sanopt =
> +{
> +  GIMPLE_PASS, /* type */
> +  "sanopt", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_verify_flow | TODO_verify_stmts
> +    | TODO_update_ssa ), /* todo_flags_finish */
> +};
> +
> +class pass_sanopt : public gimple_opt_pass
> +{
> +public:
> +  pass_sanopt (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_sanopt, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return flag_sanitize; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_sanopt
> +
> +unsigned int
> +pass_sanopt::execute (function *fun)
>  {
>    basic_block bb;
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator gsi;
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> @@ -2593,36 +2623,6 @@ execute_sanopt (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_sanopt =
> -{
> -  GIMPLE_PASS, /* type */
> -  "sanopt", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_verify_flow | TODO_verify_stmts
> -    | TODO_update_ssa ), /* todo_flags_finish */
> -};
> -
> -class pass_sanopt : public gimple_opt_pass
> -{
> -public:
> -  pass_sanopt (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_sanopt, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_sanitize; }
> -  unsigned int execute () { return execute_sanopt (); }
> -
> -}; // class pass_sanopt
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/auto-inc-dec.c b/gcc/auto-inc-dec.c
> index e1485a3..0314d18 100644
> --- a/gcc/auto-inc-dec.c
> +++ b/gcc/auto-inc-dec.c
> @@ -1462,37 +1462,6 @@ merge_in_block (int max_reg, basic_block bb)
>
>  #endif
>
> -static unsigned int
> -rest_of_handle_auto_inc_dec (void)
> -{
> -#ifdef AUTO_INC_DEC
> -  basic_block bb;
> -  int max_reg = max_reg_num ();
> -
> -  if (!initialized)
> -    init_decision_table ();
> -
> -  mem_tmp = gen_rtx_MEM (Pmode, NULL_RTX);
> -
> -  df_note_add_problem ();
> -  df_analyze ();
> -
> -  reg_next_use = XCNEWVEC (rtx, max_reg);
> -  reg_next_inc_use = XCNEWVEC (rtx, max_reg);
> -  reg_next_def = XCNEWVEC (rtx, max_reg);
> -  FOR_EACH_BB_FN (bb, cfun)
> -    merge_in_block (max_reg, bb);
> -
> -  free (reg_next_use);
> -  free (reg_next_inc_use);
> -  free (reg_next_def);
> -
> -  mem_tmp = NULL;
> -#endif
> -  return 0;
> -}
> -
> -
>  /* Discover auto-inc auto-dec instructions.  */
>
>  namespace {
> @@ -1529,10 +1498,40 @@ public:
>      }
>
>
> -  unsigned int execute () { return rest_of_handle_auto_inc_dec (); }
> +  unsigned int execute (function *);
>
>  }; // class pass_inc_dec
>
> +unsigned int
> +pass_inc_dec::execute (function *fun ATTRIBUTE_UNUSED)
> +{
> +#ifdef AUTO_INC_DEC
> +  basic_block bb;
> +  int max_reg = max_reg_num ();
> +
> +  if (!initialized)
> +    init_decision_table ();
> +
> +  mem_tmp = gen_rtx_MEM (Pmode, NULL_RTX);
> +
> +  df_note_add_problem ();
> +  df_analyze ();
> +
> +  reg_next_use = XCNEWVEC (rtx, max_reg);
> +  reg_next_inc_use = XCNEWVEC (rtx, max_reg);
> +  reg_next_def = XCNEWVEC (rtx, max_reg);
> +  FOR_EACH_BB_FN (bb, fun)
> +    merge_in_block (max_reg, bb);
> +
> +  free (reg_next_use);
> +  free (reg_next_inc_use);
> +  free (reg_next_def);
> +
> +  mem_tmp = NULL;
> +#endif
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
> index 57103bd..db490f1 100644
> --- a/gcc/bb-reorder.c
> +++ b/gcc/bb-reorder.c
> @@ -2302,26 +2302,6 @@ insert_section_boundary_note (void)
>      }
>  }
>
> -static unsigned int
> -rest_of_handle_reorder_blocks (void)
> -{
> -  basic_block bb;
> -
> -  /* Last attempt to optimize CFG, as scheduling, peepholing and insn
> -     splitting possibly introduced more crossjumping opportunities.  */
> -  cfg_layout_initialize (CLEANUP_EXPENSIVE);
> -
> -  reorder_basic_blocks ();
> -  cleanup_cfg (CLEANUP_EXPENSIVE);
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
> -      bb->aux = bb->next_bb;
> -  cfg_layout_finalize ();
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_reorder_blocks =
> @@ -2354,10 +2334,30 @@ public:
>               && (flag_reorder_blocks || flag_reorder_blocks_and_partition));
>      }
>
> -  unsigned int execute () { return rest_of_handle_reorder_blocks (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_reorder_blocks
>
> +unsigned int
> +pass_reorder_blocks::execute (function *fun)
> +{
> +  basic_block bb;
> +
> +  /* Last attempt to optimize CFG, as scheduling, peepholing and insn
> +     splitting possibly introduced more crossjumping opportunities.  */
> +  cfg_layout_initialize (CLEANUP_EXPENSIVE);
> +
> +  reorder_basic_blocks ();
> +  cleanup_cfg (CLEANUP_EXPENSIVE);
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (fun))
> +      bb->aux = bb->next_bb;
> +  cfg_layout_finalize ();
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> @@ -2372,16 +2372,54 @@ make_pass_reorder_blocks (gcc::context *ctxt)
>     which can seriously pessimize code with many computed jumps in the source
>     code, such as interpreters.  See e.g. PR15242.  */
>
> +namespace {
>
> -static unsigned int
> -duplicate_computed_gotos (void)
> +const pass_data pass_data_duplicate_computed_gotos =
> +{
> +  RTL_PASS, /* type */
> +  "compgotos", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_REORDER_BLOCKS, /* tv_id */
> +  0, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_rtl_sharing, /* todo_flags_finish */
> +};
> +
> +class pass_duplicate_computed_gotos : public rtl_opt_pass
> +{
> +public:
> +  pass_duplicate_computed_gotos (gcc::context *ctxt)
> +    : rtl_opt_pass (pass_data_duplicate_computed_gotos, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *);
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_duplicate_computed_gotos
> +
> +bool
> +pass_duplicate_computed_gotos::gate (function *fun)
> +{
> +  if (targetm.cannot_modify_jumps_p ())
> +    return false;
> +  return (optimize > 0
> +         && flag_expensive_optimizations
> +         && ! optimize_function_for_size_p (fun));
> +}
> +
> +unsigned int
> +pass_duplicate_computed_gotos::execute (function *fun)
>  {
>    basic_block bb, new_bb;
>    bitmap candidates;
>    int max_size;
>    bool changed = false;
>
> -  if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1)
> +  if (n_basic_blocks_for_fn (fun) <= NUM_FIXED_BLOCKS + 1)
>      return 0;
>
>    clear_bb_flags ();
> @@ -2400,7 +2438,7 @@ duplicate_computed_gotos (void)
>    /* Look for blocks that end in a computed jump, and see if such blocks
>       are suitable for unfactoring.  If a block is a candidate for unfactoring,
>       mark it in the candidates.  */
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        rtx insn;
>        edge e;
> @@ -2408,7 +2446,7 @@ duplicate_computed_gotos (void)
>        int size, all_flags;
>
>        /* Build the reorder chain for the original order of blocks.  */
> -      if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
> +      if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (fun))
>         bb->aux = bb->next_bb;
>
>        /* Obviously the block has to end in a computed jump.  */
> @@ -2447,7 +2485,7 @@ duplicate_computed_gotos (void)
>      goto done;
>
>    /* Duplicate computed gotos.  */
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        if (bb->flags & BB_VISITED)
>         continue;
> @@ -2458,7 +2496,7 @@ duplicate_computed_gotos (void)
>          the exit block or the next block.
>          The destination must have more than one predecessor.  */
>        if (!single_succ_p (bb)
> -         || single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun)
> +         || single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (fun)
>           || single_succ (bb) == bb->next_bb
>           || single_pred_p (single_succ (bb)))
>         continue;
> @@ -2491,45 +2529,6 @@ done:
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_duplicate_computed_gotos =
> -{
> -  RTL_PASS, /* type */
> -  "compgotos", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_REORDER_BLOCKS, /* tv_id */
> -  0, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_rtl_sharing, /* todo_flags_finish */
> -};
> -
> -class pass_duplicate_computed_gotos : public rtl_opt_pass
> -{
> -public:
> -  pass_duplicate_computed_gotos (gcc::context *ctxt)
> -    : rtl_opt_pass (pass_data_duplicate_computed_gotos, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  unsigned int execute () { return duplicate_computed_gotos (); }
> -
> -}; // class pass_duplicate_computed_gotos
> -
> -bool
> -pass_duplicate_computed_gotos::gate (function *fun)
> -{
> -  if (targetm.cannot_modify_jumps_p ())
> -    return false;
> -  return (optimize > 0
> -         && flag_expensive_optimizations
> -         && ! optimize_function_for_size_p (fun));
> -}
> -
>  } // anon namespace
>
>  rtl_opt_pass *
> @@ -2627,12 +2626,57 @@ make_pass_duplicate_computed_gotos (gcc::context *ctxt)
>     Unconditional branches are dealt with by converting them into
>     indirect jumps.  */
>
> -static unsigned
> -partition_hot_cold_basic_blocks (void)
> +namespace {
> +
> +const pass_data pass_data_partition_blocks =
> +{
> +  RTL_PASS, /* type */
> +  "bbpart", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_REORDER_BLOCKS, /* tv_id */
> +  PROP_cfglayout, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_partition_blocks : public rtl_opt_pass
> +{
> +public:
> +  pass_partition_blocks (gcc::context *ctxt)
> +    : rtl_opt_pass (pass_data_partition_blocks, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *);
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_partition_blocks
> +
> +bool
> +pass_partition_blocks::gate (function *fun)
> +{
> +  /* The optimization to partition hot/cold basic blocks into separate
> +     sections of the .o file does not work well with linkonce or with
> +     user defined section attributes.  Don't call it if either case
> +     arises.  */
> +  return (flag_reorder_blocks_and_partition
> +         && optimize
> +         /* See gate_handle_reorder_blocks.  We should not partition if
> +            we are going to omit the reordering.  */
> +         && optimize_function_for_speed_p (fun)
> +         && !DECL_ONE_ONLY (current_function_decl)
> +         && !user_defined_section_attribute);
> +}
> +
> +unsigned
> +pass_partition_blocks::execute (function *fun)
>  {
>    vec<edge> crossing_edges;
>
> -  if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1)
> +  if (n_basic_blocks_for_fn (fun) <= NUM_FIXED_BLOCKS + 1)
>      return 0;
>
>    df_set_flags (DF_DEFER_INSN_RESCAN);
> @@ -2693,7 +2737,7 @@ partition_hot_cold_basic_blocks (void)
>
>       In the meantime, we have no other option but to throw away all
>       of the DF data and recompute it all.  */
> -  if (cfun->eh->lp_array)
> +  if (fun->eh->lp_array)
>      {
>        df_finish_pass (true);
>        df_scan_alloc (NULL);
> @@ -2708,51 +2752,6 @@ partition_hot_cold_basic_blocks (void)
>    return TODO_verify_flow | TODO_verify_rtl_sharing;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_partition_blocks =
> -{
> -  RTL_PASS, /* type */
> -  "bbpart", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_REORDER_BLOCKS, /* tv_id */
> -  PROP_cfglayout, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_partition_blocks : public rtl_opt_pass
> -{
> -public:
> -  pass_partition_blocks (gcc::context *ctxt)
> -    : rtl_opt_pass (pass_data_partition_blocks, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  unsigned int execute () { return partition_hot_cold_basic_blocks (); }
> -
> -}; // class pass_partition_blocks
> -
> -bool
> -pass_partition_blocks::gate (function *fun)
> -{
> -  /* The optimization to partition hot/cold basic blocks into separate
> -     sections of the .o file does not work well with linkonce or with
> -     user defined section attributes.  Don't call it if either case
> -     arises.  */
> -  return (flag_reorder_blocks_and_partition
> -         && optimize
> -         /* See gate_handle_reorder_blocks.  We should not partition if
> -            we are going to omit the reordering.  */
> -         && optimize_function_for_speed_p (fun)
> -         && !DECL_ONE_ONLY (current_function_decl)
> -         && !user_defined_section_attribute);
> -}
> -
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/bt-load.c b/gcc/bt-load.c
> index fc2aea7..53c5f58 100644
> --- a/gcc/bt-load.c
> +++ b/gcc/bt-load.c
> @@ -1494,14 +1494,6 @@ branch_target_load_optimize (bool after_prologue_epilogue_gen)
>      }
>  }
>
> -
> -static unsigned int
> -rest_of_handle_branch_target_load_optimize1 (void)
> -{
> -  branch_target_load_optimize (epilogue_completed);
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_branch_target_load_optimize1 =
> @@ -1527,9 +1519,11 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_branch_target_load_optimize; }
> -  unsigned int execute () {
> -    return rest_of_handle_branch_target_load_optimize1 ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      branch_target_load_optimize (epilogue_completed);
> +      return 0;
> +    }
>
>  }; // class pass_branch_target_load_optimize1
>
> @@ -1542,28 +1536,6 @@ make_pass_branch_target_load_optimize1 (gcc::context *ctxt)
>  }
>
>
> -static unsigned int
> -rest_of_handle_branch_target_load_optimize2 (void)
> -{
> -  static int warned = 0;
> -
> -  /* Leave this a warning for now so that it is possible to experiment
> -     with running this pass twice.  In 3.6, we should either make this
> -     an error, or use separate dump files.  */
> -  if (flag_branch_target_load_optimize
> -      && flag_branch_target_load_optimize2
> -      && !warned)
> -    {
> -      warning (0, "branch target register load optimization is not intended "
> -                 "to be run twice");
> -
> -      warned = 1;
> -    }
> -
> -  branch_target_load_optimize (epilogue_completed);
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_branch_target_load_optimize2 =
> @@ -1593,12 +1565,32 @@ public:
>        return (optimize > 0 && flag_branch_target_load_optimize2);
>      }
>
> -  unsigned int execute () {
> -    return rest_of_handle_branch_target_load_optimize2 ();
> -  }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_branch_target_load_optimize2
>
> +unsigned int
> +pass_branch_target_load_optimize2::execute (function *)
> +{
> +  static int warned = 0;
> +
> +  /* Leave this a warning for now so that it is possible to experiment
> +     with running this pass twice.  In 3.6, we should either make this
> +     an error, or use separate dump files.  */
> +  if (flag_branch_target_load_optimize
> +      && flag_branch_target_load_optimize2
> +      && !warned)
> +    {
> +      warning (0, "branch target register load optimization is not intended "
> +              "to be run twice");
> +
> +      warned = 1;
> +    }
> +
> +  branch_target_load_optimize (epilogue_completed);
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
> index d5d68bf..d793a70 100644
> --- a/gcc/cfgcleanup.c
> +++ b/gcc/cfgcleanup.c
> @@ -3078,17 +3078,6 @@ cleanup_cfg (int mode)
>    return changed;
>  }
>
> -static unsigned int
> -execute_jump (void)
> -{
> -  delete_trivially_dead_insns (get_insns (), max_reg_num ());
> -  if (dump_file)
> -    dump_flow_info (dump_file, dump_flags);
> -  cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
> -              | (flag_thread_jumps ? CLEANUP_THREADING : 0));
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_jump =
> @@ -3113,10 +3102,21 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_jump (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_jump
>
> +unsigned int
> +pass_jump::execute (function *)
> +{
> +  delete_trivially_dead_insns (get_insns (), max_reg_num ());
> +  if (dump_file)
> +    dump_flow_info (dump_file, dump_flags);
> +  cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0)
> +              | (flag_thread_jumps ? CLEANUP_THREADING : 0));
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> @@ -3125,13 +3125,6 @@ make_pass_jump (gcc::context *ctxt)
>    return new pass_jump (ctxt);
>  }
>
> -static unsigned int
> -execute_jump2 (void)
> -{
> -  cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_jump2 =
> @@ -3156,7 +3149,11 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_jump2 (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
> +      return 0;
> +    }
>
>  }; // class pass_jump2
>
> diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
> index c60703f..f2fd5fc 100644
> --- a/gcc/cfgexpand.c
> +++ b/gcc/cfgexpand.c
> @@ -5530,8 +5530,39 @@ stack_protect_prologue (void)
>     confuse the CFG hooks, so be careful to not manipulate CFG during
>     the expansion.  */
>
> -static unsigned int
> -gimple_expand_cfg (void)
> +namespace {
> +
> +const pass_data pass_data_expand =
> +{
> +  RTL_PASS, /* type */
> +  "expand", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_EXPAND, /* tv_id */
> +  ( PROP_ssa | PROP_gimple_leh | PROP_cfg
> +    | PROP_gimple_lcx
> +    | PROP_gimple_lvec ), /* properties_required */
> +  PROP_rtl, /* properties_provided */
> +  ( PROP_ssa | PROP_trees ), /* properties_destroyed */
> +  ( TODO_verify_ssa | TODO_verify_flow
> +    | TODO_verify_stmts ), /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_expand : public rtl_opt_pass
> +{
> +public:
> +  pass_expand (gcc::context *ctxt)
> +    : rtl_opt_pass (pass_data_expand, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_expand
> +
> +unsigned int
> +pass_expand::execute (function *fun)
>  {
>    basic_block bb, init_block;
>    sbitmap blocks;
> @@ -5554,17 +5585,17 @@ gimple_expand_cfg (void)
>    /* Dominators are not kept up-to-date as we may create new basic-blocks.  */
>    free_dominance_info (CDI_DOMINATORS);
>
> -  rtl_profile_for_bb (ENTRY_BLOCK_PTR_FOR_FN (cfun));
> +  rtl_profile_for_bb (ENTRY_BLOCK_PTR_FOR_FN (fun));
>
>    insn_locations_init ();
>    if (!DECL_IS_BUILTIN (current_function_decl))
>      {
>        /* Eventually, all FEs should explicitly set function_start_locus.  */
> -      if (LOCATION_LOCUS (cfun->function_start_locus) == UNKNOWN_LOCATION)
> -       set_curr_insn_location
> -         (DECL_SOURCE_LOCATION (current_function_decl));
> +      if (LOCATION_LOCUS (fun->function_start_locus) == UNKNOWN_LOCATION)
> +       set_curr_insn_location
> +         (DECL_SOURCE_LOCATION (current_function_decl));
>        else
> -       set_curr_insn_location (cfun->function_start_locus);
> +       set_curr_insn_location (fun->function_start_locus);
>      }
>    else
>      set_curr_insn_location (UNKNOWN_LOCATION);
> @@ -5587,7 +5618,7 @@ gimple_expand_cfg (void)
>    crtl->max_used_stack_slot_alignment = STACK_BOUNDARY;
>    crtl->stack_alignment_estimated = 0;
>    crtl->preferred_stack_boundary = STACK_BOUNDARY;
> -  cfun->cfg->max_jumptable_ents = 0;
> +  fun->cfg->max_jumptable_ents = 0;
>
>    /* Resovle the function section.  Some targets, like ARM EABI rely on knowledge
>       of the function section at exapnsion time to predict distance of calls.  */
> @@ -5606,14 +5637,14 @@ gimple_expand_cfg (void)
>    /* Honor stack protection warnings.  */
>    if (warn_stack_protect)
>      {
> -      if (cfun->calls_alloca)
> +      if (fun->calls_alloca)
>         warning (OPT_Wstack_protector,
>                  "stack protector not protecting local variables: "
> -                 "variable length buffer");
> +                "variable length buffer");
>        if (has_short_buffer && !crtl->stack_protect_guard)
>         warning (OPT_Wstack_protector,
>                  "stack protector not protecting function: "
> -                 "all local arrays are less than %d bytes long",
> +                "all local arrays are less than %d bytes long",
>                  (int) PARAM_VALUE (PARAM_SSP_BUFFER_SIZE));
>      }
>
> @@ -5644,12 +5675,12 @@ gimple_expand_cfg (void)
>        gcc_assert (SA.partition_to_pseudo[i]);
>
>        /* If this decl was marked as living in multiple places, reset
> -         this now to NULL.  */
> +        this now to NULL.  */
>        if (DECL_RTL_IF_SET (var) == pc_rtx)
>         SET_DECL_RTL (var, NULL);
>
>        /* Some RTL parts really want to look at DECL_RTL(x) when x
> -         was a decl marked in REG_ATTR or MEM_ATTR.  We could use
> +        was a decl marked in REG_ATTR or MEM_ATTR.  We could use
>          SET_DECL_RTL here making this available, but that would mean
>          to select one of the potentially many RTLs for one DECL.  Instead
>          of doing that we simply reset the MEM_EXPR of the RTL in question,
> @@ -5718,11 +5749,11 @@ gimple_expand_cfg (void)
>
>    /* Clear EDGE_EXECUTABLE on the entry edge(s).  It is cleaned from the
>       remaining edges later.  */
> -  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
> +  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (fun)->succs)
>      e->flags &= ~EDGE_EXECUTABLE;
>
>    lab_rtx_for_bb = pointer_map_create ();
> -  FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (cfun),
> +  FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun),
>                   next_bb)
>      bb = expand_gimple_basic_block (bb, var_ret_seq != NULL_RTX);
>
> @@ -5740,7 +5771,7 @@ gimple_expand_cfg (void)
>
>    timevar_push (TV_POST_EXPAND);
>    /* We are no longer in SSA form.  */
> -  cfun->gimple_df->in_ssa_p = false;
> +  fun->gimple_df->in_ssa_p = false;
>    if (current_loops)
>      loops_state_clear (LOOP_CLOSED_SSA);
>
> @@ -5762,14 +5793,14 @@ gimple_expand_cfg (void)
>      }
>
>    /* Zap the tree EH table.  */
> -  set_eh_throw_stmt_table (cfun, NULL);
> +  set_eh_throw_stmt_table (fun, NULL);
>
>    /* We need JUMP_LABEL be set in order to redirect jumps, and hence
>       split edges which edge insertions might do.  */
>    rebuild_jump_labels (get_insns ());
>
> -  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
> -                 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
> +  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (fun),
> +                 EXIT_BLOCK_PTR_FOR_FN (fun), next_bb)
>      {
>        edge e;
>        edge_iterator ei;
> @@ -5780,8 +5811,8 @@ gimple_expand_cfg (void)
>               rebuild_jump_labels_chain (e->insns.r);
>               /* Put insns after parm birth, but before
>                  NOTE_INSNS_FUNCTION_BEG.  */
> -             if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
> -                 && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
> +             if (e->src == ENTRY_BLOCK_PTR_FOR_FN (fun)
> +                 && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (fun)))
>                 {
>                   rtx insns = e->insns.r;
>                   e->insns.r = NULL_RTX;
> @@ -5802,8 +5833,8 @@ gimple_expand_cfg (void)
>    /* We're done expanding trees to RTL.  */
>    currently_expanding_to_rtl = 0;
>
> -  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb,
> -                 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
> +  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (fun)->next_bb,
> +                 EXIT_BLOCK_PTR_FOR_FN (fun), next_bb)
>      {
>        edge e;
>        edge_iterator ei;
> @@ -5824,7 +5855,7 @@ gimple_expand_cfg (void)
>         }
>      }
>
> -  blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
> +  blocks = sbitmap_alloc (last_basic_block_for_fn (fun));
>    bitmap_ones (blocks);
>    find_many_sub_basic_blocks (blocks);
>    sbitmap_free (blocks);
> @@ -5840,7 +5871,7 @@ gimple_expand_cfg (void)
>    /* After initial rtl generation, call back to finish generating
>       exception support code.  We need to do this before cleaning up
>       the CFG as the code does not expect dead landing pads.  */
> -  if (cfun->eh->region_tree != NULL)
> +  if (fun->eh->region_tree != NULL)
>      finish_eh_generation ();
>
>    /* Remove unreachable blocks, otherwise we cannot compute dominators
> @@ -5878,14 +5909,14 @@ gimple_expand_cfg (void)
>
>    /* If we're emitting a nested function, make sure its parent gets
>       emitted as well.  Doing otherwise confuses debug info.  */
> -  {
> -    tree parent;
> -    for (parent = DECL_CONTEXT (current_function_decl);
> -        parent != NULL_TREE;
> -        parent = get_containing_scope (parent))
> -      if (TREE_CODE (parent) == FUNCTION_DECL)
> -       TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
> -  }
> +    {
> +      tree parent;
> +      for (parent = DECL_CONTEXT (current_function_decl);
> +          parent != NULL_TREE;
> +          parent = get_containing_scope (parent))
> +       if (TREE_CODE (parent) == FUNCTION_DECL)
> +         TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
> +    }
>
>    /* We are now committed to emitting code for this function.  Do any
>       preparation, such as emitting abstract debug info for the inline
> @@ -5900,15 +5931,15 @@ gimple_expand_cfg (void)
>    naked_return_label = NULL;
>
>    /* After expanding, the tm_restart map is no longer needed.  */
> -  if (cfun->gimple_df->tm_restart)
> +  if (fun->gimple_df->tm_restart)
>      {
> -      htab_delete (cfun->gimple_df->tm_restart);
> -      cfun->gimple_df->tm_restart = NULL;
> +      htab_delete (fun->gimple_df->tm_restart);
> +      fun->gimple_df->tm_restart = NULL;
>      }
>
>    /* Tag the blocks with a depth number so that change_scope can find
>       the common parent easily.  */
> -  set_block_levels (DECL_INITIAL (cfun->decl), 0);
> +  set_block_levels (DECL_INITIAL (fun->decl), 0);
>    default_rtl_profile ();
>
>    timevar_pop (TV_POST_EXPAND);
> @@ -5916,37 +5947,6 @@ gimple_expand_cfg (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_expand =
> -{
> -  RTL_PASS, /* type */
> -  "expand", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_EXPAND, /* tv_id */
> -  ( PROP_ssa | PROP_gimple_leh | PROP_cfg
> -    | PROP_gimple_lcx
> -    | PROP_gimple_lvec ), /* properties_required */
> -  PROP_rtl, /* properties_provided */
> -  ( PROP_ssa | PROP_trees ), /* properties_destroyed */
> -  ( TODO_verify_ssa | TODO_verify_flow
> -    | TODO_verify_stmts ), /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_expand : public rtl_opt_pass
> -{
> -public:
> -  pass_expand (gcc::context *ctxt)
> -    : rtl_opt_pass (pass_data_expand, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  unsigned int execute () { return gimple_expand_cfg (); }
> -
> -}; // class pass_expand
> -
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
> index 0404d08..5dd27d2 100644
> --- a/gcc/cfgrtl.c
> +++ b/gcc/cfgrtl.c
> @@ -442,26 +442,6 @@ free_bb_for_insn (void)
>    return 0;
>  }
>
> -static unsigned int
> -rest_of_pass_free_cfg (void)
> -{
> -#ifdef DELAY_SLOTS
> -  /* The resource.c machinery uses DF but the CFG isn't guaranteed to be
> -     valid at that point so it would be too late to call df_analyze.  */
> -  if (optimize > 0 && flag_delayed_branch)
> -    {
> -      df_note_add_problem ();
> -      df_analyze ();
> -    }
> -#endif
> -
> -  if (crtl->has_bb_partition)
> -    insert_section_boundary_note ();
> -
> -  free_bb_for_insn ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_free_cfg =
> @@ -486,10 +466,30 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_pass_free_cfg (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_free_cfg
>
> +unsigned int
> +pass_free_cfg::execute (function *)
> +{
> +#ifdef DELAY_SLOTS
> +  /* The resource.c machinery uses DF but the CFG isn't guaranteed to be
> +     valid at that point so it would be too late to call df_analyze.  */
> +  if (optimize > 0 && flag_delayed_branch)
> +    {
> +      df_note_add_problem ();
> +      df_analyze ();
> +    }
> +#endif
> +
> +  if (crtl->has_bb_partition)
> +    insert_section_boundary_note ();
> +
> +  free_bb_for_insn ();
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> @@ -3466,27 +3466,6 @@ record_effective_endpoints (void)
>      cfg_layout_function_footer = unlink_insn_chain (cfg_layout_function_footer, get_last_insn ());
>  }
>
> -static unsigned int
> -into_cfg_layout_mode (void)
> -{
> -  cfg_layout_initialize (0);
> -  return 0;
> -}
> -
> -static unsigned int
> -outof_cfg_layout_mode (void)
> -{
> -  basic_block bb;
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
> -      bb->aux = bb->next_bb;
> -
> -  cfg_layout_finalize ();
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_into_cfg_layout_mode =
> @@ -3511,7 +3490,11 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return into_cfg_layout_mode (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      cfg_layout_initialize (0);
> +      return 0;
> +    }
>
>  }; // class pass_into_cfg_layout_mode
>
> @@ -3547,10 +3530,24 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return outof_cfg_layout_mode (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_outof_cfg_layout_mode
>
> +unsigned int
> +pass_outof_cfg_layout_mode::execute (function *fun)
> +{
> +  basic_block bb;
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (fun))
> +      bb->aux = bb->next_bb;
> +
> +  cfg_layout_finalize ();
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c
> index 9c6d46d..6bdc8ca 100644
> --- a/gcc/cgraphbuild.c
> +++ b/gcc/cgraphbuild.c
> @@ -305,8 +305,36 @@ ipa_record_stmt_references (struct cgraph_node *node, gimple stmt)
>  /* Create cgraph edges for function calls.
>     Also look for functions and variables having addresses taken.  */
>
> -static unsigned int
> -build_cgraph_edges (void)
> +namespace {
> +
> +const pass_data pass_data_build_cgraph_edges =
> +{
> +  GIMPLE_PASS, /* type */
> +  "*build_cgraph_edges", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  PROP_cfg, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_build_cgraph_edges : public gimple_opt_pass
> +{
> +public:
> +  pass_build_cgraph_edges (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_build_cgraph_edges, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_build_cgraph_edges
> +
> +unsigned int
> +pass_build_cgraph_edges::execute (function *fun)
>  {
>    basic_block bb;
>    struct cgraph_node *node = cgraph_get_node (current_function_decl);
> @@ -317,7 +345,7 @@ build_cgraph_edges (void)
>
>    /* Create the callgraph edges and record the nodes referenced by the function.
>       body.  */
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>         {
> @@ -370,45 +398,17 @@ build_cgraph_edges (void)
>     }
>
>    /* Look for initializers of constant variables and private statics.  */
> -  FOR_EACH_LOCAL_DECL (cfun, ix, decl)
> +  FOR_EACH_LOCAL_DECL (fun, ix, decl)
>      if (TREE_CODE (decl) == VAR_DECL
>         && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
>         && !DECL_HAS_VALUE_EXPR_P (decl))
>        varpool_finalize_decl (decl);
> -  record_eh_tables (node, cfun);
> +  record_eh_tables (node, fun);
>
>    pointer_set_destroy (visited_nodes);
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_build_cgraph_edges =
> -{
> -  GIMPLE_PASS, /* type */
> -  "*build_cgraph_edges", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  PROP_cfg, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_build_cgraph_edges : public gimple_opt_pass
> -{
> -public:
> -  pass_build_cgraph_edges (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_build_cgraph_edges, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  unsigned int execute () { return build_cgraph_edges (); }
> -
> -}; // class pass_build_cgraph_edges
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -539,7 +539,7 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_rebuild_cgraph_edges (m_ctxt); }
> -  unsigned int execute () { return rebuild_cgraph_edges (); }
> +  virtual unsigned int execute (function *) { return rebuild_cgraph_edges (); }
>
>  }; // class pass_rebuild_cgraph_edges
>
> @@ -552,15 +552,6 @@ make_pass_rebuild_cgraph_edges (gcc::context *ctxt)
>  }
>
>
> -static unsigned int
> -remove_cgraph_callee_edges (void)
> -{
> -  struct cgraph_node *node = cgraph_get_node (current_function_decl);
> -  cgraph_node_remove_callees (node);
> -  ipa_remove_all_references (&node->ref_list);
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_remove_cgraph_callee_edges =
> @@ -588,10 +579,19 @@ public:
>    opt_pass * clone () {
>      return new pass_remove_cgraph_callee_edges (m_ctxt);
>    }
> -  unsigned int execute () { return remove_cgraph_callee_edges (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_remove_cgraph_callee_edges
>
> +unsigned int
> +pass_remove_cgraph_callee_edges::execute (function *)
> +{
> +  struct cgraph_node *node = cgraph_get_node (current_function_decl);
> +  cgraph_node_remove_callees (node);
> +  ipa_remove_all_references (&node->ref_list);
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/combine-stack-adj.c b/gcc/combine-stack-adj.c
> index 37fc7a5..399beb4 100644
> --- a/gcc/combine-stack-adj.c
> +++ b/gcc/combine-stack-adj.c
> @@ -653,7 +653,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return rest_of_handle_stack_adjustments (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_stack_adjustments ();
> +    }
>
>  }; // class pass_stack_adjustments
>
> diff --git a/gcc/combine.c b/gcc/combine.c
> index 1b1e33c..9a78c06 100644
> --- a/gcc/combine.c
> +++ b/gcc/combine.c
> @@ -13909,7 +13909,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return (optimize > 0); }
> -  unsigned int execute () { return rest_of_handle_combine (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_combine ();
> +    }
>
>  }; // class pass_combine
>
> diff --git a/gcc/compare-elim.c b/gcc/compare-elim.c
> index 9cddb7a..7555d48 100644
> --- a/gcc/compare-elim.c
> +++ b/gcc/compare-elim.c
> @@ -676,7 +676,10 @@ public:
>        return flag_compare_elim_after_reload;
>      }
>
> -  unsigned int execute () { return execute_compare_elim_after_reload (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_compare_elim_after_reload ();
> +    }
>
>  }; // class pass_compare_elim_after_reload
>
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index eddc55e..64d1312 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -623,7 +623,7 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_arc_ifcvt (m_ctxt); }
> -  unsigned int execute () { return arc_ifcvt (); }
> +  virtual unsigned int execute (function *) { return arc_ifcvt (); }
>  };
>
>  } // anon namespace
> @@ -660,7 +660,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return arc_predicate_delay_insns (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return arc_predicate_delay_insns ();
> +    }
>  };
>
>  } // anon namespace
> diff --git a/gcc/config/epiphany/mode-switch-use.c b/gcc/config/epiphany/mode-switch-use.c
> index d893934..9617041 100644
> --- a/gcc/config/epiphany/mode-switch-use.c
> +++ b/gcc/config/epiphany/mode-switch-use.c
> @@ -95,7 +95,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return insert_uses (); }
> +  virtual unsigned int execute (function *) { return insert_uses (); }
>
>  }; // class pass_mode_switch_use
>
> diff --git a/gcc/config/epiphany/resolve-sw-modes.c b/gcc/config/epiphany/resolve-sw-modes.c
> index 31928fd..fa8fea5 100644
> --- a/gcc/config/epiphany/resolve-sw-modes.c
> +++ b/gcc/config/epiphany/resolve-sw-modes.c
> @@ -38,6 +38,35 @@ along with GCC; see the file COPYING3.  If not see
>  #include "insn-attr-common.h"
>  #include "tree-pass.h"
>
> +namespace {
> +
> +const pass_data pass_data_resolve_sw_modes =
> +{
> +  RTL_PASS, /* type */
> +  "resolve_sw_modes", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_MODE_SWITCH, /* tv_id */
> +  0, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_df_finish | TODO_verify_rtl_sharing | 0 ), /* todo_flags_finish */
> +};
> +
> +class pass_resolve_sw_modes : public rtl_opt_pass
> +{
> +public:
> +  pass_resolve_sw_modes(gcc::context *ctxt)
> +    : rtl_opt_pass(pass_data_resolve_sw_modes, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return optimize; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_resolve_sw_modes
> +
>  /* Clean-up after mode switching:
>     Check for mode setting insns that have FP_MODE_ROUND_UNKNOWN.
>     If only one rounding mode is required, select that one.
> @@ -45,8 +74,8 @@ along with GCC; see the file COPYING3.  If not see
>     insert new mode setting insns on the edges where the other mode
>     becomes unambigous.  */
>
> -static unsigned
> -resolve_sw_modes (void)
> +unsigned
> +pass_resolve_sw_modes::execute (function *fun)
>  {
>    basic_block bb;
>    rtx insn, src;
> @@ -55,15 +84,15 @@ resolve_sw_modes (void)
>    bool need_commit = false;
>    bool finalize_fp_sets = (MACHINE_FUNCTION (cfun)->unknown_mode_sets == 0);
>
> -  todo.create (last_basic_block_for_fn (cfun));
> -  pushed = sbitmap_alloc (last_basic_block_for_fn (cfun));
> +  todo.create (last_basic_block_for_fn (fun));
> +  pushed = sbitmap_alloc (last_basic_block_for_fn (fun));
>    bitmap_clear (pushed);
>    if (!finalize_fp_sets)
>      {
>        df_note_add_problem ();
>        df_analyze ();
>      }
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      FOR_BB_INSNS (bb, insn)
>        {
>         enum attr_fp_mode selected_mode;
> @@ -155,35 +184,6 @@ resolve_sw_modes (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_resolve_sw_modes =
> -{
> -  RTL_PASS, /* type */
> -  "resolve_sw_modes", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_MODE_SWITCH, /* tv_id */
> -  0, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_df_finish | TODO_verify_rtl_sharing | 0 ), /* todo_flags_finish */
> -};
> -
> -class pass_resolve_sw_modes : public rtl_opt_pass
> -{
> -public:
> -  pass_resolve_sw_modes(gcc::context *ctxt)
> -    : rtl_opt_pass(pass_data_resolve_sw_modes, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize; }
> -  unsigned int execute () { return resolve_sw_modes (); }
> -
> -}; // class pass_resolve_sw_modes
> -
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 8cfdaf6..9f4e04d 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -2541,7 +2541,10 @@ public:
>        return TARGET_AVX && !TARGET_AVX512F && TARGET_VZEROUPPER;
>      }
>
> -  unsigned int execute () { return rest_of_handle_insert_vzeroupper (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_insert_vzeroupper ();
> +    }
>
>  }; // class pass_insert_vzeroupper
>
> diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
> index 6c0b3c2..45256e9 100644
> --- a/gcc/config/mips/mips.c
> +++ b/gcc/config/mips/mips.c
> @@ -16550,7 +16550,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return mips_machine_reorg2 (); }
> +  virtual unsigned int execute (function *) { return mips_machine_reorg2 (); }
>
>  }; // class pass_mips_machine_reorg2
>
> diff --git a/gcc/config/rl78/rl78.c b/gcc/config/rl78/rl78.c
> index 988e1cd..0731491 100644
> --- a/gcc/config/rl78/rl78.c
> +++ b/gcc/config/rl78/rl78.c
> @@ -117,14 +117,6 @@ rl78_init_machine_status (void)
>    return m;
>  }
>
> -/* Runs the devirtualization pass.  */
> -static unsigned int
> -devirt_pass (void)
> -{
> -  rl78_reorg ();
> -  return 0;
> -}
> -
>  /* This pass converts virtual instructions using virtual registers, to
>     real instructions using real registers.  Rather than run it as
>     reorg, we reschedule it before vartrack to help with debugging.  */
> @@ -153,7 +145,12 @@ public:
>    }
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return devirt_pass (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      rl78_reorg ();
> +      return 0;
> +    }
> +
>  };
>
>  } // anon namespace
> @@ -235,7 +232,7 @@ public:
>    }
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return move_elim_pass (); }
> +  virtual unsigned int execute (function *) { return move_elim_pass (); }
>  };
>
>  } // anon namespace
> diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
> index 77e163f..cc8f32e 100644
> --- a/gcc/config/s390/s390.c
> +++ b/gcc/config/s390/s390.c
> @@ -8631,33 +8631,6 @@ s390_restore_gprs_from_fprs (void)
>  /* A pass run immediately before shrink-wrapping and prologue and epilogue
>     generation.  */
>
> -static unsigned int
> -s390_early_mach (void)
> -{
> -  rtx insn;
> -
> -  /* Try to get rid of the FPR clobbers.  */
> -  s390_optimize_nonescaping_tx ();
> -
> -  /* Re-compute register info.  */
> -  s390_register_info ();
> -
> -  /* If we're using a base register, ensure that it is always valid for
> -     the first non-prologue instruction.  */
> -  if (cfun->machine->base_reg)
> -    emit_insn_at_entry (gen_main_pool (cfun->machine->base_reg));
> -
> -  /* Annotate all constant pool references to let the scheduler know
> -     they implicitly use the base register.  */
> -  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
> -    if (INSN_P (insn))
> -      {
> -       annotate_constant_pool_refs (&PATTERN (insn));
> -       df_insn_rescan (insn);
> -      }
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_s390_early_mach =
> @@ -8683,10 +8656,37 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return s390_early_mach (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_s390_early_mach
>
> +unsigned int
> +pass_s390_early_mach::execute (function *fun)
> +{
> +  rtx insn;
> +
> +  /* Try to get rid of the FPR clobbers.  */
> +  s390_optimize_nonescaping_tx ();
> +
> +  /* Re-compute register info.  */
> +  s390_register_info ();
> +
> +  /* If we're using a base register, ensure that it is always valid for
> +     the first non-prologue instruction.  */
> +  if (fun->machine->base_reg)
> +    emit_insn_at_entry (gen_main_pool (fun->machine->base_reg));
> +
> +  /* Annotate all constant pool references to let the scheduler know
> +     they implicitly use the base register.  */
> +  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
> +    if (INSN_P (insn))
> +      {
> +       annotate_constant_pool_refs (&PATTERN (insn));
> +       df_insn_rescan (insn);
> +      }
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  /* Expand the prologue into a bunch of separate insns.  */
> diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
> index 5578cb8..62354ee 100644
> --- a/gcc/config/sparc/sparc.c
> +++ b/gcc/config/sparc/sparc.c
> @@ -1145,7 +1145,10 @@ public:
>        return sparc_fix_at697f != 0 || sparc_fix_ut699 != 0;
>      }
>
> -  unsigned int execute () { return sparc_do_work_around_errata (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return sparc_do_work_around_errata ();
> +    }
>
>  }; // class pass_work_around_errata
>
> diff --git a/gcc/cprop.c b/gcc/cprop.c
> index 9802b8a..d29b6f6 100644
> --- a/gcc/cprop.c
> +++ b/gcc/cprop.c
> @@ -1943,7 +1943,7 @@ public:
>         && dbg_cnt (cprop);
>      }
>
> -  unsigned int execute () { return execute_rtl_cprop (); }
> +  virtual unsigned int execute (function *) { return execute_rtl_cprop (); }
>
>  }; // class pass_rtl_cprop
>
> diff --git a/gcc/cse.c b/gcc/cse.c
> index 60ec9a9..40bc2be 100644
> --- a/gcc/cse.c
> +++ b/gcc/cse.c
> @@ -7510,7 +7510,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return optimize > 0; }
> -  unsigned int execute () { return rest_of_handle_cse (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
>
>  }; // class pass_cse
>
> @@ -7587,7 +7587,7 @@ public:
>        return optimize > 0 && flag_rerun_cse_after_loop;
>      }
>
> -  unsigned int execute () { return rest_of_handle_cse2 (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
>
>  }; // class pass_cse2
>
> @@ -7662,9 +7662,10 @@ public:
>        return optimize > 0 && flag_rerun_cse_after_global_opts;
>      }
>
> -  unsigned int execute () {
> -    return rest_of_handle_cse_after_global_opts ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_cse_after_global_opts ();
> +    }
>
>  }; // class pass_cse_after_global_opts
>
> diff --git a/gcc/dce.c b/gcc/dce.c
> index 1d290e3..344e31a 100644
> --- a/gcc/dce.c
> +++ b/gcc/dce.c
> @@ -808,7 +808,10 @@ public:
>        return optimize > 1 && flag_dce && dbg_cnt (dce_ud);
>      }
>
> -  unsigned int execute () { return rest_of_handle_ud_dce (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_ud_dce ();
> +    }
>
>  }; // class pass_ud_rtl_dce
>
> @@ -1237,7 +1240,10 @@ public:
>        return optimize > 0 && flag_dce && dbg_cnt (dce_fast);
>      }
>
> -  unsigned int execute () { return rest_of_handle_fast_dce (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_fast_dce ();
> +    }
>
>  }; // class pass_fast_rtl_dce
>
> diff --git a/gcc/df-core.c b/gcc/df-core.c
> index bd3cb31..9fdf6010 100644
> --- a/gcc/df-core.c
> +++ b/gcc/df-core.c
> @@ -765,7 +765,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return optimize > 0; }
> -  unsigned int execute () { return rest_of_handle_df_initialize (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_df_initialize ();
> +    }
>
>  }; // class pass_df_initialize_opt
>
> @@ -803,7 +806,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return optimize == 0; }
> -  unsigned int execute () { return rest_of_handle_df_initialize (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_df_initialize ();
> +    }
>
>  }; // class pass_df_initialize_no_opt
>
> @@ -867,7 +873,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_df_finish (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_df_finish ();
> +    }
>
>  }; // class pass_df_finish
>
> diff --git a/gcc/dse.c b/gcc/dse.c
> index a80c025..88b8c37 100644
> --- a/gcc/dse.c
> +++ b/gcc/dse.c
> @@ -3736,7 +3736,7 @@ public:
>        return optimize > 0 && flag_dse && dbg_cnt (dse1);
>      }
>
> -  unsigned int execute () { return rest_of_handle_dse (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_dse (); }
>
>  }; // class pass_rtl_dse1
>
> @@ -3777,7 +3777,7 @@ public:
>        return optimize > 0 && flag_dse && dbg_cnt (dse2);
>      }
>
> -  unsigned int execute () { return rest_of_handle_dse (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_dse (); }
>
>  }; // class pass_rtl_dse2
>
> diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c
> index 3749277..4180890 100644
> --- a/gcc/dwarf2cfi.c
> +++ b/gcc/dwarf2cfi.c
> @@ -3402,7 +3402,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return execute_dwarf2_frame (); }
> +  virtual unsigned int execute (function *) { return execute_dwarf2_frame (); }
>
>  }; // class pass_dwarf2_frame
>
> diff --git a/gcc/except.c b/gcc/except.c
> index 2015809..5b33c9c 100644
> --- a/gcc/except.c
> +++ b/gcc/except.c
> @@ -2025,7 +2025,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return set_nothrow_function_flags (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return set_nothrow_function_flags ();
> +    }
>
>  }; // class pass_set_nothrow_function_flags
>
> @@ -2645,7 +2648,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return convert_to_eh_region_ranges (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return convert_to_eh_region_ranges ();
> +    }
>
>  }; // class pass_convert_to_eh_region_ranges
>
> diff --git a/gcc/final.c b/gcc/final.c
> index 91b8ccc..542886f 100644
> --- a/gcc/final.c
> +++ b/gcc/final.c
> @@ -869,7 +869,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return compute_alignments (); }
> +  virtual unsigned int execute (function *) { return compute_alignments (); }
>
>  }; // class pass_compute_alignments
>
> @@ -4497,7 +4497,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_final (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_final (); }
>
>  }; // class pass_final
>
> @@ -4542,7 +4542,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_shorten_branches (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_shorten_branches ();
> +    }
>
>  }; // class pass_shorten_branches
>
> @@ -4705,7 +4708,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_clean_state (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_clean_state ();
> +    }
>
>  }; // class pass_clean_state
>
> diff --git a/gcc/function.c b/gcc/function.c
> index cf07255..383a52a 100644
> --- a/gcc/function.c
> +++ b/gcc/function.c
> @@ -1967,7 +1967,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return instantiate_virtual_regs (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return instantiate_virtual_regs ();
> +    }
>
>  }; // class pass_instantiate_virtual_regs
>
> @@ -6965,7 +6968,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_check_leaf_regs (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_check_leaf_regs ();
> +    }
>
>  }; // class pass_leaf_regs
>
> @@ -7025,9 +7031,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () {
> -    return rest_of_handle_thread_prologue_and_epilogue ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_thread_prologue_and_epilogue ();
> +    }
>
>  }; // class pass_thread_prologue_and_epilogue
>
> @@ -7184,8 +7191,36 @@ match_asm_constraints_1 (rtx insn, rtx *p_sets, int noutputs)
>      df_insn_rescan (insn);
>  }
>
> -static unsigned
> -rest_of_match_asm_constraints (void)
> +namespace {
> +
> +const pass_data pass_data_match_asm_constraints =
> +{
> +  RTL_PASS, /* type */
> +  "asmcons", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  0, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_match_asm_constraints : public rtl_opt_pass
> +{
> +public:
> +  pass_match_asm_constraints (gcc::context *ctxt)
> +    : rtl_opt_pass (pass_data_match_asm_constraints, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_match_asm_constraints
> +
> +unsigned
> +pass_match_asm_constraints::execute (function *fun)
>  {
>    basic_block bb;
>    rtx insn, pat, *p_sets;
> @@ -7195,7 +7230,7 @@ rest_of_match_asm_constraints (void)
>      return 0;
>
>    df_set_flags (DF_DEFER_INSN_RESCAN);
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        FOR_BB_INSNS (bb, insn)
>         {
> @@ -7219,34 +7254,6 @@ rest_of_match_asm_constraints (void)
>    return TODO_df_finish;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_match_asm_constraints =
> -{
> -  RTL_PASS, /* type */
> -  "asmcons", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  0, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_match_asm_constraints : public rtl_opt_pass
> -{
> -public:
> -  pass_match_asm_constraints (gcc::context *ctxt)
> -    : rtl_opt_pass (pass_data_match_asm_constraints, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_match_asm_constraints (); }
> -
> -}; // class pass_match_asm_constraints
> -
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/fwprop.c b/gcc/fwprop.c
> index c6fa4ee..6960d62 100644
> --- a/gcc/fwprop.c
> +++ b/gcc/fwprop.c
> @@ -1509,7 +1509,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_fwprop (); }
> -  unsigned int execute () { return fwprop (); }
> +  virtual unsigned int execute (function *) { return fwprop (); }
>
>  }; // class pass_rtl_fwprop
>
> @@ -1574,7 +1574,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_fwprop (); }
> -  unsigned int execute () { return fwprop_addr (); }
> +  virtual unsigned int execute (function *) { return fwprop_addr (); }
>
>  }; // class pass_rtl_fwprop_addr
>
> diff --git a/gcc/gcse.c b/gcc/gcse.c
> index 942ea64..d88b275 100644
> --- a/gcc/gcse.c
> +++ b/gcc/gcse.c
> @@ -4209,7 +4209,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return execute_rtl_pre (); }
> +  virtual unsigned int execute (function *) { return execute_rtl_pre (); }
>
>  }; // class pass_rtl_pre
>
> @@ -4261,7 +4261,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return execute_rtl_hoist (); }
> +  virtual unsigned int execute (function *) { return execute_rtl_hoist (); }
>
>  }; // class pass_rtl_hoist
>
> diff --git a/gcc/gimple-low.c b/gcc/gimple-low.c
> index 66ea322..eff4b4f 100644
> --- a/gcc/gimple-low.c
> +++ b/gcc/gimple-low.c
> @@ -180,7 +180,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return lower_function_body (); }
> +  virtual unsigned int execute (function *) { return lower_function_body (); }
>
>  }; // class pass_lower_cf
>
> diff --git a/gcc/gimple-ssa-isolate-paths.c b/gcc/gimple-ssa-isolate-paths.c
> index ab6185c..b01417d 100644
> --- a/gcc/gimple-ssa-isolate-paths.c
> +++ b/gcc/gimple-ssa-isolate-paths.c
> @@ -446,7 +446,10 @@ public:
>               || flag_isolate_erroneous_paths_attribute != 0);
>      }
>
> -  unsigned int execute () { return gimple_ssa_isolate_erroneous_paths (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return gimple_ssa_isolate_erroneous_paths ();
> +    }
>
>  }; // class pass_isolate_erroneous_paths
>  }
> diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
> index a8596e0..ff55d0e 100644
> --- a/gcc/gimple-ssa-strength-reduction.c
> +++ b/gcc/gimple-ssa-strength-reduction.c
> @@ -3594,8 +3594,37 @@ analyze_candidates_and_replace (void)
>      }
>  }
>
> -static unsigned
> -execute_strength_reduction (void)
> +namespace {
> +
> +const pass_data pass_data_strength_reduction =
> +{
> +  GIMPLE_PASS, /* type */
> +  "slsr", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_GIMPLE_SLSR, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_strength_reduction : public gimple_opt_pass
> +{
> +public:
> +  pass_strength_reduction (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_strength_reduction, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return flag_tree_slsr; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_strength_reduction
> +
> +unsigned
> +pass_strength_reduction::execute (function *fun)
>  {
>    /* Create the obstack where candidates will reside.  */
>    gcc_obstack_init (&cand_obstack);
> @@ -3622,7 +3651,7 @@ execute_strength_reduction (void)
>    /* Walk the CFG in predominator order looking for strength reduction
>       candidates.  */
>    find_candidates_dom_walker (CDI_DOMINATORS)
> -    .walk (cfun->cfg->x_entry_block_ptr);
> +    .walk (fun->cfg->x_entry_block_ptr);
>
>    if (dump_file && (dump_flags & TDF_DETAILS))
>      {
> @@ -3646,35 +3675,6 @@ execute_strength_reduction (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_strength_reduction =
> -{
> -  GIMPLE_PASS, /* type */
> -  "slsr", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_GIMPLE_SLSR, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_strength_reduction : public gimple_opt_pass
> -{
> -public:
> -  pass_strength_reduction (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_strength_reduction, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_slsr; }
> -  unsigned int execute () { return execute_strength_reduction (); }
> -
> -}; // class pass_strength_reduction
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/graphite.c b/gcc/graphite.c
> index 68c9390..2e1f439 100644
> --- a/gcc/graphite.c
> +++ b/gcc/graphite.c
> @@ -411,7 +411,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_graphite_transforms (); }
> -  unsigned int execute () { return graphite_transforms (); }
> +  virtual unsigned int execute (function *) { return graphite_transforms (); }
>
>  }; // class pass_graphite_transforms
>
> diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
> index 657b585..e8a9fec 100644
> --- a/gcc/ifcvt.c
> +++ b/gcc/ifcvt.c
> @@ -4560,7 +4560,10 @@ public:
>        return (optimize > 0) && dbg_cnt (if_conversion);
>      }
>
> -  unsigned int execute () { return rest_of_handle_if_conversion (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_if_conversion ();
> +    }
>
>  }; // class pass_rtl_ifcvt
>
> @@ -4575,12 +4578,6 @@ make_pass_rtl_ifcvt (gcc::context *ctxt)
>
>  /* Rerun if-conversion, as combine may have simplified things enough
>     to now meet sequence length restrictions.  */
> -static unsigned int
> -rest_of_handle_if_after_combine (void)
> -{
> -  if_convert (true);
> -  return 0;
> -}
>
>  namespace {
>
> @@ -4612,7 +4609,11 @@ public:
>         && dbg_cnt (if_after_combine);
>      }
>
> -  unsigned int execute () { return rest_of_handle_if_after_combine (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      if_convert (true);
> +      return 0;
> +    }
>
>  }; // class pass_if_after_combine
>
> @@ -4625,14 +4626,6 @@ make_pass_if_after_combine (gcc::context *ctxt)
>  }
>
>
> -static unsigned int
> -rest_of_handle_if_after_reload (void)
> -{
> -  if_convert (true);
> -  return 0;
> -}
> -
> -
>  namespace {
>
>  const pass_data pass_data_if_after_reload =
> @@ -4663,7 +4656,11 @@ public:
>         && dbg_cnt (if_after_reload);
>      }
>
> -  unsigned int execute () { return rest_of_handle_if_after_reload (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      if_convert (true);
> +      return 0;
> +    }
>
>  }; // class pass_if_after_reload
>
> diff --git a/gcc/init-regs.c b/gcc/init-regs.c
> index 2025b77..59c5bc9 100644
> --- a/gcc/init-regs.c
> +++ b/gcc/init-regs.c
> @@ -125,13 +125,6 @@ initialize_uninitialized_regs (void)
>    BITMAP_FREE (already_genned);
>  }
>
> -static unsigned int
> -rest_of_handle_initialize_regs (void)
> -{
> -  initialize_uninitialized_regs ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_initialize_regs =
> @@ -157,7 +150,11 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return optimize > 0; }
> -  unsigned int execute () { return rest_of_handle_initialize_regs (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      initialize_uninitialized_regs ();
> +      return 0;
> +    }
>
>  }; // class pass_initialize_regs
>
> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
> index ee48fc0..479963c 100644
> --- a/gcc/ipa-cp.c
> +++ b/gcc/ipa-cp.c
> @@ -3804,7 +3804,7 @@ public:
>        return flag_ipa_cp && optimize;
>      }
>
> -  unsigned int execute () { return ipcp_driver (); }
> +  virtual unsigned int execute (function *) { return ipcp_driver (); }
>
>  }; // class pass_ipa_cp
>
> diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
> index 3bc6815..6c5e566 100644
> --- a/gcc/ipa-devirt.c
> +++ b/gcc/ipa-devirt.c
> @@ -1951,7 +1951,7 @@ public:
>               && optimize);
>      }
>
> -  unsigned int execute () { return ipa_devirt (); }
> +  virtual unsigned int execute (function *) { return ipa_devirt (); }
>
>  }; // class pass_ipa_devirt
>
> diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
> index 8783caa..c471e0c 100644
> --- a/gcc/ipa-inline-analysis.c
> +++ b/gcc/ipa-inline-analysis.c
> @@ -2938,9 +2938,10 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_inline_parameters (m_ctxt); }
> -  unsigned int execute () {
> -    return compute_inline_parameters_for_current ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      return compute_inline_parameters_for_current ();
> +    }
>
>  }; // class pass_inline_parameters
>
> diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
> index da02afc..83a836a 100644
> --- a/gcc/ipa-inline.c
> +++ b/gcc/ipa-inline.c
> @@ -2231,8 +2231,37 @@ early_inline_small_functions (struct cgraph_node *node)
>  /* Do inlining of small functions.  Doing so early helps profiling and other
>     passes to be somewhat more effective and avoids some code duplication in
>     later real inlining pass for testcases with very many function calls.  */
> -static unsigned int
> -early_inliner (void)
> +
> +namespace {
> +
> +const pass_data pass_data_early_inline =
> +{
> +  GIMPLE_PASS, /* type */
> +  "einline", /* name */
> +  OPTGROUP_INLINE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_EARLY_INLINING, /* tv_id */
> +  PROP_ssa, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_early_inline : public gimple_opt_pass
> +{
> +public:
> +  pass_early_inline (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_early_inline, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_early_inline
> +
> +unsigned int
> +pass_early_inline::execute (function *fun)
>  {
>    struct cgraph_node *node = cgraph_get_node (current_function_decl);
>    struct cgraph_edge *edge;
> @@ -2328,39 +2357,11 @@ early_inliner (void)
>        timevar_pop (TV_INTEGRATION);
>      }
>
> -  cfun->always_inline_functions_inlined = true;
> +  fun->always_inline_functions_inlined = true;
>
>    return todo;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_early_inline =
> -{
> -  GIMPLE_PASS, /* type */
> -  "einline", /* name */
> -  OPTGROUP_INLINE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_EARLY_INLINING, /* tv_id */
> -  PROP_ssa, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_early_inline : public gimple_opt_pass
> -{
> -public:
> -  pass_early_inline (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_early_inline, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  unsigned int execute () { return early_inliner (); }
> -
> -}; // class pass_early_inline
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -2402,7 +2403,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return ipa_inline (); }
> +  virtual unsigned int execute (function *) { return ipa_inline (); }
>
>  }; // class pass_ipa_inline
>
> diff --git a/gcc/ipa-profile.c b/gcc/ipa-profile.c
> index 7b58716..71bd61b 100644
> --- a/gcc/ipa-profile.c
> +++ b/gcc/ipa-profile.c
> @@ -745,7 +745,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_ipa_profile; }
> -  unsigned int execute () { return ipa_profile (); }
> +  virtual unsigned int execute (function *) { return ipa_profile (); }
>
>  }; // class pass_ipa_profile
>
> diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
> index eab7633..0ebfe5d 100644
> --- a/gcc/ipa-pure-const.c
> +++ b/gcc/ipa-pure-const.c
> @@ -1542,7 +1542,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_pure_const (); }
> -  unsigned int execute () { return propagate (); }
> +  virtual unsigned int execute (function *) { return propagate (); }
>
>  }; // class pass_ipa_pure_const
>
> @@ -1581,8 +1581,38 @@ skip_function_for_local_pure_const (struct cgraph_node *node)
>     ipa_pure_const.   This pass is effective when executed together with
>     other optimization passes in early optimization pass queue.  */
>
> -static unsigned int
> -local_pure_const (void)
> +namespace {
> +
> +const pass_data pass_data_local_pure_const =
> +{
> +  GIMPLE_PASS, /* type */
> +  "local-pure-const", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_IPA_PURE_CONST, /* tv_id */
> +  0, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_local_pure_const : public gimple_opt_pass
> +{
> +public:
> +  pass_local_pure_const (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_local_pure_const, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_local_pure_const (m_ctxt); }
> +  virtual bool gate (function *) { return gate_pure_const (); }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_local_pure_const
> +
> +unsigned int
> +pass_local_pure_const::execute (function *fun)
>  {
>    bool changed = false;
>    funct_state l;
> @@ -1600,17 +1630,17 @@ local_pure_const (void)
>
>    /* Do NORETURN discovery.  */
>    if (!skip && !TREE_THIS_VOLATILE (current_function_decl)
> -      && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) == 0)
> +      && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) == 0)
>      {
> -      warn_function_noreturn (cfun->decl);
> +      warn_function_noreturn (fun->decl);
>        if (dump_file)
> -        fprintf (dump_file, "Function found to be noreturn: %s\n",
> -                current_function_name ());
> +       fprintf (dump_file, "Function found to be noreturn: %s\n",
> +                current_function_name ());
>
>        /* Update declaration and reduce profile to executed once.  */
>        TREE_THIS_VOLATILE (current_function_decl) = 1;
>        if (node->frequency > NODE_FREQUENCY_EXECUTED_ONCE)
> -        node->frequency = NODE_FREQUENCY_EXECUTED_ONCE;
> +       node->frequency = NODE_FREQUENCY_EXECUTED_ONCE;
>
>        changed = true;
>      }
> @@ -1691,36 +1721,6 @@ local_pure_const (void)
>      return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_local_pure_const =
> -{
> -  GIMPLE_PASS, /* type */
> -  "local-pure-const", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_IPA_PURE_CONST, /* tv_id */
> -  0, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_local_pure_const : public gimple_opt_pass
> -{
> -public:
> -  pass_local_pure_const (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_local_pure_const, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_local_pure_const (m_ctxt); }
> -  virtual bool gate (function *) { return gate_pure_const (); }
> -  unsigned int execute () { return local_pure_const (); }
> -
> -}; // class pass_local_pure_const
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -1731,15 +1731,6 @@ make_pass_local_pure_const (gcc::context *ctxt)
>
>  /* Emit noreturn warnings.  */
>
> -static unsigned int
> -execute_warn_function_noreturn (void)
> -{
> -  if (!TREE_THIS_VOLATILE (current_function_decl)
> -      && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) == 0)
> -    warn_function_noreturn (current_function_decl);
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_warn_function_noreturn =
> @@ -1765,7 +1756,13 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return warn_suggest_attribute_noreturn; }
> -  unsigned int execute () { return execute_warn_function_noreturn (); }
> +  virtual unsigned int execute (function *fun)
> +    {
> +      if (!TREE_THIS_VOLATILE (current_function_decl)
> +         && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) == 0)
> +       warn_function_noreturn (current_function_decl);
> +      return 0;
> +    }
>
>  }; // class pass_warn_function_noreturn
>
> diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
> index 51a57ac..dc1169d 100644
> --- a/gcc/ipa-reference.c
> +++ b/gcc/ipa-reference.c
> @@ -1190,7 +1190,7 @@ public:
>               && !seen_error ());
>      }
>
> -  unsigned int execute () { return propagate (); }
> +  virtual unsigned int execute (function *) { return propagate (); }
>
>  }; // class pass_ipa_reference
>
> diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
> index 187dc98..eefa195 100644
> --- a/gcc/ipa-split.c
> +++ b/gcc/ipa-split.c
> @@ -1671,7 +1671,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return execute_split_functions (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_split_functions ();
> +    }
>
>  }; // class pass_split_functions
>
> @@ -1728,7 +1731,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return execute_feedback_split_functions (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_feedback_split_functions ();
> +    }
>
>  }; // class pass_feedback_split_functions
>
> diff --git a/gcc/ipa.c b/gcc/ipa.c
> index 7af2584..e6e59fd 100644
> --- a/gcc/ipa.c
> +++ b/gcc/ipa.c
> @@ -1182,12 +1182,6 @@ function_and_variable_visibility (bool whole_program)
>  /* Local function pass handling visibilities.  This happens before LTO streaming
>     so in particular -fwhole-program should be ignored at this level.  */
>
> -static unsigned int
> -local_function_and_variable_visibility (void)
> -{
> -  return function_and_variable_visibility (flag_whole_program && !flag_lto);
> -}
> -
>  namespace {
>
>  const pass_data pass_data_ipa_function_and_variable_visibility =
> @@ -1213,9 +1207,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () {
> -    return local_function_and_variable_visibility ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      return function_and_variable_visibility (flag_whole_program && !flag_lto);
> +    }
>
>  }; // class pass_ipa_function_and_variable_visibility
>
> @@ -1229,13 +1224,6 @@ make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt)
>
>  /* Free inline summary.  */
>
> -static unsigned
> -free_inline_summary (void)
> -{
> -  inline_free_summary ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_ipa_free_inline_summary =
> @@ -1260,7 +1248,11 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return free_inline_summary (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      inline_free_summary ();
> +      return 0;
> +    }
>
>  }; // class pass_ipa_free_inline_summary
>
> @@ -1322,9 +1314,10 @@ public:
>        /* Do not re-run on ltrans stage.  */
>        return !flag_ltrans;
>      }
> -  unsigned int execute () {
> -    return whole_program_function_and_variable_visibility ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      return whole_program_function_and_variable_visibility ();
> +    }
>
>  }; // class pass_ipa_whole_program_visibility
>
> @@ -1642,7 +1635,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return ipa_cdtor_merge (); }
> +  virtual unsigned int execute (function *) { return ipa_cdtor_merge (); }
>
>  }; // class pass_ipa_cdtor_merge
>
> diff --git a/gcc/ira.c b/gcc/ira.c
> index da0f453..d973001 100644
> --- a/gcc/ira.c
> +++ b/gcc/ira.c
> @@ -5548,12 +5548,6 @@ do_reload (void)
>  }
>
>  /* Run the integrated register allocator.  */
> -static unsigned int
> -rest_of_handle_ira (void)
> -{
> -  ira (dump_file);
> -  return 0;
> -}
>
>  namespace {
>
> @@ -5579,7 +5573,11 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_ira (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      ira (dump_file);
> +      return 0;
> +    }
>
>  }; // class pass_ira
>
> @@ -5591,13 +5589,6 @@ make_pass_ira (gcc::context *ctxt)
>    return new pass_ira (ctxt);
>  }
>
> -static unsigned int
> -rest_of_handle_reload (void)
> -{
> -  do_reload ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_reload =
> @@ -5622,7 +5613,11 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_reload (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      do_reload ();
> +      return 0;
> +    }
>
>  }; // class pass_reload
>
> diff --git a/gcc/jump.c b/gcc/jump.c
> index 7361101..cdea8d5 100644
> --- a/gcc/jump.c
> +++ b/gcc/jump.c
> @@ -163,7 +163,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return cleanup_barriers (); }
> +  virtual unsigned int execute (function *) { return cleanup_barriers (); }
>
>  }; // class pass_cleanup_barriers
>
> diff --git a/gcc/loop-init.c b/gcc/loop-init.c
> index 6da29d3..90453f6 100644
> --- a/gcc/loop-init.c
> +++ b/gcc/loop-init.c
> @@ -390,7 +390,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rtl_loop_init (); }
> +  virtual unsigned int execute (function *) { return rtl_loop_init (); }
>
>  }; // class pass_rtl_loop_init
>
> @@ -405,24 +405,6 @@ make_pass_rtl_loop_init (gcc::context *ctxt)
>
>  /* Finalization of the RTL loop passes.  */
>
> -static unsigned int
> -rtl_loop_done (void)
> -{
> -  /* No longer preserve loops, remove them now.  */
> -  cfun->curr_properties &= ~PROP_loops;
> -  loop_optimizer_finalize ();
> -  free_dominance_info (CDI_DOMINATORS);
> -
> -  cleanup_cfg (0);
> -  if (dump_file)
> -    {
> -      dump_reg_info (dump_file);
> -      dump_flow_info (dump_file, dump_flags);
> -    }
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_rtl_loop_done =
> @@ -447,10 +429,28 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rtl_loop_done (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_rtl_loop_done
>
> +unsigned int
> +pass_rtl_loop_done::execute (function *fun)
> +{
> +  /* No longer preserve loops, remove them now.  */
> +  fun->curr_properties &= ~PROP_loops;
> +  loop_optimizer_finalize ();
> +  free_dominance_info (CDI_DOMINATORS);
> +
> +  cleanup_cfg (0);
> +  if (dump_file)
> +    {
> +      dump_reg_info (dump_file);
> +      dump_flow_info (dump_file, dump_flags);
> +    }
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> @@ -461,13 +461,6 @@ make_pass_rtl_loop_done (gcc::context *ctxt)
>
>
>  /* Loop invariant code motion.  */
> -static unsigned int
> -rtl_move_loop_invariants (void)
> -{
> -  if (number_of_loops (cfun) > 1)
> -    move_loop_invariants ();
> -  return 0;
> -}
>
>  namespace {
>
> @@ -495,7 +488,12 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_move_loop_invariants; }
> -  unsigned int execute () { return rtl_move_loop_invariants (); }
> +  virtual unsigned int execute (function *fun)
> +    {
> +      if (number_of_loops (fun) > 1)
> +       move_loop_invariants ();
> +      return 0;
> +    }
>
>  }; // class pass_rtl_move_loop_invariants
>
> @@ -508,14 +506,6 @@ make_pass_rtl_move_loop_invariants (gcc::context *ctxt)
>  }
>
>
> -static unsigned int
> -rtl_unswitch (void)
> -{
> -  if (number_of_loops (cfun) > 1)
> -    unswitch_loops ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_rtl_unswitch =
> @@ -541,7 +531,12 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_unswitch_loops; }
> -  unsigned int execute () { return rtl_unswitch (); }
> +  virtual unsigned int execute (function *fun)
> +    {
> +      if (number_of_loops (fun) > 1)
> +       unswitch_loops ();
> +      return 0;
> +    }
>
>  }; // class pass_rtl_unswitch
>
> @@ -554,27 +549,6 @@ make_pass_rtl_unswitch (gcc::context *ctxt)
>  }
>
>
> -static unsigned int
> -rtl_unroll_and_peel_loops (void)
> -{
> -  if (number_of_loops (cfun) > 1)
> -    {
> -      int flags = 0;
> -      if (dump_file)
> -       df_dump (dump_file);
> -
> -      if (flag_peel_loops)
> -       flags |= UAP_PEEL;
> -      if (flag_unroll_loops)
> -       flags |= UAP_UNROLL;
> -      if (flag_unroll_all_loops)
> -       flags |= UAP_UNROLL_ALL;
> -
> -      unroll_and_peel_loops (flags);
> -    }
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_rtl_unroll_and_peel_loops =
> @@ -604,10 +578,31 @@ public:
>        return (flag_peel_loops || flag_unroll_loops || flag_unroll_all_loops);
>      }
>
> -  unsigned int execute () { return rtl_unroll_and_peel_loops (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_rtl_unroll_and_peel_loops
>
> +unsigned int
> +pass_rtl_unroll_and_peel_loops::execute (function *fun)
> +{
> +  if (number_of_loops (fun) > 1)
> +    {
> +      int flags = 0;
> +      if (dump_file)
> +       df_dump (dump_file);
> +
> +      if (flag_peel_loops)
> +       flags |= UAP_PEEL;
> +      if (flag_unroll_loops)
> +       flags |= UAP_UNROLL;
> +      if (flag_unroll_all_loops)
> +       flags |= UAP_UNROLL_ALL;
> +
> +      unroll_and_peel_loops (flags);
> +    }
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> @@ -617,16 +612,6 @@ make_pass_rtl_unroll_and_peel_loops (gcc::context *ctxt)
>  }
>
>
> -static unsigned int
> -rtl_doloop (void)
> -{
> -#ifdef HAVE_doloop_end
> -  if (number_of_loops (cfun) > 1)
> -    doloop_optimize_loops ();
> -#endif
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_rtl_doloop =
> @@ -652,7 +637,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return rtl_doloop (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_rtl_doloop
>
> @@ -666,6 +651,16 @@ pass_rtl_doloop::gate (function *)
>  #endif
>  }
>
> +unsigned int
> +pass_rtl_doloop::execute (function *fun ATTRIBUTE_UNUSED)
> +{
> +#ifdef HAVE_doloop_end
> +  if (number_of_loops (fun) > 1)
> +    doloop_optimize_loops ();
> +#endif
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c
> index 89d9763..bdad2a6 100644
> --- a/gcc/lower-subreg.c
> +++ b/gcc/lower-subreg.c
> @@ -1689,22 +1689,6 @@ decompose_multiword_subregs (bool decompose_copies)
>
>  /* Implement first lower subreg pass.  */
>
> -static unsigned int
> -rest_of_handle_lower_subreg (void)
> -{
> -  decompose_multiword_subregs (false);
> -  return 0;
> -}
> -
> -/* Implement second lower subreg pass.  */
> -
> -static unsigned int
> -rest_of_handle_lower_subreg2 (void)
> -{
> -  decompose_multiword_subregs (true);
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_lower_subreg =
> @@ -1730,7 +1714,11 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_split_wide_types != 0; }
> -  unsigned int execute () { return rest_of_handle_lower_subreg (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      decompose_multiword_subregs (false);
> +      return 0;
> +    }
>
>  }; // class pass_lower_subreg
>
> @@ -1742,6 +1730,8 @@ make_pass_lower_subreg (gcc::context *ctxt)
>    return new pass_lower_subreg (ctxt);
>  }
>
> +/* Implement second lower subreg pass.  */
> +
>  namespace {
>
>  const pass_data pass_data_lower_subreg2 =
> @@ -1768,7 +1758,11 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_split_wide_types != 0; }
> -  unsigned int execute () { return rest_of_handle_lower_subreg2 (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      decompose_multiword_subregs (true);
> +      return 0;
> +    }
>
>  }; // class pass_lower_subreg2
>
> diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c
> index e73d6ee..b132cba 100644
> --- a/gcc/mode-switching.c
> +++ b/gcc/mode-switching.c
> @@ -789,16 +789,6 @@ optimize_mode_switching (void)
>
>  #endif /* OPTIMIZE_MODE_SWITCHING */
>
> -static unsigned int
> -rest_of_handle_mode_switching (void)
> -{
> -#ifdef OPTIMIZE_MODE_SWITCHING
> -  optimize_mode_switching ();
> -#endif /* OPTIMIZE_MODE_SWITCHING */
> -  return 0;
> -}
> -
> -
>  namespace {
>
>  const pass_data pass_data_mode_switching =
> @@ -835,7 +825,13 @@ public:
>  #endif
>      }
>
> -  unsigned int execute () { return rest_of_handle_mode_switching (); }
> +  virtual unsigned int execute (function *)
> +    {
> +#ifdef OPTIMIZE_MODE_SWITCHING
> +      optimize_mode_switching ();
> +#endif /* OPTIMIZE_MODE_SWITCHING */
> +      return 0;
> +    }
>
>  }; // class pass_mode_switching
>
> diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c
> index 20e2e62..2e454f5 100644
> --- a/gcc/modulo-sched.c
> +++ b/gcc/modulo-sched.c
> @@ -3325,28 +3325,6 @@ rotate_partial_schedule (partial_schedule_ptr ps, int start_cycle)
>
>  /* Run instruction scheduler.  */
>  /* Perform SMS module scheduling.  */
> -static unsigned int
> -rest_of_handle_sms (void)
> -{
> -#ifdef INSN_SCHEDULING
> -  basic_block bb;
> -
> -  /* Collect loop information to be used in SMS.  */
> -  cfg_layout_initialize (0);
> -  sms_schedule ();
> -
> -  /* Update the life information, because we add pseudos.  */
> -  max_regno = max_reg_num ();
> -
> -  /* Finalize layout changes.  */
> -  FOR_EACH_BB_FN (bb, cfun)
> -    if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
> -      bb->aux = bb->next_bb;
> -  free_dominance_info (CDI_DOMINATORS);
> -  cfg_layout_finalize ();
> -#endif /* INSN_SCHEDULING */
> -  return 0;
> -}
>
>  namespace {
>
> @@ -3378,10 +3356,33 @@ public:
>    return (optimize > 0 && flag_modulo_sched);
>  }
>
> -  unsigned int execute () { return rest_of_handle_sms (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_sms
>
> +unsigned int
> +pass_sms::execute (function *fun ATTRIBUTE_UNUSED)
> +{
> +#ifdef INSN_SCHEDULING
> +  basic_block bb;
> +
> +  /* Collect loop information to be used in SMS.  */
> +  cfg_layout_initialize (0);
> +  sms_schedule ();
> +
> +  /* Update the life information, because we add pseudos.  */
> +  max_regno = max_reg_num ();
> +
> +  /* Finalize layout changes.  */
> +  FOR_EACH_BB_FN (bb, fun)
> +    if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (fun))
> +      bb->aux = bb->next_bb;
> +  free_dominance_info (CDI_DOMINATORS);
> +  cfg_layout_finalize ();
> +#endif /* INSN_SCHEDULING */
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/omp-low.c b/gcc/omp-low.c
> index 0e96b88..0a46fb7 100644
> --- a/gcc/omp-low.c
> +++ b/gcc/omp-low.c
> @@ -8356,7 +8356,7 @@ public:
>                || flag_cilkplus != 0) && !seen_error ());
>      }
>
> -  unsigned int execute () { return execute_expand_omp (); }
> +  virtual unsigned int execute (function *) { return execute_expand_omp (); }
>
>  }; // class pass_expand_omp
>
> @@ -10215,7 +10215,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_lower_omp (); }
> +  virtual unsigned int execute (function *) { return execute_lower_omp (); }
>
>  }; // class pass_lower_omp
>
> @@ -10640,9 +10640,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_openmp || flag_cilkplus; }
> -  unsigned int execute () {
> -    return diagnose_omp_structured_block_errors ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      return diagnose_omp_structured_block_errors ();
> +    }
>
>  }; // class pass_diagnose_omp_blocks
>
> @@ -11804,7 +11805,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return ipa_omp_simd_clone (); }
> +  virtual unsigned int execute (function *) { return ipa_omp_simd_clone (); }
>  };
>
>  bool
> diff --git a/gcc/passes.c b/gcc/passes.c
> index b71c11e..2be7856 100644
> --- a/gcc/passes.c
> +++ b/gcc/passes.c
> @@ -114,7 +114,7 @@ opt_pass::gate (function *)
>  }
>
>  unsigned int
> -opt_pass::execute ()
> +opt_pass::execute (function *)
>  {
>    return 0;
>  }
> @@ -138,7 +138,7 @@ pass_manager::execute_early_local_passes ()
>  unsigned int
>  pass_manager::execute_pass_mode_switching ()
>  {
> -  return pass_mode_switching_1->execute ();
> +  return pass_mode_switching_1->execute (cfun);
>  }
>
>
> @@ -367,7 +367,10 @@ public:
>        return (!seen_error () && !in_lto_p);
>      }
>
> -  unsigned int execute () { return execute_all_early_local_passes (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_all_early_local_passes ();
> +    }
>
>  }; // class pass_early_local_passes
>
> @@ -2153,7 +2156,7 @@ execute_one_pass (opt_pass *pass)
>    /* Do it!  */
>    if (pass->has_execute)
>      {
> -      todo_after = pass->execute ();
> +      todo_after = pass->execute (cfun);
>        do_per_function (clear_last_verified, NULL);
>      }
>
> diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c
> index 8a804fb..f5d5363 100644
> --- a/gcc/postreload-gcse.c
> +++ b/gcc/postreload-gcse.c
> @@ -1347,7 +1347,7 @@ public:
>               && optimize_function_for_speed_p (fun));
>      }
>
> -  unsigned int execute () { return rest_of_handle_gcse2 (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_gcse2 (); }
>
>  }; // class pass_gcse2
>
> diff --git a/gcc/postreload.c b/gcc/postreload.c
> index 0568c53..b093287 100644
> --- a/gcc/postreload.c
> +++ b/gcc/postreload.c
> @@ -2315,23 +2315,6 @@ move2add_note_store (rtx dst, const_rtx set, void *data)
>      }
>  }
>
> -static unsigned int
> -rest_of_handle_postreload (void)
> -{
> -  if (!dbg_cnt (postreload_cse))
> -    return 0;
> -
> -  /* Do a very simple CSE pass over just the hard registers.  */
> -  reload_cse_regs (get_insns ());
> -  /* Reload_cse_regs can eliminate potentially-trapping MEMs.
> -     Remove any EH edges associated with them.  */
> -  if (cfun->can_throw_non_call_exceptions
> -      && purge_all_dead_edges ())
> -    cleanup_cfg (0);
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_postreload_cse =
> @@ -2358,10 +2341,27 @@ public:
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return (optimize > 0 && reload_completed); }
>
> -  unsigned int execute () { return rest_of_handle_postreload (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_postreload_cse
>
> +unsigned int
> +pass_postreload_cse::execute (function *fun)
> +{
> +  if (!dbg_cnt (postreload_cse))
> +    return 0;
> +
> +  /* Do a very simple CSE pass over just the hard registers.  */
> +  reload_cse_regs (get_insns ());
> +  /* Reload_cse_regs can eliminate potentially-trapping MEMs.
> +     Remove any EH edges associated with them.  */
> +  if (fun->can_throw_non_call_exceptions
> +      && purge_all_dead_edges ())
> +    cleanup_cfg (0);
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/predict.c b/gcc/predict.c
> index 068c187..a847ec6 100644
> --- a/gcc/predict.c
> +++ b/gcc/predict.c
> @@ -1986,59 +1986,6 @@ expr_expected_value (tree expr, bitmap visited,
>    return expr_expected_value_1 (TREE_TYPE (expr),
>                                 op0, code, op1, visited, predictor);
>  }
> -
> -
> -/* Get rid of all builtin_expect calls and GIMPLE_PREDICT statements
> -   we no longer need.  */
> -static unsigned int
> -strip_predict_hints (void)
> -{
> -  basic_block bb;
> -  gimple ass_stmt;
> -  tree var;
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      gimple_stmt_iterator bi;
> -      for (bi = gsi_start_bb (bb); !gsi_end_p (bi);)
> -       {
> -         gimple stmt = gsi_stmt (bi);
> -
> -         if (gimple_code (stmt) == GIMPLE_PREDICT)
> -           {
> -             gsi_remove (&bi, true);
> -             continue;
> -           }
> -         else if (is_gimple_call (stmt))
> -           {
> -             tree fndecl = gimple_call_fndecl (stmt);
> -
> -             if ((fndecl
> -                  && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
> -                  && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_EXPECT
> -                  && gimple_call_num_args (stmt) == 2)
> -                 || (gimple_call_internal_p (stmt)
> -                     && gimple_call_internal_fn (stmt) == IFN_BUILTIN_EXPECT))
> -               {
> -                 var = gimple_call_lhs (stmt);
> -                 if (var)
> -                   {
> -                     ass_stmt
> -                       = gimple_build_assign (var, gimple_call_arg (stmt, 0));
> -                     gsi_replace (&bi, ass_stmt, true);
> -                   }
> -                 else
> -                   {
> -                     gsi_remove (&bi, true);
> -                     continue;
> -                   }
> -               }
> -           }
> -         gsi_next (&bi);
> -       }
> -    }
> -  return 0;
> -}
>
>  /* Predict using opcode of the last statement in basic block.  */
>  static void
> @@ -2468,37 +2415,6 @@ tree_estimate_probability (void)
>    free_dominance_info (CDI_POST_DOMINATORS);
>    remove_fake_exit_edges ();
>  }
> -
> -/* Predict branch probabilities and estimate profile of the tree CFG.
> -   This is the driver function for PASS_PROFILE.  */
> -
> -static unsigned int
> -tree_estimate_probability_driver (void)
> -{
> -  unsigned nb_loops;
> -
> -  loop_optimizer_init (LOOPS_NORMAL);
> -  if (dump_file && (dump_flags & TDF_DETAILS))
> -    flow_loops_dump (dump_file, NULL, 0);
> -
> -  mark_irreducible_loops ();
> -
> -  nb_loops = number_of_loops (cfun);
> -  if (nb_loops > 1)
> -    scev_initialize ();
> -
> -  tree_estimate_probability ();
> -
> -  if (nb_loops > 1)
> -    scev_finalize ();
> -
> -  loop_optimizer_finalize ();
> -  if (dump_file && (dump_flags & TDF_DETAILS))
> -    gimple_dump_cfg (dump_file, dump_flags);
> -  if (profile_status_for_fn (cfun) == PROFILE_ABSENT)
> -    profile_status_for_fn (cfun) = PROFILE_GUESSED;
> -  return 0;
> -}
>
>  /* Predict edges to successors of CUR whose sources are not postdominated by
>     BB by PRED and recurse to all postdominators.  */
> @@ -3147,6 +3063,8 @@ predictor_name (enum br_predictor predictor)
>    return predictor_info[predictor].name;
>  }
>
> +/* Predict branch probabilities and estimate profile of the tree CFG. */
> +
>  namespace {
>
>  const pass_data pass_data_profile =
> @@ -3172,10 +3090,38 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_guess_branch_prob; }
> -  unsigned int execute () { return tree_estimate_probability_driver (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_profile
>
> +unsigned int
> +pass_profile::execute (function *fun)
> +{
> +  unsigned nb_loops;
> +
> +  loop_optimizer_init (LOOPS_NORMAL);
> +  if (dump_file && (dump_flags & TDF_DETAILS))
> +    flow_loops_dump (dump_file, NULL, 0);
> +
> +  mark_irreducible_loops ();
> +
> +  nb_loops = number_of_loops (fun);
> +  if (nb_loops > 1)
> +    scev_initialize ();
> +
> +  tree_estimate_probability ();
> +
> +  if (nb_loops > 1)
> +    scev_finalize ();
> +
> +  loop_optimizer_finalize ();
> +  if (dump_file && (dump_flags & TDF_DETAILS))
> +    gimple_dump_cfg (dump_file, dump_flags);
> + if (profile_status_for_fn (fun) == PROFILE_ABSENT)
> +    profile_status_for_fn (fun) = PROFILE_GUESSED;
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -3209,10 +3155,62 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_strip_predict_hints (m_ctxt); }
> -  unsigned int execute () { return strip_predict_hints (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_strip_predict_hints
>
> +/* Get rid of all builtin_expect calls and GIMPLE_PREDICT statements
> +   we no longer need.  */
> +unsigned int
> +pass_strip_predict_hints::execute (function *fun)
> +{
> +  basic_block bb;
> +  gimple ass_stmt;
> +  tree var;
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      gimple_stmt_iterator bi;
> +      for (bi = gsi_start_bb (bb); !gsi_end_p (bi);)
> +       {
> +         gimple stmt = gsi_stmt (bi);
> +
> +         if (gimple_code (stmt) == GIMPLE_PREDICT)
> +           {
> +             gsi_remove (&bi, true);
> +             continue;
> +           }
> +         else if (is_gimple_call (stmt))
> +           {
> +             tree fndecl = gimple_call_fndecl (stmt);
> +
> +             if ((fndecl
> +                  && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
> +                  && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_EXPECT
> +                  && gimple_call_num_args (stmt) == 2)
> +                 || (gimple_call_internal_p (stmt)
> +                     && gimple_call_internal_fn (stmt) == IFN_BUILTIN_EXPECT))
> +               {
> +                 var = gimple_call_lhs (stmt);
> +                 if (var)
> +                   {
> +                     ass_stmt
> +                       = gimple_build_assign (var, gimple_call_arg (stmt, 0));
> +                     gsi_replace (&bi, ass_stmt, true);
> +                   }
> +                 else
> +                   {
> +                     gsi_remove (&bi, true);
> +                     continue;
> +                   }
> +               }
> +           }
> +         gsi_next (&bi);
> +       }
> +    }
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/recog.c b/gcc/recog.c
> index 8afea7e..057f411 100644
> --- a/gcc/recog.c
> +++ b/gcc/recog.c
> @@ -3847,7 +3847,10 @@ public:
>       a clone method.  */
>    opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
>    virtual bool gate (function *) { return (optimize > 0 && flag_peephole2); }
> -  unsigned int execute () { return rest_of_handle_peephole2 (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_peephole2 ();
> +    }
>
>  }; // class pass_peephole2
>
> @@ -3859,13 +3862,6 @@ make_pass_peephole2 (gcc::context *ctxt)
>    return new pass_peephole2 (ctxt);
>  }
>
> -static unsigned int
> -rest_of_handle_split_all_insns (void)
> -{
> -  split_all_insns ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_split_all_insns =
> @@ -3893,7 +3889,11 @@ public:
>    /* The epiphany backend creates a second instance of this pass, so
>       we need a clone method.  */
>    opt_pass * clone () { return new pass_split_all_insns (m_ctxt); }
> -  unsigned int execute () { return rest_of_handle_split_all_insns (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      split_all_insns ();
> +      return 0;
> +    }
>
>  }; // class pass_split_all_insns
>
> @@ -3940,7 +3940,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_split_after_reload (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_split_after_reload ();
> +    }
>
>  }; // class pass_split_after_reload
>
> @@ -3952,13 +3955,6 @@ make_pass_split_after_reload (gcc::context *ctxt)
>    return new pass_split_after_reload (ctxt);
>  }
>
> -static unsigned int
> -rest_of_handle_split_before_regstack (void)
> -{
> -  split_all_insns ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_split_before_regstack =
> @@ -3984,9 +3980,11 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () {
> -    return rest_of_handle_split_before_regstack ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      split_all_insns ();
> +      return 0;
> +    }
>
>  }; // class pass_split_before_regstack
>
> @@ -4058,7 +4056,10 @@ public:
>  #endif
>      }
>
> -  unsigned int execute () { return rest_of_handle_split_before_sched2 (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_split_before_sched2 ();
> +    }
>
>  }; // class pass_split_before_sched2
>
> @@ -4105,7 +4106,10 @@ public:
>  #endif
>      }
>
> -  unsigned int execute () { return split_all_insns_noflow (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return split_all_insns_noflow ();
> +    }
>
>  }; // class pass_split_for_shorten_branches
>
> diff --git a/gcc/ree.c b/gcc/ree.c
> index 435bb88..b471033 100644
> --- a/gcc/ree.c
> +++ b/gcc/ree.c
> @@ -1118,7 +1118,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return (optimize > 0 && flag_ree); }
> -  unsigned int execute () { return rest_of_handle_ree (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_ree (); }
>
>  }; // class pass_ree
>
> diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
> index f8f8658..7aa8a6b 100644
> --- a/gcc/reg-stack.c
> +++ b/gcc/reg-stack.c
> @@ -3364,7 +3364,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_stack_regs (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_stack_regs ();
> +    }
>
>  }; // class pass_stack_regs_run
>
> diff --git a/gcc/regcprop.c b/gcc/regcprop.c
> index 24992e4..c1fbb65 100644
> --- a/gcc/regcprop.c
> +++ b/gcc/regcprop.c
> @@ -1056,93 +1056,6 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
>    return anything_changed;
>  }
>
> -/* Main entry point for the forward copy propagation optimization.  */
> -
> -static unsigned int
> -copyprop_hardreg_forward (void)
> -{
> -  struct value_data *all_vd;
> -  basic_block bb;
> -  sbitmap visited;
> -  bool analyze_called = false;
> -
> -  all_vd = XNEWVEC (struct value_data, last_basic_block_for_fn (cfun));
> -
> -  visited = sbitmap_alloc (last_basic_block_for_fn (cfun));
> -  bitmap_clear (visited);
> -
> -  if (MAY_HAVE_DEBUG_INSNS)
> -    debug_insn_changes_pool
> -      = create_alloc_pool ("debug insn changes pool",
> -                          sizeof (struct queued_debug_insn_change), 256);
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      bitmap_set_bit (visited, bb->index);
> -
> -      /* If a block has a single predecessor, that we've already
> -        processed, begin with the value data that was live at
> -        the end of the predecessor block.  */
> -      /* ??? Ought to use more intelligent queuing of blocks.  */
> -      if (single_pred_p (bb)
> -         && bitmap_bit_p (visited, single_pred (bb)->index)
> -         && ! (single_pred_edge (bb)->flags & (EDGE_ABNORMAL_CALL | EDGE_EH)))
> -       {
> -         all_vd[bb->index] = all_vd[single_pred (bb)->index];
> -         if (all_vd[bb->index].n_debug_insn_changes)
> -           {
> -             unsigned int regno;
> -
> -             for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> -               {
> -                 if (all_vd[bb->index].e[regno].debug_insn_changes)
> -                   {
> -                     all_vd[bb->index].e[regno].debug_insn_changes = NULL;
> -                     if (--all_vd[bb->index].n_debug_insn_changes == 0)
> -                       break;
> -                   }
> -               }
> -           }
> -       }
> -      else
> -       init_value_data (all_vd + bb->index);
> -
> -      copyprop_hardreg_forward_1 (bb, all_vd + bb->index);
> -    }
> -
> -  if (MAY_HAVE_DEBUG_INSNS)
> -    {
> -      FOR_EACH_BB_FN (bb, cfun)
> -       if (bitmap_bit_p (visited, bb->index)
> -           && all_vd[bb->index].n_debug_insn_changes)
> -         {
> -           unsigned int regno;
> -           bitmap live;
> -
> -           if (!analyze_called)
> -             {
> -               df_analyze ();
> -               analyze_called = true;
> -             }
> -           live = df_get_live_out (bb);
> -           for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> -             if (all_vd[bb->index].e[regno].debug_insn_changes)
> -               {
> -                 if (REGNO_REG_SET_P (live, regno))
> -                   apply_debug_insn_changes (all_vd + bb->index, regno);
> -                 if (all_vd[bb->index].n_debug_insn_changes == 0)
> -                   break;
> -               }
> -         }
> -
> -      free_alloc_pool (debug_insn_changes_pool);
> -    }
> -
> -  sbitmap_free (visited);
> -  free (all_vd);
> -  return 0;
> -}
> -
>  /* Dump the value chain data to stderr.  */
>
>  DEBUG_FUNCTION void
> @@ -1276,10 +1189,95 @@ public:
>        return (optimize > 0 && (flag_cprop_registers));
>      }
>
> -  unsigned int execute () { return copyprop_hardreg_forward (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_cprop_hardreg
>
> +unsigned int
> +pass_cprop_hardreg::execute (function *fun)
> +{
> +  struct value_data *all_vd;
> +  basic_block bb;
> +  sbitmap visited;
> +  bool analyze_called = false;
> +
> +  all_vd = XNEWVEC (struct value_data, last_basic_block_for_fn (fun));
> +
> +  visited = sbitmap_alloc (last_basic_block_for_fn (fun));
> +  bitmap_clear (visited);
> +
> +  if (MAY_HAVE_DEBUG_INSNS)
> +    debug_insn_changes_pool
> +      = create_alloc_pool ("debug insn changes pool",
> +                          sizeof (struct queued_debug_insn_change), 256);
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      bitmap_set_bit (visited, bb->index);
> +
> +      /* If a block has a single predecessor, that we've already
> +        processed, begin with the value data that was live at
> +        the end of the predecessor block.  */
> +      /* ??? Ought to use more intelligent queuing of blocks.  */
> +      if (single_pred_p (bb)
> +         && bitmap_bit_p (visited, single_pred (bb)->index)
> +         && ! (single_pred_edge (bb)->flags & (EDGE_ABNORMAL_CALL | EDGE_EH)))
> +       {
> +         all_vd[bb->index] = all_vd[single_pred (bb)->index];
> +         if (all_vd[bb->index].n_debug_insn_changes)
> +           {
> +             unsigned int regno;
> +
> +             for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> +               {
> +                 if (all_vd[bb->index].e[regno].debug_insn_changes)
> +                   {
> +                     all_vd[bb->index].e[regno].debug_insn_changes = NULL;
> +                     if (--all_vd[bb->index].n_debug_insn_changes == 0)
> +                       break;
> +                   }
> +               }
> +           }
> +       }
> +      else
> +       init_value_data (all_vd + bb->index);
> +
> +      copyprop_hardreg_forward_1 (bb, all_vd + bb->index);
> +    }
> +
> +  if (MAY_HAVE_DEBUG_INSNS)
> +    {
> +      FOR_EACH_BB_FN (bb, fun)
> +       if (bitmap_bit_p (visited, bb->index)
> +           && all_vd[bb->index].n_debug_insn_changes)
> +         {
> +           unsigned int regno;
> +           bitmap live;
> +
> +           if (!analyze_called)
> +             {
> +               df_analyze ();
> +               analyze_called = true;
> +             }
> +           live = df_get_live_out (bb);
> +           for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> +             if (all_vd[bb->index].e[regno].debug_insn_changes)
> +               {
> +                 if (REGNO_REG_SET_P (live, regno))
> +                   apply_debug_insn_changes (all_vd + bb->index, regno);
> +                 if (all_vd[bb->index].n_debug_insn_changes == 0)
> +                   break;
> +               }
> +         }
> +
> +      free_alloc_pool (debug_insn_changes_pool);
> +    }
> +
> +  sbitmap_free (visited);
> +  free (all_vd);
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/reginfo.c b/gcc/reginfo.c
> index 82b6081..42668a1 100644
> --- a/gcc/reginfo.c
> +++ b/gcc/reginfo.c
> @@ -985,7 +985,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return reginfo_init (); }
> +  virtual unsigned int execute (function *) { return reginfo_init (); }
>
>  }; // class pass_reginfo_init
>
> diff --git a/gcc/regrename.c b/gcc/regrename.c
> index 321d5bf..68e8ad7 100644
> --- a/gcc/regrename.c
> +++ b/gcc/regrename.c
> @@ -1865,7 +1865,7 @@ public:
>        return (optimize > 0 && (flag_rename_registers));
>      }
>
> -  unsigned int execute () { return regrename_optimize (); }
> +  virtual unsigned int execute (function *) { return regrename_optimize (); }
>
>  }; // class pass_regrename
>
> diff --git a/gcc/reorg.c b/gcc/reorg.c
> index 22f0b5a..95e942f 100644
> --- a/gcc/reorg.c
> +++ b/gcc/reorg.c
> @@ -3898,7 +3898,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return rest_of_handle_delay_slots (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_delay_slots ();
> +    }
>
>  }; // class pass_delay_slots
>
> @@ -3923,13 +3926,6 @@ make_pass_delay_slots (gcc::context *ctxt)
>
>  /* Machine dependent reorg pass.  */
>
> -static unsigned int
> -rest_of_handle_machine_reorg (void)
> -{
> -  targetm.machine_dependent_reorg ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_machine_reorg =
> @@ -3959,7 +3955,11 @@ public:
>        return targetm.machine_dependent_reorg != 0;
>      }
>
> -  unsigned int execute () { return rest_of_handle_machine_reorg (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      targetm.machine_dependent_reorg ();
> +      return 0;
> +    }
>
>  }; // class pass_machine_reorg
>
> diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c
> index e0a80c2..ce3fe5d 100644
> --- a/gcc/sched-rgn.c
> +++ b/gcc/sched-rgn.c
> @@ -3677,7 +3677,10 @@ public:
>  #endif
>      }
>
> -  unsigned int execute () { return rest_of_handle_live_range_shrinkage (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_live_range_shrinkage ();
> +    }
>
>  }; // class pass_live_range_shrinkage
>
> @@ -3715,7 +3718,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return rest_of_handle_sched (); }
> +  virtual unsigned int execute (function *) { return rest_of_handle_sched (); }
>
>  }; // class pass_sched
>
> @@ -3763,7 +3766,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return rest_of_handle_sched2 (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return rest_of_handle_sched2 ();
> +    }
>
>  }; // class pass_sched2
>
> diff --git a/gcc/stack-ptr-mod.c b/gcc/stack-ptr-mod.c
> index d1375a4..75bec2f 100644
> --- a/gcc/stack-ptr-mod.c
> +++ b/gcc/stack-ptr-mod.c
> @@ -48,48 +48,10 @@ notice_stack_pointer_modification_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
>      crtl->sp_is_unchanging = 0;
>  }
>
> -static void
> -notice_stack_pointer_modification (void)
> -{
> -  basic_block bb;
> -  rtx insn;
> -
> -  /* Assume that the stack pointer is unchanging if alloca hasn't
> -     been used.  */
> -  crtl->sp_is_unchanging = !cfun->calls_alloca;
> -  if (crtl->sp_is_unchanging)
> -    FOR_EACH_BB_FN (bb, cfun)
> -      FOR_BB_INSNS (bb, insn)
> -        {
> -         if (INSN_P (insn))
> -           {
> -             /* Check if insn modifies the stack pointer.  */
> -             note_stores (PATTERN (insn),
> -                          notice_stack_pointer_modification_1,
> -                          NULL);
> -             if (! crtl->sp_is_unchanging)
> -               return;
> -           }
> -       }
> -
> -  /* The value coming into this pass was 0, and the exit block uses
> -     are based on this.  If the value is now 1, we need to redo the
> -     exit block uses.  */
> -  if (df && crtl->sp_is_unchanging)
> -    df_update_exit_block_uses ();
> -}
> -
>    /* Some targets can emit simpler epilogues if they know that sp was
>       not ever modified during the function.  After reload, of course,
>       we've already emitted the epilogue so there's no sense searching.  */
>
> -static unsigned int
> -rest_of_handle_stack_ptr_mod (void)
> -{
> -  notice_stack_pointer_modification ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_stack_ptr_mod =
> @@ -114,10 +76,43 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return rest_of_handle_stack_ptr_mod (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_stack_ptr_mod
>
> +unsigned int
> +pass_stack_ptr_mod::execute (function *fun)
> +{
> +  basic_block bb;
> +  rtx insn;
> +
> +  /* Assume that the stack pointer is unchanging if alloca hasn't
> +     been used.  */
> +  crtl->sp_is_unchanging = !fun->calls_alloca;
> +  if (crtl->sp_is_unchanging)
> +    FOR_EACH_BB_FN (bb, fun)
> +      FOR_BB_INSNS (bb, insn)
> +        {
> +         if (INSN_P (insn))
> +           {
> +             /* Check if insn modifies the stack pointer.  */
> +             note_stores (PATTERN (insn),
> +                          notice_stack_pointer_modification_1,
> +                          NULL);
> +             if (! crtl->sp_is_unchanging)
> +               return 0;
> +           }
> +       }
> +
> +  /* The value coming into this pass was 0, and the exit block uses
> +     are based on this.  If the value is now 1, we need to redo the
> +     exit block uses.  */
> +  if (df && crtl->sp_is_unchanging)
> +    df_update_exit_block_uses ();
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  rtl_opt_pass *
> diff --git a/gcc/store-motion.c b/gcc/store-motion.c
> index 7c57754..920da53 100644
> --- a/gcc/store-motion.c
> +++ b/gcc/store-motion.c
> @@ -1258,7 +1258,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return execute_rtl_store_motion (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_rtl_store_motion ();
> +    }
>
>  }; // class pass_rtl_store_motion
>
> diff --git a/gcc/testsuite/g++.dg/plugin/dumb_plugin.c b/gcc/testsuite/g++.dg/plugin/dumb_plugin.c
> index a3b04a2..35eae15 100644
> --- a/gcc/testsuite/g++.dg/plugin/dumb_plugin.c
> +++ b/gcc/testsuite/g++.dg/plugin/dumb_plugin.c
> @@ -44,14 +44,6 @@ handle_end_of_compilation_unit (void *event_data, void *data)
>  }
>
>
> -static unsigned int
> -execute_dumb_plugin_example (void)
> -{
> -  warning (0, G_("Analyze function %s"),
> -           IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_dumb_plugin_example =
> @@ -76,10 +68,18 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_dumb_plugin_example (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_dumb_plugin_example
>
> +unsigned int
> +pass_dumb_plugin_example::execute (function *)
> +{
> +  warning (0, G_("Analyze function %s"),
> +           IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  static gimple_opt_pass *
> diff --git a/gcc/testsuite/g++.dg/plugin/selfassign.c b/gcc/testsuite/g++.dg/plugin/selfassign.c
> index 033047b..59bb03a 100644
> --- a/gcc/testsuite/g++.dg/plugin/selfassign.c
> +++ b/gcc/testsuite/g++.dg/plugin/selfassign.c
> @@ -253,23 +253,6 @@ warn_self_assign (gimple stmt)
>      }
>  }
>
> -/* Entry point for the self-assignment detection pass.  */
> -
> -static unsigned int
> -execute_warn_self_assign (void)
> -{
> -  gimple_stmt_iterator gsi;
> -  basic_block bb;
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> -        warn_self_assign (gsi_stmt (gsi));
> -    }
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_warn_self_assign =
> @@ -295,10 +278,25 @@ public:
>
>    /* opt_pass methods: */
>    bool gate (function *) { return true; }
> -  unsigned int execute () { return execute_warn_self_assign (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_warn_self_assign
>
> +unsigned int
> +pass_warn_self_assign::execute (function *fun)
> +{
> +  gimple_stmt_iterator gsi;
> +  basic_block bb;
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> +        warn_self_assign (gsi_stmt (gsi));
> +    }
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  static gimple_opt_pass *
> diff --git a/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c b/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c
> index 18e8b07..d70f558 100644
> --- a/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c
> +++ b/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c
> @@ -50,7 +50,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute ();
> +  virtual unsigned int execute (function *);
>
>  private:
>    int counter;
> @@ -63,7 +63,8 @@ bool one_pass::gate (function *)
>    return true;
>  }
>
> -unsigned int one_pass::execute ()
> +unsigned int
> +one_pass::execute (function *)
>  {
>    if (counter > 0) {
>      printf ("Executed more than once \n");
> diff --git a/gcc/testsuite/gcc.dg/plugin/selfassign.c b/gcc/testsuite/gcc.dg/plugin/selfassign.c
> index 098df06..4dad0c2 100644
> --- a/gcc/testsuite/gcc.dg/plugin/selfassign.c
> +++ b/gcc/testsuite/gcc.dg/plugin/selfassign.c
> @@ -253,23 +253,6 @@ warn_self_assign (gimple stmt)
>      }
>  }
>
> -/* Entry point for the self-assignment detection pass.  */
> -
> -static unsigned int
> -execute_warn_self_assign (void)
> -{
> -  gimple_stmt_iterator gsi;
> -  basic_block bb;
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> -        warn_self_assign (gsi_stmt (gsi));
> -    }
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_warn_self_assign =
> @@ -294,10 +277,25 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_warn_self_assign (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_warn_self_assign
>
> +unsigned int
> +pass_warn_self_assign::execute (function *fun)
> +{
> +  gimple_stmt_iterator gsi;
> +  basic_block bb;
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> +        warn_self_assign (gsi_stmt (gsi));
> +    }
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  static gimple_opt_pass *
> diff --git a/gcc/tracer.c b/gcc/tracer.c
> index 794d385..09a8f40 100644
> --- a/gcc/tracer.c
> +++ b/gcc/tracer.c
> @@ -367,36 +367,6 @@ tail_duplicate (void)
>
>    return changed;
>  }
> -
> -/* Main entry point to this file.  */
> -
> -static unsigned int
> -tracer (void)
> -{
> -  bool changed;
> -
> -  if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1)
> -    return 0;
> -
> -  mark_dfs_back_edges ();
> -  if (dump_file)
> -    brief_dump_cfg (dump_file, dump_flags);
> -
> -  /* Trace formation is done on the fly inside tail_duplicate */
> -  changed = tail_duplicate ();
> -  if (changed)
> -    {
> -      free_dominance_info (CDI_DOMINATORS);
> -      /* If we changed the CFG schedule loops for fixup by cleanup_cfg.  */
> -      if (current_loops)
> -       loops_state_set (LOOPS_NEED_FIXUP);
> -    }
> -
> -  if (dump_file)
> -    brief_dump_cfg (dump_file, dump_flags);
> -
> -  return changed ? TODO_cleanup_cfg : 0;
> -}
>
>  namespace {
>
> @@ -427,10 +397,37 @@ public:
>        return (optimize > 0 && flag_tracer && flag_reorder_blocks);
>      }
>
> -  unsigned int execute () { return tracer (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_tracer
>
> +unsigned int
> +pass_tracer::execute (function *fun)
> +{
> +  bool changed;
> +
> +  if (n_basic_blocks_for_fn (fun) <= NUM_FIXED_BLOCKS + 1)
> +    return 0;
> +
> +  mark_dfs_back_edges ();
> +  if (dump_file)
> +    brief_dump_cfg (dump_file, dump_flags);
> +
> +  /* Trace formation is done on the fly inside tail_duplicate */
> +  changed = tail_duplicate ();
> +  if (changed)
> +    {
> +      free_dominance_info (CDI_DOMINATORS);
> +      /* If we changed the CFG schedule loops for fixup by cleanup_cfg.  */
> +      if (current_loops)
> +       loops_state_set (LOOPS_NEED_FIXUP);
> +    }
> +
> +  if (dump_file)
> +    brief_dump_cfg (dump_file, dump_flags);
> +
> +  return changed ? TODO_cleanup_cfg : 0;
> +}
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
> index be876f5..2aa8bab 100644
> --- a/gcc/trans-mem.c
> +++ b/gcc/trans-mem.c
> @@ -856,7 +856,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tm; }
> -  unsigned int execute () { return diagnose_tm_blocks (); }
> +  virtual unsigned int execute (function *) { return diagnose_tm_blocks (); }
>
>  }; // class pass_diagnose_tm_blocks
>
> @@ -1778,7 +1778,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tm; }
> -  unsigned int execute () { return execute_lower_tm (); }
> +  virtual unsigned int execute (function *) { return execute_lower_tm (); }
>
>  }; // class pass_lower_tm
>
> @@ -3029,7 +3029,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_tm_mark (); }
> +  virtual unsigned int execute (function *) { return execute_tm_mark (); }
>
>  }; // class pass_tm_mark
>
> @@ -3162,31 +3162,6 @@ expand_block_edges (struct tm_region *const region, basic_block bb)
>
>  /* Entry point to the final expansion of transactional nodes. */
>
> -static unsigned int
> -execute_tm_edges (void)
> -{
> -  vec<tm_region_p> bb_regions
> -    = get_bb_regions_instrumented (/*traverse_clones=*/false,
> -                                  /*include_uninstrumented_p=*/true);
> -  struct tm_region *r;
> -  unsigned i;
> -
> -  FOR_EACH_VEC_ELT (bb_regions, i, r)
> -    if (r != NULL)
> -      expand_block_edges (r, BASIC_BLOCK_FOR_FN (cfun, i));
> -
> -  bb_regions.release ();
> -
> -  /* We've got to release the dominance info now, to indicate that it
> -     must be rebuilt completely.  Otherwise we'll crash trying to update
> -     the SSA web in the TODO section following this pass.  */
> -  free_dominance_info (CDI_DOMINATORS);
> -  bitmap_obstack_release (&tm_obstack);
> -  all_tm_regions = NULL;
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_tm_edges =
> @@ -3211,10 +3186,35 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_tm_edges (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_tm_edges
>
> +unsigned int
> +pass_tm_edges::execute (function *fun)
> +{
> +  vec<tm_region_p> bb_regions
> +    = get_bb_regions_instrumented (/*traverse_clones=*/false,
> +                                  /*include_uninstrumented_p=*/true);
> +  struct tm_region *r;
> +  unsigned i;
> +
> +  FOR_EACH_VEC_ELT (bb_regions, i, r)
> +    if (r != NULL)
> +      expand_block_edges (r, BASIC_BLOCK_FOR_FN (fun, i));
> +
> +  bb_regions.release ();
> +
> +  /* We've got to release the dominance info now, to indicate that it
> +     must be rebuilt completely.  Otherwise we'll crash trying to update
> +     the SSA web in the TODO section following this pass.  */
> +  free_dominance_info (CDI_DOMINATORS);
> +  bitmap_obstack_release (&tm_obstack);
> +  all_tm_regions = NULL;
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -3946,7 +3946,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tm && optimize > 0; }
> -  unsigned int execute () { return execute_tm_memopt (); }
> +  virtual unsigned int execute (function *) { return execute_tm_memopt (); }
>
>  }; // class pass_tm_memopt
>
> @@ -5581,7 +5581,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tm; }
> -  unsigned int execute () { return ipa_tm_execute (); }
> +  virtual unsigned int execute (function *) { return ipa_tm_execute (); }
>
>  }; // class pass_ipa_tm
>
> diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c
> index c271493..ea1df8b 100644
> --- a/gcc/tree-call-cdce.c
> +++ b/gcc/tree-call-cdce.c
> @@ -867,16 +867,51 @@ shrink_wrap_conditional_dead_built_in_calls (vec<gimple> calls)
>    return changed;
>  }
>
> -/* Pass entry points.  */
> +namespace {
> +
> +const pass_data pass_data_call_cdce =
> +{
> +  GIMPLE_PASS, /* type */
> +  "cdce", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_CALL_CDCE, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_call_cdce : public gimple_opt_pass
> +{
> +public:
> +  pass_call_cdce (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_call_cdce, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *fun)
> +    {
> +      /* The limit constants used in the implementation
> +        assume IEEE floating point format.  Other formats
> +        can be supported in the future if needed.  */
> +      return flag_tree_builtin_call_dce != 0
> +               && optimize_function_for_speed_p (fun);
> +    }
>
> -static unsigned int
> -tree_call_cdce (void)
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_call_cdce
> +
> +unsigned int
> +pass_call_cdce::execute (function *fun)
>  {
>    basic_block bb;
>    gimple_stmt_iterator i;
>    bool something_changed = false;
>    auto_vec<gimple> cond_dead_built_in_calls;
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        /* Collect dead call candidates.  */
>        for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
> @@ -910,50 +945,13 @@ tree_call_cdce (void)
>        free_dominance_info (CDI_POST_DOMINATORS);
>        /* As we introduced new control-flow we need to insert PHI-nodes
>           for the call-clobbers of the remaining call.  */
> -      mark_virtual_operands_for_renaming (cfun);
> +      mark_virtual_operands_for_renaming (fun);
>        return TODO_update_ssa;
>      }
>
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_call_cdce =
> -{
> -  GIMPLE_PASS, /* type */
> -  "cdce", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_CALL_CDCE, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_call_cdce : public gimple_opt_pass
> -{
> -public:
> -  pass_call_cdce (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_call_cdce, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> -    {
> -      /* The limit constants used in the implementation
> -        assume IEEE floating point format.  Other formats
> -        can be supported in the future if needed.  */
> -      return flag_tree_builtin_call_dce != 0
> -               && optimize_function_for_speed_p (fun);
> -    }
> -
> -  unsigned int execute () { return tree_call_cdce (); }
> -
> -}; // class pass_call_cdce
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
> index 08e0280..03f8748 100644
> --- a/gcc/tree-cfg.c
> +++ b/gcc/tree-cfg.c
> @@ -368,7 +368,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_build_cfg (); }
> +  virtual unsigned int execute (function *) { return execute_build_cfg (); }
>
>  }; // class pass_build_cfg
>
> @@ -8100,7 +8100,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return split_critical_edges (); }
> +  virtual unsigned int execute (function *) { return split_critical_edges (); }
>
>    opt_pass * clone () { return new pass_split_crit_edges (m_ctxt); }
>  }; // class pass_split_crit_edges
> @@ -8165,64 +8165,6 @@ gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
>
>
>
> -/* Emit return warnings.  */
> -
> -static unsigned int
> -execute_warn_function_return (void)
> -{
> -  source_location location;
> -  gimple last;
> -  edge e;
> -  edge_iterator ei;
> -
> -  if (!targetm.warn_func_return (cfun->decl))
> -    return 0;
> -
> -  /* If we have a path to EXIT, then we do return.  */
> -  if (TREE_THIS_VOLATILE (cfun->decl)
> -      && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) > 0)
> -    {
> -      location = UNKNOWN_LOCATION;
> -      FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
> -       {
> -         last = last_stmt (e->src);
> -         if ((gimple_code (last) == GIMPLE_RETURN
> -              || gimple_call_builtin_p (last, BUILT_IN_RETURN))
> -             && (location = gimple_location (last)) != UNKNOWN_LOCATION)
> -           break;
> -       }
> -      if (location == UNKNOWN_LOCATION)
> -       location = cfun->function_end_locus;
> -      warning_at (location, 0, "%<noreturn%> function does return");
> -    }
> -
> -  /* If we see "return;" in some basic block, then we do reach the end
> -     without returning a value.  */
> -  else if (warn_return_type
> -          && !TREE_NO_WARNING (cfun->decl)
> -          && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) > 0
> -          && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
> -    {
> -      FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
> -       {
> -         gimple last = last_stmt (e->src);
> -         if (gimple_code (last) == GIMPLE_RETURN
> -             && gimple_return_retval (last) == NULL
> -             && !gimple_no_warning_p (last))
> -           {
> -             location = gimple_location (last);
> -             if (location == UNKNOWN_LOCATION)
> -                 location = cfun->function_end_locus;
> -             warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
> -             TREE_NO_WARNING (cfun->decl) = 1;
> -             break;
> -           }
> -       }
> -    }
> -  return 0;
> -}
> -
> -
>  /* Given a basic block B which ends with a conditional and has
>     precisely two successors, determine which of the edges is taken if
>     the conditional is true and which is taken if the conditional is
> @@ -8247,6 +8189,8 @@ extract_true_false_edges_from_block (basic_block b,
>      }
>  }
>
> +/* Emit return warnings.  */
> +
>  namespace {
>
>  const pass_data pass_data_warn_function_return =
> @@ -8271,10 +8215,65 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_warn_function_return (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_warn_function_return
>
> +unsigned int
> +pass_warn_function_return::execute (function *fun)
> +{
> +  source_location location;
> +  gimple last;
> +  edge e;
> +  edge_iterator ei;
> +
> +  if (!targetm.warn_func_return (fun->decl))
> +    return 0;
> +
> +  /* If we have a path to EXIT, then we do return.  */
> +  if (TREE_THIS_VOLATILE (fun->decl)
> +      && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0)
> +    {
> +      location = UNKNOWN_LOCATION;
> +      FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (fun)->preds)
> +       {
> +         last = last_stmt (e->src);
> +         if ((gimple_code (last) == GIMPLE_RETURN
> +              || gimple_call_builtin_p (last, BUILT_IN_RETURN))
> +             && (location = gimple_location (last)) != UNKNOWN_LOCATION)
> +           break;
> +       }
> +      if (location == UNKNOWN_LOCATION)
> +       location = cfun->function_end_locus;
> +      warning_at (location, 0, "%<noreturn%> function does return");
> +    }
> +
> +  /* If we see "return;" in some basic block, then we do reach the end
> +     without returning a value.  */
> +  else if (warn_return_type
> +          && !TREE_NO_WARNING (fun->decl)
> +          && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0
> +          && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fun->decl))))
> +    {
> +      FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (fun)->preds)
> +       {
> +         gimple last = last_stmt (e->src);
> +         if (gimple_code (last) == GIMPLE_RETURN
> +             && gimple_return_retval (last) == NULL
> +             && !gimple_no_warning_p (last))
> +           {
> +             location = gimple_location (last);
> +             if (location == UNKNOWN_LOCATION)
> +               location = fun->function_end_locus;
> +             warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
> +             TREE_NO_WARNING (fun->decl) = 1;
> +             break;
> +           }
> +       }
> +    }
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -8348,13 +8347,6 @@ do_warn_unused_result (gimple_seq seq)
>      }
>  }
>
> -static unsigned int
> -run_warn_unused_result (void)
> -{
> -  do_warn_unused_result (gimple_body (current_function_decl));
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_warn_unused_result =
> @@ -8380,7 +8372,11 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_warn_unused_result; }
> -  unsigned int execute () { return run_warn_unused_result (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      do_warn_unused_result (gimple_body (current_function_decl));
> +      return 0;
> +    }
>
>  }; // class pass_warn_unused_result
>
> @@ -8522,7 +8518,7 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_fixup_cfg (m_ctxt); }
> -  unsigned int execute () { return execute_fixup_cfg (); }
> +  virtual unsigned int execute (function *) { return execute_fixup_cfg (); }
>
>  }; // class pass_fixup_cfg
>
> diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
> index 19433f9..1046207 100644
> --- a/gcc/tree-cfgcleanup.c
> +++ b/gcc/tree-cfgcleanup.c
> @@ -944,17 +944,46 @@ remove_forwarder_block_with_phi (basic_block bb)
>  <L10>:;
>  */
>
> -static unsigned int
> -merge_phi_nodes (void)
> +namespace {
> +
> +const pass_data pass_data_merge_phi =
> +{
> +  GIMPLE_PASS, /* type */
> +  "mergephi", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_MERGE_PHI, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_merge_phi : public gimple_opt_pass
>  {
> -  basic_block *worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
> +public:
> +  pass_merge_phi (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_merge_phi, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_merge_phi (m_ctxt); }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_merge_phi
> +
> +unsigned int
> +pass_merge_phi::execute (function *fun)
> +{
> +  basic_block *worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (fun));
>    basic_block *current = worklist;
>    basic_block bb;
>
>    calculate_dominance_info (CDI_DOMINATORS);
>
>    /* Find all PHI nodes that we may be able to merge.  */
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        basic_block dest;
>
> @@ -1035,35 +1064,6 @@ merge_phi_nodes (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_merge_phi =
> -{
> -  GIMPLE_PASS, /* type */
> -  "mergephi", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_MERGE_PHI, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_merge_phi : public gimple_opt_pass
> -{
> -public:
> -  pass_merge_phi (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_merge_phi, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_merge_phi (m_ctxt); }
> -  unsigned int execute () { return merge_phi_nodes (); }
> -
> -}; // class pass_merge_phi
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -1142,9 +1142,10 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () {
> -    return execute_cleanup_cfg_post_optimizing ();
> -  }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_cleanup_cfg_post_optimizing ();
> +    }
>
>  }; // class pass_cleanup_cfg_post_optimizing
>
> diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c
> index 9ec83d9..a97aaf9 100644
> --- a/gcc/tree-complex.c
> +++ b/gcc/tree-complex.c
> @@ -1680,7 +1680,7 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_lower_complex (m_ctxt); }
> -  unsigned int execute () { return tree_lower_complex (); }
> +  virtual unsigned int execute (function *) { return tree_lower_complex (); }
>
>  }; // class pass_lower_complex
>
> @@ -1724,7 +1724,7 @@ public:
>        return !(fun->curr_properties & PROP_gimple_lcx);
>      }
>
> -  unsigned int execute () { return tree_lower_complex (); }
> +  virtual unsigned int execute (function *) { return tree_lower_complex (); }
>
>  }; // class pass_lower_complex_O0
>
> diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
> index 41f96c4..960c04a 100644
> --- a/gcc/tree-eh.c
> +++ b/gcc/tree-eh.c
> @@ -2121,8 +2121,36 @@ lower_eh_constructs_1 (struct leh_state *state, gimple_seq *pseq)
>      lower_eh_constructs_2 (state, &gsi);
>  }
>
> -static unsigned int
> -lower_eh_constructs (void)
> +namespace {
> +
> +const pass_data pass_data_lower_eh =
> +{
> +  GIMPLE_PASS, /* type */
> +  "eh", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_EH, /* tv_id */
> +  PROP_gimple_lcf, /* properties_required */
> +  PROP_gimple_leh, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_lower_eh : public gimple_opt_pass
> +{
> +public:
> +  pass_lower_eh (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_lower_eh, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_lower_eh
> +
> +unsigned int
> +pass_lower_eh::execute (function *fun)
>  {
>    struct leh_state null_state;
>    gimple_seq bodyp;
> @@ -2155,7 +2183,7 @@ lower_eh_constructs (void)
>
>    /* If this function needs a language specific EH personality routine
>       and the frontend didn't already set one do so now.  */
> -  if (function_needs_eh_personality (cfun) == eh_personality_lang
> +  if (function_needs_eh_personality (fun) == eh_personality_lang
>        && !DECL_FUNCTION_PERSONALITY (current_function_decl))
>      DECL_FUNCTION_PERSONALITY (current_function_decl)
>        = lang_hooks.eh_personality ();
> @@ -2163,34 +2191,6 @@ lower_eh_constructs (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_lower_eh =
> -{
> -  GIMPLE_PASS, /* type */
> -  "eh", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_EH, /* tv_id */
> -  PROP_gimple_lcf, /* properties_required */
> -  PROP_gimple_leh, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_lower_eh : public gimple_opt_pass
> -{
> -public:
> -  pass_lower_eh (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_lower_eh, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  unsigned int execute () { return lower_eh_constructs (); }
> -
> -}; // class pass_lower_eh
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -3108,13 +3108,6 @@ refactor_eh_r (gimple_seq seq)
>      }
>  }
>
> -static unsigned
> -refactor_eh (void)
> -{
> -  refactor_eh_r (gimple_body (current_function_decl));
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_refactor_eh =
> @@ -3140,7 +3133,11 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_exceptions != 0; }
> -  unsigned int execute () { return refactor_eh (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      refactor_eh_r (gimple_body (current_function_decl));
> +      return 0;
> +    }
>
>  }; // class pass_refactor_eh
>
> @@ -3304,37 +3301,6 @@ lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
>    return ret;
>  }
>
> -static unsigned
> -execute_lower_resx (void)
> -{
> -  basic_block bb;
> -  struct pointer_map_t *mnt_map;
> -  bool dominance_invalidated = false;
> -  bool any_rewritten = false;
> -
> -  mnt_map = pointer_map_create ();
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      gimple last = last_stmt (bb);
> -      if (last && is_gimple_resx (last))
> -       {
> -         dominance_invalidated |= lower_resx (bb, last, mnt_map);
> -         any_rewritten = true;
> -       }
> -    }
> -
> -  pointer_map_destroy (mnt_map);
> -
> -  if (dominance_invalidated)
> -    {
> -      free_dominance_info (CDI_DOMINATORS);
> -      free_dominance_info (CDI_POST_DOMINATORS);
> -    }
> -
> -  return any_rewritten ? TODO_update_ssa_only_virtuals : 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_lower_resx =
> @@ -3360,10 +3326,41 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_exceptions != 0; }
> -  unsigned int execute () { return execute_lower_resx (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_lower_resx
>
> +unsigned
> +pass_lower_resx::execute (function *fun)
> +{
> +  basic_block bb;
> +  struct pointer_map_t *mnt_map;
> +  bool dominance_invalidated = false;
> +  bool any_rewritten = false;
> +
> +  mnt_map = pointer_map_create ();
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      gimple last = last_stmt (bb);
> +      if (last && is_gimple_resx (last))
> +       {
> +         dominance_invalidated |= lower_resx (bb, last, mnt_map);
> +         any_rewritten = true;
> +       }
> +    }
> +
> +  pointer_map_destroy (mnt_map);
> +
> +  if (dominance_invalidated)
> +    {
> +      free_dominance_info (CDI_DOMINATORS);
> +      free_dominance_info (CDI_POST_DOMINATORS);
> +    }
> +
> +  return any_rewritten ? TODO_update_ssa_only_virtuals : 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -3704,8 +3701,37 @@ lower_eh_dispatch (basic_block src, gimple stmt)
>    return redirected;
>  }
>
> -static unsigned
> -execute_lower_eh_dispatch (void)
> +namespace {
> +
> +const pass_data pass_data_lower_eh_dispatch =
> +{
> +  GIMPLE_PASS, /* type */
> +  "ehdisp", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_EH, /* tv_id */
> +  PROP_gimple_lcf, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_flow, /* todo_flags_finish */
> +};
> +
> +class pass_lower_eh_dispatch : public gimple_opt_pass
> +{
> +public:
> +  pass_lower_eh_dispatch (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_lower_eh_dispatch, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *fun) { return fun->eh->region_tree != NULL; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_lower_eh_dispatch
> +
> +unsigned
> +pass_lower_eh_dispatch::execute (function *fun)
>  {
>    basic_block bb;
>    int flags = 0;
> @@ -3713,7 +3739,7 @@ execute_lower_eh_dispatch (void)
>
>    assign_filter_values ();
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple last = last_stmt (bb);
>        if (last == NULL)
> @@ -3737,36 +3763,6 @@ execute_lower_eh_dispatch (void)
>    return flags;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_lower_eh_dispatch =
> -{
> -  GIMPLE_PASS, /* type */
> -  "ehdisp", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_EH, /* tv_id */
> -  PROP_gimple_lcf, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_flow, /* todo_flags_finish */
> -};
> -
> -class pass_lower_eh_dispatch : public gimple_opt_pass
> -{
> -public:
> -  pass_lower_eh_dispatch (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_lower_eh_dispatch, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *fun) { return fun->eh->region_tree != NULL; }
> -
> -  unsigned int execute () { return execute_lower_eh_dispatch (); }
> -
> -}; // class pass_lower_eh_dispatch
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -4564,21 +4560,6 @@ execute_cleanup_eh_1 (void)
>    return 0;
>  }
>
> -static unsigned int
> -execute_cleanup_eh (void)
> -{
> -  int ret = execute_cleanup_eh_1 ();
> -
> -  /* If the function no longer needs an EH personality routine
> -     clear it.  This exposes cross-language inlining opportunities
> -     and avoids references to a never defined personality routine.  */
> -  if (DECL_FUNCTION_PERSONALITY (current_function_decl)
> -      && function_needs_eh_personality (cfun) != eh_personality_lang)
> -    DECL_FUNCTION_PERSONALITY (current_function_decl) = NULL_TREE;
> -
> -  return ret;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_cleanup_eh =
> @@ -4609,10 +4590,25 @@ public:
>        return fun->eh != NULL && fun->eh->region_tree != NULL;
>      }
>
> -  unsigned int execute () { return execute_cleanup_eh (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_cleanup_eh
>
> +unsigned int
> +pass_cleanup_eh::execute (function *fun)
> +{
> +  int ret = execute_cleanup_eh_1 ();
> +
> +  /* If the function no longer needs an EH personality routine
> +     clear it.  This exposes cross-language inlining opportunities
> +     and avoids references to a never defined personality routine.  */
> +  if (DECL_FUNCTION_PERSONALITY (current_function_decl)
> +      && function_needs_eh_personality (fun) != eh_personality_lang)
> +    DECL_FUNCTION_PERSONALITY (current_function_decl) = NULL_TREE;
> +
> +  return ret;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-emutls.c b/gcc/tree-emutls.c
> index 280a606..0ed503a 100644
> --- a/gcc/tree-emutls.c
> +++ b/gcc/tree-emutls.c
> @@ -846,7 +846,7 @@ public:
>        return !targetm.have_tls;
>      }
>
> -  unsigned int execute () { return ipa_lower_emutls (); }
> +  virtual unsigned int execute (function *) { return ipa_lower_emutls (); }
>
>  }; // class pass_ipa_lower_emutls
>
> diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
> index 90b62a8..21a9f05 100644
> --- a/gcc/tree-if-conv.c
> +++ b/gcc/tree-if-conv.c
> @@ -1986,33 +1986,6 @@ tree_if_conversion (struct loop *loop)
>
>  /* Tree if-conversion pass management.  */
>
> -static unsigned int
> -main_tree_if_conversion (void)
> -{
> -  struct loop *loop;
> -  unsigned todo = 0;
> -
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  FOR_EACH_LOOP (loop, 0)
> -    if (flag_tree_loop_if_convert == 1
> -       || flag_tree_loop_if_convert_stores == 1
> -       || ((flag_tree_loop_vectorize || loop->force_vectorize)
> -           && !loop->dont_vectorize))
> -      todo |= tree_if_conversion (loop);
> -
> -#ifdef ENABLE_CHECKING
> -  {
> -    basic_block bb;
> -    FOR_EACH_BB_FN (bb, cfun)
> -      gcc_assert (!bb->aux);
> -  }
> -#endif
> -
> -  return todo;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_if_conversion =
> @@ -2039,7 +2012,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return main_tree_if_conversion (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_if_conversion
>
> @@ -2052,6 +2025,33 @@ pass_if_conversion::gate (function *fun)
>           || flag_tree_loop_if_convert_stores == 1);
>  }
>
> +unsigned int
> +pass_if_conversion::execute (function *fun)
> +{
> +  struct loop *loop;
> +  unsigned todo = 0;
> +
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  FOR_EACH_LOOP (loop, 0)
> +    if (flag_tree_loop_if_convert == 1
> +       || flag_tree_loop_if_convert_stores == 1
> +       || ((flag_tree_loop_vectorize || loop->force_vectorize)
> +           && !loop->dont_vectorize))
> +      todo |= tree_if_conversion (loop);
> +
> +#ifdef ENABLE_CHECKING
> +  {
> +    basic_block bb;
> +    FOR_EACH_BB_FN (bb, fun)
> +      gcc_assert (!bb->aux);
> +  }
> +#endif
> +
> +  return todo;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
> index 332901d..8fc4193 100644
> --- a/gcc/tree-into-ssa.c
> +++ b/gcc/tree-into-ssa.c
> @@ -2299,15 +2299,49 @@ fini_ssa_renamer (void)
>     Steps 3 and 4 are done using the dominator tree walker
>     (walk_dominator_tree).  */
>
> -static unsigned int
> -rewrite_into_ssa (void)
> +namespace {
> +
> +const pass_data pass_data_build_ssa =
> +{
> +  GIMPLE_PASS, /* type */
> +  "ssa", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_SSA_OTHER, /* tv_id */
> +  PROP_cfg, /* properties_required */
> +  PROP_ssa, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_verify_ssa | TODO_remove_unused_locals ), /* todo_flags_finish */
> +};
> +
> +class pass_build_ssa : public gimple_opt_pass
> +{
> +public:
> +  pass_build_ssa (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_build_ssa, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *fun)
> +    {
> +      /* Do nothing for funcions that was produced already in SSA form.  */
> +      return !(fun->curr_properties & PROP_ssa);
> +    }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_build_ssa
> +
> +unsigned int
> +pass_build_ssa::execute (function *fun)
>  {
>    bitmap_head *dfs;
>    basic_block bb;
>    unsigned i;
>
>    /* Initialize operand data structures.  */
> -  init_ssa_operands (cfun);
> +  init_ssa_operands (fun);
>
>    /* Initialize internal data needed by the renamer.  */
>    init_ssa_renamer ();
> @@ -2315,12 +2349,12 @@ rewrite_into_ssa (void)
>    /* Initialize the set of interesting blocks.  The callback
>       mark_def_sites will add to this set those blocks that the renamer
>       should process.  */
> -  interesting_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
> +  interesting_blocks = sbitmap_alloc (last_basic_block_for_fn (fun));
>    bitmap_clear (interesting_blocks);
>
>    /* Initialize dominance frontier.  */
> -  dfs = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
> -  FOR_EACH_BB_FN (bb, cfun)
> +  dfs = XNEWVEC (bitmap_head, last_basic_block_for_fn (fun));
> +  FOR_EACH_BB_FN (bb, fun)
>      bitmap_initialize (&dfs[bb->index], &bitmap_default_obstack);
>
>    /* 1- Compute dominance frontiers.  */
> @@ -2328,16 +2362,16 @@ rewrite_into_ssa (void)
>    compute_dominance_frontiers (dfs);
>
>    /* 2- Find and mark definition sites.  */
> -  mark_def_dom_walker (CDI_DOMINATORS).walk (cfun->cfg->x_entry_block_ptr);
> +  mark_def_dom_walker (CDI_DOMINATORS).walk (fun->cfg->x_entry_block_ptr);
>
>    /* 3- Insert PHI nodes at dominance frontiers of definition blocks.  */
>    insert_phi_nodes (dfs);
>
>    /* 4- Rename all the blocks.  */
> -  rewrite_blocks (ENTRY_BLOCK_PTR_FOR_FN (cfun), REWRITE_ALL);
> +  rewrite_blocks (ENTRY_BLOCK_PTR_FOR_FN (fun), REWRITE_ALL);
>
>    /* Free allocated memory.  */
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      bitmap_clear (&dfs[bb->index]);
>    free (dfs);
>
> @@ -2365,40 +2399,6 @@ rewrite_into_ssa (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_build_ssa =
> -{
> -  GIMPLE_PASS, /* type */
> -  "ssa", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_SSA_OTHER, /* tv_id */
> -  PROP_cfg, /* properties_required */
> -  PROP_ssa, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_verify_ssa | TODO_remove_unused_locals ), /* todo_flags_finish */
> -};
> -
> -class pass_build_ssa : public gimple_opt_pass
> -{
> -public:
> -  pass_build_ssa (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_build_ssa, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> -    {
> -      /* Do nothing for funcions that was produced already in SSA form.  */
> -      return !(fun->curr_properties & PROP_ssa);
> -    }
> -
> -  unsigned int execute () { return rewrite_into_ssa (); }
> -
> -}; // class pass_build_ssa
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
> index 0a15412..5fff7be 100644
> --- a/gcc/tree-loop-distribution.c
> +++ b/gcc/tree-loop-distribution.c
> @@ -1669,15 +1669,49 @@ distribute_loop (struct loop *loop, vec<gimple> stmts,
>
>  /* Distribute all loops in the current function.  */
>
> -static unsigned int
> -tree_loop_distribution (void)
> +namespace {
> +
> +const pass_data pass_data_loop_distribution =
> +{
> +  GIMPLE_PASS, /* type */
> +  "ldist", /* name */
> +  OPTGROUP_LOOP, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_LOOP_DISTRIBUTION, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_loop_distribution : public gimple_opt_pass
> +{
> +public:
> +  pass_loop_distribution (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_loop_distribution, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *)
> +    {
> +      return flag_tree_loop_distribution
> +       || flag_tree_loop_distribute_patterns;
> +    }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_loop_distribution
> +
> +unsigned int
> +pass_loop_distribution::execute (function *fun)
>  {
>    struct loop *loop;
>    bool changed = false;
>    basic_block bb;
>    control_dependences *cd = NULL;
>
> -  FOR_ALL_BB_FN (bb, cfun)
> +  FOR_ALL_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator gsi;
>        for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> @@ -1715,7 +1749,7 @@ tree_loop_distribution (void)
>               if (virtual_operand_p (gimple_phi_result (phi)))
>                 continue;
>               /* Distribute stmts which have defs that are used outside of
> -                the loop.  */
> +                the loop.  */
>               if (!stmt_has_scalar_dependences_outside_loop (loop, phi))
>                 continue;
>               work_list.safe_push (phi);
> @@ -1725,7 +1759,7 @@ tree_loop_distribution (void)
>               gimple stmt = gsi_stmt (gsi);
>
>               /* If there is a stmt with side-effects bail out - we
> -                cannot and should not distribute this loop.  */
> +                cannot and should not distribute this loop.  */
>               if (gimple_has_side_effects (stmt))
>                 {
>                   work_list.truncate (0);
> @@ -1733,7 +1767,7 @@ tree_loop_distribution (void)
>                 }
>
>               /* Distribute stmts which have defs that are used outside of
> -                the loop.  */
> +                the loop.  */
>               if (stmt_has_scalar_dependences_outside_loop (loop, stmt))
>                 ;
>               /* Otherwise only distribute stores for now.  */
> @@ -1779,7 +1813,7 @@ out:
>
>    if (changed)
>      {
> -      mark_virtual_operands_for_renaming (cfun);
> +      mark_virtual_operands_for_renaming (fun);
>        rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
>      }
>
> @@ -1790,40 +1824,6 @@ out:
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_loop_distribution =
> -{
> -  GIMPLE_PASS, /* type */
> -  "ldist", /* name */
> -  OPTGROUP_LOOP, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_LOOP_DISTRIBUTION, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_loop_distribution : public gimple_opt_pass
> -{
> -public:
> -  pass_loop_distribution (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_loop_distribution, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *)
> -    {
> -      return flag_tree_loop_distribution
> -       || flag_tree_loop_distribute_patterns;
> -    }
> -
> -  unsigned int execute () { return tree_loop_distribution (); }
> -
> -}; // class pass_loop_distribution
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-nrv.c b/gcc/tree-nrv.c
> index 71f8d68..45b16f4 100644
> --- a/gcc/tree-nrv.c
> +++ b/gcc/tree-nrv.c
> @@ -113,8 +113,38 @@ finalize_nrv_r (tree *tp, int *walk_subtrees, void *data)
>     then we could either have the languages register the optimization or
>     we could change the gating function to check the current language.  */
>
> -static unsigned int
> -tree_nrv (void)
> +namespace {
> +
> +const pass_data pass_data_nrv =
> +{
> +  GIMPLE_PASS, /* type */
> +  "nrv", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_NRV, /* tv_id */
> +  ( PROP_ssa | PROP_cfg ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_nrv : public gimple_opt_pass
> +{
> +public:
> +  pass_nrv (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_nrv, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return optimize > 0; }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_nrv
> +
> +unsigned int
> +pass_nrv::execute (function *fun)
>  {
>    tree result = DECL_RESULT (current_function_decl);
>    tree result_type = TREE_TYPE (result);
> @@ -144,7 +174,7 @@ tree_nrv (void)
>      return 0;
>
>    /* Look through each block for assignments to the RESULT_DECL.  */
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>         {
> @@ -238,7 +268,7 @@ tree_nrv (void)
>       RESULT.  */
>    data.var = found;
>    data.result = result;
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
>         {
> @@ -272,36 +302,6 @@ tree_nrv (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_nrv =
> -{
> -  GIMPLE_PASS, /* type */
> -  "nrv", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_NRV, /* tv_id */
> -  ( PROP_ssa | PROP_cfg ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_nrv : public gimple_opt_pass
> -{
> -public:
> -  pass_nrv (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_nrv, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize > 0; }
> -
> -  unsigned int execute () { return tree_nrv (); }
> -
> -}; // class pass_nrv
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -347,35 +347,6 @@ dest_safe_for_nrv_p (gimple call)
>     escaped prior to the call.  If it has, modifications to the local
>     variable will produce visible changes elsewhere, as in PR c++/19317.  */
>
> -static unsigned int
> -execute_return_slot_opt (void)
> -{
> -  basic_block bb;
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      gimple_stmt_iterator gsi;
> -      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> -       {
> -         gimple stmt = gsi_stmt (gsi);
> -         bool slot_opt_p;
> -
> -         if (is_gimple_call (stmt)
> -             && gimple_call_lhs (stmt)
> -             && !gimple_call_return_slot_opt_p (stmt)
> -             && aggregate_value_p (TREE_TYPE (gimple_call_lhs (stmt)),
> -                                   gimple_call_fndecl (stmt)))
> -           {
> -             /* Check if the location being assigned to is
> -                clobbered by the call.  */
> -             slot_opt_p = dest_safe_for_nrv_p (stmt);
> -             gimple_call_set_return_slot_opt (stmt, slot_opt_p);
> -           }
> -       }
> -    }
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_return_slot =
> @@ -400,10 +371,39 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return execute_return_slot_opt (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_return_slot
>
> +unsigned int
> +pass_return_slot::execute (function *fun)
> +{
> +  basic_block bb;
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      gimple_stmt_iterator gsi;
> +      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> +       {
> +         gimple stmt = gsi_stmt (gsi);
> +         bool slot_opt_p;
> +
> +         if (is_gimple_call (stmt)
> +             && gimple_call_lhs (stmt)
> +             && !gimple_call_return_slot_opt_p (stmt)
> +             && aggregate_value_p (TREE_TYPE (gimple_call_lhs (stmt)),
> +                                   gimple_call_fndecl (stmt)))
> +           {
> +             /* Check if the location being assigned to is
> +                clobbered by the call.  */
> +             slot_opt_p = dest_safe_for_nrv_p (stmt);
> +             gimple_call_set_return_slot_opt (stmt, slot_opt_p);
> +           }
> +       }
> +    }
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c
> index 23f7250..ec50709 100644
> --- a/gcc/tree-object-size.c
> +++ b/gcc/tree-object-size.c
> @@ -66,7 +66,6 @@ static bool merge_object_sizes (struct object_size_info *, tree, tree,
>                                 unsigned HOST_WIDE_INT);
>  static bool plus_stmt_object_size (struct object_size_info *, tree, gimple);
>  static bool cond_expr_object_size (struct object_size_info *, tree, gimple);
> -static unsigned int compute_object_sizes (void);
>  static void init_offset_limit (void);
>  static void check_for_plus_in_loops (struct object_size_info *, tree);
>  static void check_for_plus_in_loops_1 (struct object_size_info *, tree,
> @@ -1207,11 +1206,40 @@ fini_object_sizes (void)
>
>  /* Simple pass to optimize all __builtin_object_size () builtins.  */
>
> -static unsigned int
> -compute_object_sizes (void)
> +namespace {
> +
> +const pass_data pass_data_object_sizes =
> +{
> +  GIMPLE_PASS, /* type */
> +  "objsz", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_object_sizes : public gimple_opt_pass
> +{
> +public:
> +  pass_object_sizes (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_object_sizes, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_object_sizes (m_ctxt); }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_object_sizes
> +
> +unsigned int
> +pass_object_sizes::execute (function *fun)
>  {
>    basic_block bb;
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator i;
>        for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
> @@ -1281,35 +1309,6 @@ compute_object_sizes (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_object_sizes =
> -{
> -  GIMPLE_PASS, /* type */
> -  "objsz", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_object_sizes : public gimple_opt_pass
> -{
> -public:
> -  pass_object_sizes (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_object_sizes, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_object_sizes (m_ctxt); }
> -  unsigned int execute () { return compute_object_sizes (); }
> -
> -}; // class pass_object_sizes
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
> index a46fa51..79b327b 100644
> --- a/gcc/tree-parloops.c
> +++ b/gcc/tree-parloops.c
> @@ -2253,17 +2253,6 @@ parallelize_loops (void)
>
>  /* Parallelization.  */
>
> -static unsigned
> -tree_parallelize_loops (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  if (parallelize_loops ())
> -    return TODO_cleanup_cfg | TODO_rebuild_alias;
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_parallelize_loops =
> @@ -2289,10 +2278,21 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tree_parallelize_loops > 1; }
> -  unsigned int execute () { return tree_parallelize_loops (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_parallelize_loops
>
> +unsigned
> +pass_parallelize_loops::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  if (parallelize_loops ())
> +    return TODO_cleanup_cfg | TODO_rebuild_alias;
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
> index 9de2822..e63f306 100644
> --- a/gcc/tree-pass.h
> +++ b/gcc/tree-pass.h
> @@ -96,7 +96,7 @@ public:
>       be sub-passes otherwise this pass does nothing.
>       The return value contains TODOs to execute in addition to those in
>       TODO_flags_finish.   */
> -  virtual unsigned int execute ();
> +  virtual unsigned int execute (function *fun);
>
>  protected:
>    opt_pass (const pass_data&, gcc::context *);
> diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c
> index 7dd86e1..4d77401 100644
> --- a/gcc/tree-predcom.c
> +++ b/gcc/tree-predcom.c
> @@ -2598,7 +2598,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_predictive_commoning != 0; }
> -  unsigned int execute () { return run_tree_predictive_commoning (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return run_tree_predictive_commoning ();
> +    }
>
>  }; // class pass_predcom
>
> diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
> index b7d0466..deefa8b 100644
> --- a/gcc/tree-profile.c
> +++ b/gcc/tree-profile.c
> @@ -688,7 +688,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *);
> -  unsigned int execute () { return tree_profiling (); }
> +  virtual unsigned int execute (function *) { return tree_profiling (); }
>
>  }; // class pass_ipa_tree_profile
>
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index 27f71a3..890234f 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -3525,7 +3525,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_intra_sra (); }
> -  unsigned int execute () { return early_intra_sra (); }
> +  virtual unsigned int execute (function *) { return early_intra_sra (); }
>
>  }; // class pass_sra_early
>
> @@ -3562,7 +3562,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_intra_sra (); }
> -  unsigned int execute () { return late_intra_sra (); }
> +  virtual unsigned int execute (function *) { return late_intra_sra (); }
>
>  }; // class pass_sra
>
> @@ -5076,7 +5076,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_ipa_sra && dbg_cnt (eipa_sra); }
> -  unsigned int execute () { return ipa_early_sra (); }
> +  virtual unsigned int execute (function *) { return ipa_early_sra (); }
>
>  }; // class pass_early_ipa_sra
>
> diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
> index c4a5c71..257d108 100644
> --- a/gcc/tree-ssa-ccp.c
> +++ b/gcc/tree-ssa-ccp.c
> @@ -2314,7 +2314,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_ccp (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_ccp != 0; }
> -  unsigned int execute () { return do_ssa_ccp (); }
> +  virtual unsigned int execute (function *) { return do_ssa_ccp (); }
>
>  }; // class pass_ccp
>
> @@ -2559,14 +2559,43 @@ optimize_unreachable (gimple_stmt_iterator i)
>  /* A simple pass that attempts to fold all builtin functions.  This pass
>     is run after we've propagated as many constants as we can.  */
>
> -static unsigned int
> -execute_fold_all_builtins (void)
> +namespace {
> +
> +const pass_data pass_data_fold_builtins =
> +{
> +  GIMPLE_PASS, /* type */
> +  "fab", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_verify_ssa | TODO_update_ssa ), /* todo_flags_finish */
> +};
> +
> +class pass_fold_builtins : public gimple_opt_pass
> +{
> +public:
> +  pass_fold_builtins (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_fold_builtins, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_fold_builtins (m_ctxt); }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_fold_builtins
> +
> +unsigned int
> +pass_fold_builtins::execute (function *fun)
>  {
>    bool cfg_changed = false;
>    basic_block bb;
>    unsigned int todoflags = 0;
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator i;
>        for (i = gsi_start_bb (bb); !gsi_end_p (i); )
> @@ -2608,7 +2637,7 @@ execute_fold_all_builtins (void)
>           result = gimple_fold_builtin (stmt);
>
>           if (result)
> -           gimple_remove_stmt_histograms (cfun, stmt);
> +           gimple_remove_stmt_histograms (fun, stmt);
>
>           if (!result)
>             switch (DECL_FUNCTION_CODE (callee))
> @@ -2703,36 +2732,6 @@ execute_fold_all_builtins (void)
>    return todoflags;
>  }
>
> -
> -namespace {
> -
> -const pass_data pass_data_fold_builtins =
> -{
> -  GIMPLE_PASS, /* type */
> -  "fab", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_verify_ssa | TODO_update_ssa ), /* todo_flags_finish */
> -};
> -
> -class pass_fold_builtins : public gimple_opt_pass
> -{
> -public:
> -  pass_fold_builtins (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_fold_builtins, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_fold_builtins (m_ctxt); }
> -  unsigned int execute () { return execute_fold_all_builtins (); }
> -
> -}; // class pass_fold_builtins
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c
> index bd6ac04..6e3a569 100644
> --- a/gcc/tree-ssa-copy.c
> +++ b/gcc/tree-ssa-copy.c
> @@ -671,7 +671,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_copy_prop != 0; }
> -  unsigned int execute () { return execute_copy_prop (); }
> +  virtual unsigned int execute (function *) { return execute_copy_prop (); }
>
>  }; // class pass_copy_prop
>
> diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c
> index 65d8044..b9c9ba3 100644
> --- a/gcc/tree-ssa-copyrename.c
> +++ b/gcc/tree-ssa-copyrename.c
> @@ -299,14 +299,44 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)
>  }
>
>
> +namespace {
> +
> +const pass_data pass_data_rename_ssa_copies =
> +{
> +  GIMPLE_PASS, /* type */
> +  "copyrename", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_COPY_RENAME, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_rename_ssa_copies : public gimple_opt_pass
> +{
> +public:
> +  pass_rename_ssa_copies (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_rename_ssa_copies, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_rename_ssa_copies (m_ctxt); }
> +  virtual bool gate (function *) { return flag_tree_copyrename != 0; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_rename_ssa_copies
> +
>  /* This function will make a pass through the IL, and attempt to coalesce any
>     SSA versions which occur in PHI's or copies.  Coalescing is accomplished by
>     changing the underlying root variable of all coalesced version.  This will
>     then cause the SSA->normal pass to attempt to coalesce them all to the same
>     variable.  */
>
> -static unsigned int
> -rename_ssa_copies (void)
> +unsigned int
> +pass_rename_ssa_copies::execute (function *fun)
>  {
>    var_map map;
>    basic_block bb;
> @@ -325,7 +355,7 @@ rename_ssa_copies (void)
>
>    map = init_var_map (num_ssa_names);
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        /* Scan for real copies.  */
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> @@ -341,7 +371,7 @@ rename_ssa_copies (void)
>         }
>      }
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        /* Treat PHI nodes as copies between the result and each argument.  */
>        for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> @@ -429,42 +459,12 @@ rename_ssa_copies (void)
>        replace_ssa_name_symbol (var, SSA_NAME_VAR (part_var));
>      }
>
> -  statistics_counter_event (cfun, "copies coalesced",
> +  statistics_counter_event (fun, "copies coalesced",
>                             stats.coalesced);
>    delete_var_map (map);
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_rename_ssa_copies =
> -{
> -  GIMPLE_PASS, /* type */
> -  "copyrename", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_COPY_RENAME, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_rename_ssa_copies : public gimple_opt_pass
> -{
> -public:
> -  pass_rename_ssa_copies (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_rename_ssa_copies, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_rename_ssa_copies (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_copyrename != 0; }
> -  unsigned int execute () { return rename_ssa_copies (); }
> -
> -}; // class pass_rename_ssa_copies
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
> index e5799b9..6389f23 100644
> --- a/gcc/tree-ssa-dce.c
> +++ b/gcc/tree-ssa-dce.c
> @@ -1530,7 +1530,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_dce (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_dce != 0; }
> -  unsigned int execute () { return tree_ssa_dce (); }
> +  virtual unsigned int execute (function *) { return tree_ssa_dce (); }
>
>  }; // class pass_dce
>
> @@ -1568,7 +1568,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_dce_loop (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_dce != 0; }
> -  unsigned int execute () { return tree_ssa_dce_loop (); }
> +  virtual unsigned int execute (function *) { return tree_ssa_dce_loop (); }
>
>  }; // class pass_dce_loop
>
> @@ -1606,7 +1606,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_cd_dce (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_dce != 0; }
> -  unsigned int execute () { return tree_ssa_cd_dce (); }
> +  virtual unsigned int execute (function *) { return tree_ssa_cd_dce (); }
>
>  }; // class pass_cd_dce
>
> diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
> index b9cc5cc..15c4fb0 100644
> --- a/gcc/tree-ssa-dom.c
> +++ b/gcc/tree-ssa-dom.c
> @@ -832,8 +832,40 @@ private:
>     every new symbol exposed, its corresponding bit will be set in
>     VARS_TO_RENAME.  */
>
> -static unsigned int
> -tree_ssa_dominator_optimize (void)
> +namespace {
> +
> +const pass_data pass_data_dominator =
> +{
> +  GIMPLE_PASS, /* type */
> +  "dom", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_cleanup_cfg | TODO_update_ssa
> +    | TODO_verify_ssa
> +    | TODO_verify_flow ), /* todo_flags_finish */
> +};
> +
> +class pass_dominator : public gimple_opt_pass
> +{
> +public:
> +  pass_dominator (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_dominator, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_dominator (m_ctxt); }
> +  virtual bool gate (function *) { return flag_tree_dom != 0; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_dominator
> +
> +unsigned int
> +pass_dominator::execute (function *fun)
>  {
>    memset (&opt_stats, 0, sizeof (opt_stats));
>
> @@ -867,12 +899,12 @@ tree_ssa_dominator_optimize (void)
>    mark_dfs_back_edges ();
>
>    /* Recursively walk the dominator tree optimizing statements.  */
> -  dom_opt_dom_walker (CDI_DOMINATORS).walk (cfun->cfg->x_entry_block_ptr);
> +  dom_opt_dom_walker (CDI_DOMINATORS).walk (fun->cfg->x_entry_block_ptr);
>
>    {
>      gimple_stmt_iterator gsi;
>      basic_block bb;
> -    FOR_EACH_BB_FN (bb, cfun)
> +    FOR_EACH_BB_FN (bb, fun)
>        {
>         for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>           update_stmt_if_modified (gsi_stmt (gsi));
> @@ -908,13 +940,13 @@ tree_ssa_dominator_optimize (void)
>          iterator.  */
>        EXECUTE_IF_SET_IN_BITMAP (need_eh_cleanup, 0, i, bi)
>         {
> -         basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
> +         basic_block bb = BASIC_BLOCK_FOR_FN (fun, i);
>           if (bb == NULL)
>             continue;
>           while (single_succ_p (bb)
>                  && (single_succ_edge (bb)->flags & EDGE_EH) == 0)
>             bb = single_succ (bb);
> -         if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
> +         if (bb == EXIT_BLOCK_PTR_FOR_FN (fun))
>             continue;
>           if ((unsigned) bb->index != i)
>             bitmap_set_bit (need_eh_cleanup, bb->index);
> @@ -924,11 +956,11 @@ tree_ssa_dominator_optimize (void)
>        bitmap_clear (need_eh_cleanup);
>      }
>
> -  statistics_counter_event (cfun, "Redundant expressions eliminated",
> +  statistics_counter_event (fun, "Redundant expressions eliminated",
>                             opt_stats.num_re);
> -  statistics_counter_event (cfun, "Constants propagated",
> +  statistics_counter_event (fun, "Constants propagated",
>                             opt_stats.num_const_prop);
> -  statistics_counter_event (cfun, "Copies propagated",
> +  statistics_counter_event (fun, "Copies propagated",
>                             opt_stats.num_copy_prop);
>
>    /* Debugging dumps.  */
> @@ -952,38 +984,6 @@ tree_ssa_dominator_optimize (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_dominator =
> -{
> -  GIMPLE_PASS, /* type */
> -  "dom", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_cleanup_cfg | TODO_update_ssa
> -    | TODO_verify_ssa
> -    | TODO_verify_flow ), /* todo_flags_finish */
> -};
> -
> -class pass_dominator : public gimple_opt_pass
> -{
> -public:
> -  pass_dominator (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_dominator, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_dominator (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_dom != 0; }
> -  unsigned int execute () { return tree_ssa_dominator_optimize (); }
> -
> -}; // class pass_dominator
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -3025,8 +3025,40 @@ eliminate_degenerate_phis_1 (basic_block bb, bitmap interesting_names)
>     pick up the secondary optimization opportunities with minimal
>     cost.  */
>
> -static unsigned int
> -eliminate_degenerate_phis (void)
> +namespace {
> +
> +const pass_data pass_data_phi_only_cprop =
> +{
> +  GIMPLE_PASS, /* type */
> +  "phicprop", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_PHI_CPROP, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_cleanup_cfg | TODO_verify_ssa
> +    | TODO_verify_stmts
> +    | TODO_update_ssa ), /* todo_flags_finish */
> +};
> +
> +class pass_phi_only_cprop : public gimple_opt_pass
> +{
> +public:
> +  pass_phi_only_cprop (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_phi_only_cprop, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_phi_only_cprop (m_ctxt); }
> +  virtual bool gate (function *) { return flag_tree_dom != 0; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_phi_only_cprop
> +
> +unsigned int
> +pass_phi_only_cprop::execute (function *fun)
>  {
>    bitmap interesting_names;
>    bitmap interesting_names1;
> @@ -3059,7 +3091,7 @@ eliminate_degenerate_phis (void)
>       phase in dominator order.  Presumably this is because walking
>       in dominator order leaves fewer PHIs for later examination
>       by the worklist phase.  */
> -  eliminate_degenerate_phis_1 (ENTRY_BLOCK_PTR_FOR_FN (cfun),
> +  eliminate_degenerate_phis_1 (ENTRY_BLOCK_PTR_FOR_FN (fun),
>                                interesting_names);
>
>    /* Second phase.  Eliminate second order degenerate PHIs as well
> @@ -3109,38 +3141,6 @@ eliminate_degenerate_phis (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_phi_only_cprop =
> -{
> -  GIMPLE_PASS, /* type */
> -  "phicprop", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_PHI_CPROP, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_cleanup_cfg | TODO_verify_ssa
> -    | TODO_verify_stmts
> -    | TODO_update_ssa ), /* todo_flags_finish */
> -};
> -
> -class pass_phi_only_cprop : public gimple_opt_pass
> -{
> -public:
> -  pass_phi_only_cprop (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_phi_only_cprop, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_phi_only_cprop (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_dom != 0; }
> -  unsigned int execute () { return eliminate_degenerate_phis (); }
> -
> -}; // class pass_phi_only_cprop
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
> index b6fbdaf..af69063 100644
> --- a/gcc/tree-ssa-dse.c
> +++ b/gcc/tree-ssa-dse.c
> @@ -80,8 +80,6 @@ along with GCC; see the file COPYING3.  If not see
>     remove their dead edges eventually.  */
>  static bitmap need_eh_cleanup;
>
> -static unsigned int tree_ssa_dse (void);
> -
>
>  /* A helper of dse_optimize_stmt.
>     Given a GIMPLE_ASSIGN in STMT, find a candidate statement *USE_STMT that
> @@ -327,10 +325,38 @@ dse_dom_walker::before_dom_children (basic_block bb)
>      }
>  }
>
> -/* Main entry point.  */
> +namespace {
> +
> +const pass_data pass_data_dse =
> +{
> +  GIMPLE_PASS, /* type */
> +  "dse", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_DSE, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_dse : public gimple_opt_pass
> +{
> +public:
> +  pass_dse (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_dse, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_dse (m_ctxt); }
> +  virtual bool gate (function *) { return flag_tree_dse != 0; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_dse
>
> -static unsigned int
> -tree_ssa_dse (void)
> +unsigned int
> +pass_dse::execute (function *fun)
>  {
>    need_eh_cleanup = BITMAP_ALLOC (NULL);
>
> @@ -345,7 +371,7 @@ tree_ssa_dse (void)
>
>    /* Dead store elimination is fundamentally a walk of the post-dominator
>       tree and a backwards walk of statements within each block.  */
> -  dse_dom_walker (CDI_POST_DOMINATORS).walk (cfun->cfg->x_exit_block_ptr);
> +  dse_dom_walker (CDI_POST_DOMINATORS).walk (fun->cfg->x_exit_block_ptr);
>
>    /* Removal of stores may make some EH edges dead.  Purge such edges from
>       the CFG as needed.  */
> @@ -362,36 +388,6 @@ tree_ssa_dse (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_dse =
> -{
> -  GIMPLE_PASS, /* type */
> -  "dse", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_DSE, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_dse : public gimple_opt_pass
> -{
> -public:
> -  pass_dse (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_dse, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_dse (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_dse != 0; }
> -  unsigned int execute () { return tree_ssa_dse (); }
> -
> -}; // class pass_dse
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
> index 8d5ca5f..a623005 100644
> --- a/gcc/tree-ssa-forwprop.c
> +++ b/gcc/tree-ssa-forwprop.c
> @@ -3567,15 +3567,45 @@ simplify_mult (gimple_stmt_iterator *gsi)
>  /* Main entry point for the forward propagation and statement combine
>     optimizer.  */
>
> -static unsigned int
> -ssa_forward_propagate_and_combine (void)
> +namespace {
> +
> +const pass_data pass_data_forwprop =
> +{
> +  GIMPLE_PASS, /* type */
> +  "forwprop", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_FORWPROP, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_update_ssa | TODO_verify_ssa ), /* todo_flags_finish */
> +};
> +
> +class pass_forwprop : public gimple_opt_pass
> +{
> +public:
> +  pass_forwprop (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_forwprop, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_forwprop (m_ctxt); }
> +  virtual bool gate (function *) { return flag_tree_forwprop; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_forwprop
> +
> +unsigned int
> +pass_forwprop::execute (function *fun)
>  {
>    basic_block bb;
>    unsigned int todoflags = 0;
>
>    cfg_changed = false;
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator gsi;
>
> @@ -3660,7 +3690,7 @@ ssa_forward_propagate_and_combine (void)
>           else if (TREE_CODE_CLASS (code) == tcc_comparison)
>             {
>               if (forward_propagate_comparison (&gsi))
> -               cfg_changed = true;
> +               cfg_changed = true;
>             }
>           else
>             gsi_next (&gsi);
> @@ -3831,36 +3861,6 @@ ssa_forward_propagate_and_combine (void)
>    return todoflags;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_forwprop =
> -{
> -  GIMPLE_PASS, /* type */
> -  "forwprop", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_FORWPROP, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_update_ssa | TODO_verify_ssa ), /* todo_flags_finish */
> -};
> -
> -class pass_forwprop : public gimple_opt_pass
> -{
> -public:
> -  pass_forwprop (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_forwprop, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_forwprop (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_forwprop; }
> -  unsigned int execute () { return ssa_forward_propagate_and_combine (); }
> -
> -}; // class pass_forwprop
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c
> index b901f37..0ce02a0 100644
> --- a/gcc/tree-ssa-ifcombine.c
> +++ b/gcc/tree-ssa-ifcombine.c
> @@ -723,8 +723,36 @@ tree_ssa_ifcombine_bb (basic_block inner_cond_bb)
>
>  /* Main entry for the tree if-conversion pass.  */
>
> -static unsigned int
> -tree_ssa_ifcombine (void)
> +namespace {
> +
> +const pass_data pass_data_tree_ifcombine =
> +{
> +  GIMPLE_PASS, /* type */
> +  "ifcombine", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_IFCOMBINE, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_update_ssa | TODO_verify_ssa ), /* todo_flags_finish */
> +};
> +
> +class pass_tree_ifcombine : public gimple_opt_pass
> +{
> +public:
> +  pass_tree_ifcombine (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_tree_ifcombine, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_tree_ifcombine
> +
> +unsigned int
> +pass_tree_ifcombine::execute (function *fun)
>  {
>    basic_block *bbs;
>    bool cfg_changed = false;
> @@ -741,7 +769,7 @@ tree_ssa_ifcombine (void)
>       inner ones, and also that we do not try to visit a removed
>       block.  This is opposite of PHI-OPT, because we cascade the
>       combining rather than cascading PHIs. */
> -  for (i = n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS - 1; i >= 0; i--)
> +  for (i = n_basic_blocks_for_fn (fun) - NUM_FIXED_BLOCKS - 1; i >= 0; i--)
>      {
>        basic_block bb = bbs[i];
>        gimple stmt = last_stmt (bb);
> @@ -756,34 +784,6 @@ tree_ssa_ifcombine (void)
>    return cfg_changed ? TODO_cleanup_cfg : 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_tree_ifcombine =
> -{
> -  GIMPLE_PASS, /* type */
> -  "ifcombine", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_IFCOMBINE, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_update_ssa | TODO_verify_ssa ), /* todo_flags_finish */
> -};
> -
> -class pass_tree_ifcombine : public gimple_opt_pass
> -{
> -public:
> -  pass_tree_ifcombine (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_tree_ifcombine, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  unsigned int execute () { return tree_ssa_ifcombine (); }
> -
> -}; // class pass_tree_ifcombine
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c
> index 34d1f70..fb86de4 100644
> --- a/gcc/tree-ssa-loop-ch.c
> +++ b/gcc/tree-ssa-loop-ch.c
> @@ -131,8 +131,38 @@ do_while_loop_p (struct loop *loop)
>     of the loop.  This is beneficial since it increases efficiency of
>     code motion optimizations.  It also saves one jump on entry to the loop.  */
>
> -static unsigned int
> -copy_loop_headers (void)
> +namespace {
> +
> +const pass_data pass_data_ch =
> +{
> +  GIMPLE_PASS, /* type */
> +  "ch", /* name */
> +  OPTGROUP_LOOP, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_CH, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_cleanup_cfg | TODO_verify_ssa
> +    | TODO_verify_flow ), /* todo_flags_finish */
> +};
> +
> +class pass_ch : public gimple_opt_pass
> +{
> +public:
> +  pass_ch (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_ch, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return flag_tree_ch != 0; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_ch
> +
> +unsigned int
> +pass_ch::execute (function *fun)
>  {
>    struct loop *loop;
>    basic_block header;
> @@ -143,15 +173,15 @@ copy_loop_headers (void)
>
>    loop_optimizer_init (LOOPS_HAVE_PREHEADERS
>                        | LOOPS_HAVE_SIMPLE_LATCHES);
> -  if (number_of_loops (cfun) <= 1)
> +  if (number_of_loops (fun) <= 1)
>      {
>        loop_optimizer_finalize ();
>        return 0;
>      }
>
> -  bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
> -  copied_bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
> -  bbs_size = n_basic_blocks_for_fn (cfun);
> +  bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (fun));
> +  copied_bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (fun));
> +  bbs_size = n_basic_blocks_for_fn (fun);
>
>    FOR_EACH_LOOP (loop, 0)
>      {
> @@ -257,36 +287,6 @@ copy_loop_headers (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_ch =
> -{
> -  GIMPLE_PASS, /* type */
> -  "ch", /* name */
> -  OPTGROUP_LOOP, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_CH, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_cleanup_cfg | TODO_verify_ssa
> -    | TODO_verify_flow ), /* todo_flags_finish */
> -};
> -
> -class pass_ch : public gimple_opt_pass
> -{
> -public:
> -  pass_ch (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_ch, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_ch != 0; }
> -  unsigned int execute () { return copy_loop_headers (); }
> -
> -}; // class pass_ch
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
> index f38ee95..0b44c97 100644
> --- a/gcc/tree-ssa-loop-im.c
> +++ b/gcc/tree-ssa-loop-im.c
> @@ -2529,15 +2529,6 @@ tree_ssa_lim (void)
>
>  /* Loop invariant motion pass.  */
>
> -static unsigned int
> -tree_ssa_loop_im (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  return tree_ssa_lim ();
> -}
> -
>  namespace {
>
>  const pass_data pass_data_lim =
> @@ -2564,10 +2555,19 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_lim (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_loop_im != 0; }
> -  unsigned int execute () { return tree_ssa_loop_im (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_lim
>
> +unsigned int
> +pass_lim::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  return tree_ssa_lim ();
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c
> index df82816..54ebe25 100644
> --- a/gcc/tree-ssa-loop-ivcanon.c
> +++ b/gcc/tree-ssa-loop-ivcanon.c
> @@ -1256,15 +1256,6 @@ tree_unroll_loops_completely (bool may_increase_size, bool unroll_outer)
>
>  /* Canonical induction variable creation pass.  */
>
> -static unsigned int
> -tree_ssa_loop_ivcanon (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  return canonicalize_induction_variables ();
> -}
> -
>  namespace {
>
>  const pass_data pass_data_iv_canon =
> @@ -1290,10 +1281,19 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tree_loop_ivcanon != 0; }
> -  unsigned int execute () { return tree_ssa_loop_ivcanon (); }
> +  virtual unsigned int execute (function *fun);
>
>  }; // class pass_iv_canon
>
> +unsigned int
> +pass_iv_canon::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  return canonicalize_induction_variables ();
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -1304,17 +1304,6 @@ make_pass_iv_canon (gcc::context *ctxt)
>
>  /* Complete unrolling of loops.  */
>
> -static unsigned int
> -tree_complete_unroll (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  return tree_unroll_loops_completely (flag_unroll_loops
> -                                      || flag_peel_loops
> -                                      || optimize >= 3, true);
> -}
> -
>  namespace {
>
>  const pass_data pass_data_complete_unroll =
> @@ -1339,10 +1328,21 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return tree_complete_unroll (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_complete_unroll
>
> +unsigned int
> +pass_complete_unroll::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  return tree_unroll_loops_completely (flag_unroll_loops
> +                                      || flag_peel_loops
> +                                      || optimize >= 3, true);
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -1353,25 +1353,6 @@ make_pass_complete_unroll (gcc::context *ctxt)
>
>  /* Complete unrolling of inner loops.  */
>
> -static unsigned int
> -tree_complete_unroll_inner (void)
> -{
> -  unsigned ret = 0;
> -
> -  loop_optimizer_init (LOOPS_NORMAL
> -                      | LOOPS_HAVE_RECORDED_EXITS);
> -  if (number_of_loops (cfun) > 1)
> -    {
> -      scev_initialize ();
> -      ret = tree_unroll_loops_completely (optimize >= 3, false);
> -      free_numbers_of_iterations_estimates ();
> -      scev_finalize ();
> -    }
> -  loop_optimizer_finalize ();
> -
> -  return ret;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_complete_unrolli =
> @@ -1397,10 +1378,29 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return optimize >= 2; }
> -  unsigned int execute () { return tree_complete_unroll_inner (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_complete_unrolli
>
> +unsigned int
> +pass_complete_unrolli::execute (function *fun)
> +{
> +  unsigned ret = 0;
> +
> +  loop_optimizer_init (LOOPS_NORMAL
> +                      | LOOPS_HAVE_RECORDED_EXITS);
> +  if (number_of_loops (fun) > 1)
> +    {
> +      scev_initialize ();
> +      ret = tree_unroll_loops_completely (optimize >= 3, false);
> +      free_numbers_of_iterations_estimates ();
> +      scev_finalize ();
> +    }
> +  loop_optimizer_finalize ();
> +
> +  return ret;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-loop-prefetch.c b/gcc/tree-ssa-loop-prefetch.c
> index 17b13d1..1cf650a 100644
> --- a/gcc/tree-ssa-loop-prefetch.c
> +++ b/gcc/tree-ssa-loop-prefetch.c
> @@ -2004,15 +2004,6 @@ tree_ssa_prefetch_arrays (void)
>
>  /* Prefetching.  */
>
> -static unsigned int
> -tree_ssa_loop_prefetch (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  return tree_ssa_prefetch_arrays ();
> -}
> -
>  namespace {
>
>  const pass_data pass_data_loop_prefetch =
> @@ -2038,10 +2029,19 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_prefetch_loop_arrays > 0; }
> -  unsigned int execute () { return tree_ssa_loop_prefetch (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_loop_prefetch
>
> +unsigned int
> +pass_loop_prefetch::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  return tree_ssa_prefetch_arrays ();
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
> index 90bb205..a9a27d7 100644
> --- a/gcc/tree-ssa-loop-unswitch.c
> +++ b/gcc/tree-ssa-loop-unswitch.c
> @@ -402,15 +402,6 @@ tree_unswitch_loop (struct loop *loop,
>
>  /* Loop unswitching pass.  */
>
> -static unsigned int
> -tree_ssa_loop_unswitch (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  return tree_ssa_unswitch_loops ();
> -}
> -
>  namespace {
>
>  const pass_data pass_data_tree_unswitch =
> @@ -436,10 +427,19 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_unswitch_loops != 0; }
> -  unsigned int execute () { return tree_ssa_loop_unswitch (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_tree_unswitch
>
> +unsigned int
> +pass_tree_unswitch::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  return tree_ssa_unswitch_loops ();
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c
> index 38e7b13..ccc8121 100644
> --- a/gcc/tree-ssa-loop.c
> +++ b/gcc/tree-ssa-loop.c
> @@ -82,23 +82,6 @@ make_pass_tree_loop (gcc::context *ctxt)
>
>  /* Loop optimizer initialization.  */
>
> -static unsigned int
> -tree_ssa_loop_init (void)
> -{
> -  loop_optimizer_init (LOOPS_NORMAL
> -                      | LOOPS_HAVE_RECORDED_EXITS);
> -  rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
> -
> -  /* We might discover new loops, e.g. when turning irreducible
> -     regions into reducible.  */
> -  scev_initialize ();
> -
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_tree_loop_init =
> @@ -123,10 +106,27 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return tree_ssa_loop_init (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_tree_loop_init
>
> +unsigned int
> +pass_tree_loop_init::execute (function *fun)
> +{
> +  loop_optimizer_init (LOOPS_NORMAL
> +                      | LOOPS_HAVE_RECORDED_EXITS);
> +  rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
> +
> +  /* We might discover new loops, e.g. when turning irreducible
> +     regions into reducible.  */
> +  scev_initialize ();
> +
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -137,15 +137,6 @@ make_pass_tree_loop_init (gcc::context *ctxt)
>
>  /* Loop autovectorization.  */
>
> -static unsigned int
> -tree_loop_vectorize (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  return vectorize_loops ();
> -}
> -
>  namespace {
>
>  const pass_data pass_data_vectorize =
> @@ -175,10 +166,19 @@ public:
>        return flag_tree_loop_vectorize || fun->has_force_vectorize_loops;
>      }
>
> -  unsigned int execute () { return tree_loop_vectorize (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_vectorize
>
> +unsigned int
> +pass_vectorize::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  return vectorize_loops ();
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -189,16 +189,6 @@ make_pass_vectorize (gcc::context *ctxt)
>
>  /* Check the correctness of the data dependence analyzers.  */
>
> -static unsigned int
> -check_data_deps (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  tree_check_data_deps ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_check_data_deps =
> @@ -224,10 +214,20 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_check_data_deps != 0; }
> -  unsigned int execute () { return check_data_deps (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_check_data_deps
>
> +unsigned int
> +pass_check_data_deps::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  tree_check_data_deps ();
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -264,7 +264,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tree_scev_cprop; }
> -  unsigned int execute () { return scev_const_prop (); }
> +  virtual unsigned int execute (function *) { return scev_const_prop (); }
>
>  }; // class pass_scev_cprop
>
> @@ -278,17 +278,6 @@ make_pass_scev_cprop (gcc::context *ctxt)
>
>  /* Record bounds on numbers of iterations of loops.  */
>
> -static unsigned int
> -tree_ssa_loop_bounds (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  estimate_numbers_of_iterations ();
> -  scev_reset ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_record_bounds =
> @@ -313,10 +302,21 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return tree_ssa_loop_bounds (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_record_bounds
>
> +unsigned int
> +pass_record_bounds::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  estimate_numbers_of_iterations ();
> +  scev_reset ();
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -327,16 +327,6 @@ make_pass_record_bounds (gcc::context *ctxt)
>
>  /* Induction variable optimizations.  */
>
> -static unsigned int
> -tree_ssa_loop_ivopts (void)
> -{
> -  if (number_of_loops (cfun) <= 1)
> -    return 0;
> -
> -  tree_ssa_iv_optimize ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_iv_optimize =
> @@ -362,10 +352,20 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_ivopts != 0; }
> -  unsigned int execute () { return tree_ssa_loop_ivopts (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_iv_optimize
>
> +unsigned int
> +pass_iv_optimize::execute (function *fun)
> +{
> +  if (number_of_loops (fun) <= 1)
> +    return 0;
> +
> +  tree_ssa_iv_optimize ();
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -409,7 +409,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return tree_ssa_loop_done (); }
> +  virtual unsigned int execute (function *) { return tree_ssa_loop_done (); }
>
>  }; // class pass_tree_loop_done
>
> diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
> index fef1b1e..b965ad1 100644
> --- a/gcc/tree-ssa-math-opts.c
> +++ b/gcc/tree-ssa-math-opts.c
> @@ -506,35 +506,65 @@ execute_cse_reciprocals_1 (gimple_stmt_iterator *def_gsi, tree def)
>
>  /* Go through all the floating-point SSA_NAMEs, and call
>     execute_cse_reciprocals_1 on each of them.  */
> -static unsigned int
> -execute_cse_reciprocals (void)
> +namespace {
> +
> +const pass_data pass_data_cse_reciprocals =
> +{
> +  GIMPLE_PASS, /* type */
> +  "recip", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  PROP_ssa, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_update_ssa | TODO_verify_ssa
> +    | TODO_verify_stmts ), /* todo_flags_finish */
> +};
> +
> +class pass_cse_reciprocals : public gimple_opt_pass
> +{
> +public:
> +  pass_cse_reciprocals (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_cse_reciprocals, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return optimize && flag_reciprocal_math; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_cse_reciprocals
> +
> +unsigned int
> +pass_cse_reciprocals::execute (function *fun)
>  {
>    basic_block bb;
>    tree arg;
>
>    occ_pool = create_alloc_pool ("dominators for recip",
>                                 sizeof (struct occurrence),
> -                               n_basic_blocks_for_fn (cfun) / 3 + 1);
> +                               n_basic_blocks_for_fn (fun) / 3 + 1);
>
>    memset (&reciprocal_stats, 0, sizeof (reciprocal_stats));
>    calculate_dominance_info (CDI_DOMINATORS);
>    calculate_dominance_info (CDI_POST_DOMINATORS);
>
>  #ifdef ENABLE_CHECKING
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      gcc_assert (!bb->aux);
>  #endif
>
> -  for (arg = DECL_ARGUMENTS (cfun->decl); arg; arg = DECL_CHAIN (arg))
> +  for (arg = DECL_ARGUMENTS (fun->decl); arg; arg = DECL_CHAIN (arg))
>      if (FLOAT_TYPE_P (TREE_TYPE (arg))
>         && is_gimple_reg (arg))
>        {
> -       tree name = ssa_default_def (cfun, arg);
> +       tree name = ssa_default_def (fun, arg);
>         if (name)
>           execute_cse_reciprocals_1 (NULL, name);
>        }
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator gsi;
>        gimple phi;
> @@ -636,9 +666,9 @@ execute_cse_reciprocals (void)
>         }
>      }
>
> -  statistics_counter_event (cfun, "reciprocal divs inserted",
> +  statistics_counter_event (fun, "reciprocal divs inserted",
>                             reciprocal_stats.rdivs_inserted);
> -  statistics_counter_event (cfun, "reciprocal functions inserted",
> +  statistics_counter_event (fun, "reciprocal functions inserted",
>                             reciprocal_stats.rfuncs_inserted);
>
>    free_dominance_info (CDI_DOMINATORS);
> @@ -647,36 +677,6 @@ execute_cse_reciprocals (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_cse_reciprocals =
> -{
> -  GIMPLE_PASS, /* type */
> -  "recip", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  PROP_ssa, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_update_ssa | TODO_verify_ssa
> -    | TODO_verify_stmts ), /* todo_flags_finish */
> -};
> -
> -class pass_cse_reciprocals : public gimple_opt_pass
> -{
> -public:
> -  pass_cse_reciprocals (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_cse_reciprocals, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize && flag_reciprocal_math; }
> -  unsigned int execute () { return execute_cse_reciprocals (); }
> -
> -}; // class pass_cse_reciprocals
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -1403,8 +1403,44 @@ gimple_expand_builtin_cabs (gimple_stmt_iterator *gsi, location_t loc, tree arg)
>     on the SSA_NAME argument of each of them.  Also expand powi(x,n) into
>     an optimal number of multiplies, when n is a constant.  */
>
> -static unsigned int
> -execute_cse_sincos (void)
> +namespace {
> +
> +const pass_data pass_data_cse_sincos =
> +{
> +  GIMPLE_PASS, /* type */
> +  "sincos", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  PROP_ssa, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_update_ssa | TODO_verify_ssa
> +    | TODO_verify_stmts ), /* todo_flags_finish */
> +};
> +
> +class pass_cse_sincos : public gimple_opt_pass
> +{
> +public:
> +  pass_cse_sincos (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_cse_sincos, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *)
> +    {
> +      /* We no longer require either sincos or cexp, since powi expansion
> +        piggybacks on this pass.  */
> +      return optimize;
> +    }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_cse_sincos
> +
> +unsigned int
> +pass_cse_sincos::execute (function *fun)
>  {
>    basic_block bb;
>    bool cfg_changed = false;
> @@ -1412,7 +1448,7 @@ execute_cse_sincos (void)
>    calculate_dominance_info (CDI_DOMINATORS);
>    memset (&sincos_stats, 0, sizeof (sincos_stats));
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator gsi;
>        bool cleanup_eh = false;
> @@ -1549,49 +1585,13 @@ execute_cse_sincos (void)
>         cfg_changed |= gimple_purge_dead_eh_edges (bb);
>      }
>
> -  statistics_counter_event (cfun, "sincos statements inserted",
> +  statistics_counter_event (fun, "sincos statements inserted",
>                             sincos_stats.inserted);
>
>    free_dominance_info (CDI_DOMINATORS);
>    return cfg_changed ? TODO_cleanup_cfg : 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_cse_sincos =
> -{
> -  GIMPLE_PASS, /* type */
> -  "sincos", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  PROP_ssa, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_update_ssa | TODO_verify_ssa
> -    | TODO_verify_stmts ), /* todo_flags_finish */
> -};
> -
> -class pass_cse_sincos : public gimple_opt_pass
> -{
> -public:
> -  pass_cse_sincos (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_cse_sincos, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *)
> -    {
> -      /* We no longer require either sincos or cexp, since powi expansion
> -        piggybacks on this pass.  */
> -      return optimize;
> -    }
> -
> -  unsigned int execute () { return execute_cse_sincos (); }
> -
> -}; // class pass_cse_sincos
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -1893,8 +1893,41 @@ find_bswap (gimple stmt)
>  /* Find manual byte swap implementations and turn them into a bswap
>     builtin invokation.  */
>
> -static unsigned int
> -execute_optimize_bswap (void)
> +namespace {
> +
> +const pass_data pass_data_optimize_bswap =
> +{
> +  GIMPLE_PASS, /* type */
> +  "bswap", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  PROP_ssa, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_optimize_bswap : public gimple_opt_pass
> +{
> +public:
> +  pass_optimize_bswap (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_optimize_bswap, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *)
> +    {
> +      return flag_expensive_optimizations && optimize;
> +    }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_optimize_bswap
> +
> +unsigned int
> +pass_optimize_bswap::execute (function *fun)
>  {
>    basic_block bb;
>    bool bswap16_p, bswap32_p, bswap64_p;
> @@ -1940,7 +1973,7 @@ execute_optimize_bswap (void)
>
>    memset (&bswap_stats, 0, sizeof (bswap_stats));
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator gsi;
>
> @@ -2046,50 +2079,17 @@ execute_optimize_bswap (void)
>         }
>      }
>
> -  statistics_counter_event (cfun, "16-bit bswap implementations found",
> +  statistics_counter_event (fun, "16-bit bswap implementations found",
>                             bswap_stats.found_16bit);
> -  statistics_counter_event (cfun, "32-bit bswap implementations found",
> +  statistics_counter_event (fun, "32-bit bswap implementations found",
>                             bswap_stats.found_32bit);
> -  statistics_counter_event (cfun, "64-bit bswap implementations found",
> +  statistics_counter_event (fun, "64-bit bswap implementations found",
>                             bswap_stats.found_64bit);
>
>    return (changed ? TODO_update_ssa | TODO_verify_ssa
>           | TODO_verify_stmts : 0);
>  }
>
> -namespace {
> -
> -const pass_data pass_data_optimize_bswap =
> -{
> -  GIMPLE_PASS, /* type */
> -  "bswap", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  PROP_ssa, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_optimize_bswap : public gimple_opt_pass
> -{
> -public:
> -  pass_optimize_bswap (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_optimize_bswap, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *)
> -    {
> -      return flag_expensive_optimizations && optimize;
> -    }
> -
> -  unsigned int execute () { return execute_optimize_bswap (); }
> -
> -}; // class pass_optimize_bswap
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -2775,15 +2775,49 @@ convert_mult_to_fma (gimple mul_stmt, tree op1, tree op2)
>     smaller types, and replace the MULT_EXPR with a WIDEN_MULT_EXPR
>     where appropriate.  */
>
> -static unsigned int
> -execute_optimize_widening_mul (void)
> +namespace {
> +
> +const pass_data pass_data_optimize_widening_mul =
> +{
> +  GIMPLE_PASS, /* type */
> +  "widening_mul", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  PROP_ssa, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_verify_ssa | TODO_verify_stmts
> +    | TODO_update_ssa ), /* todo_flags_finish */
> +};
> +
> +class pass_optimize_widening_mul : public gimple_opt_pass
> +{
> +public:
> +  pass_optimize_widening_mul (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_optimize_widening_mul, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *)
> +    {
> +      return flag_expensive_optimizations && optimize;
> +    }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_optimize_widening_mul
> +
> +unsigned int
> +pass_optimize_widening_mul::execute (function *fun)
>  {
>    basic_block bb;
>    bool cfg_changed = false;
>
>    memset (&widen_mul_stats, 0, sizeof (widen_mul_stats));
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator gsi;
>
> @@ -2854,50 +2888,16 @@ execute_optimize_widening_mul (void)
>         }
>      }
>
> -  statistics_counter_event (cfun, "widening multiplications inserted",
> +  statistics_counter_event (fun, "widening multiplications inserted",
>                             widen_mul_stats.widen_mults_inserted);
> -  statistics_counter_event (cfun, "widening maccs inserted",
> +  statistics_counter_event (fun, "widening maccs inserted",
>                             widen_mul_stats.maccs_inserted);
> -  statistics_counter_event (cfun, "fused multiply-adds inserted",
> +  statistics_counter_event (fun, "fused multiply-adds inserted",
>                             widen_mul_stats.fmas_inserted);
>
>    return cfg_changed ? TODO_cleanup_cfg : 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_optimize_widening_mul =
> -{
> -  GIMPLE_PASS, /* type */
> -  "widening_mul", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  PROP_ssa, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_verify_ssa | TODO_verify_stmts
> -    | TODO_update_ssa ), /* todo_flags_finish */
> -};
> -
> -class pass_optimize_widening_mul : public gimple_opt_pass
> -{
> -public:
> -  pass_optimize_widening_mul (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_optimize_widening_mul, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *)
> -    {
> -      return flag_expensive_optimizations && optimize;
> -    }
> -
> -  unsigned int execute () { return execute_optimize_widening_mul (); }
> -
> -}; // class pass_optimize_widening_mul
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
> index 1ee39a5..9b5b563 100644
> --- a/gcc/tree-ssa-phiopt.c
> +++ b/gcc/tree-ssa-phiopt.c
> @@ -59,7 +59,6 @@ along with GCC; see the file COPYING3.  If not see
>  #define HAVE_conditional_move (0)
>  #endif
>
> -static unsigned int tree_ssa_phiopt (void);
>  static unsigned int tree_ssa_phiopt_worker (bool, bool);
>  static bool conditional_replacement (basic_block, basic_block,
>                                      edge, edge, gimple, tree, tree);
> @@ -80,162 +79,6 @@ static void hoist_adjacent_loads (basic_block, basic_block,
>                                   basic_block, basic_block);
>  static bool gate_hoist_loads (void);
>
> -/* This pass tries to replaces an if-then-else block with an
> -   assignment.  We have four kinds of transformations.  Some of these
> -   transformations are also performed by the ifcvt RTL optimizer.
> -
> -   Conditional Replacement
> -   -----------------------
> -
> -   This transformation, implemented in conditional_replacement,
> -   replaces
> -
> -     bb0:
> -      if (cond) goto bb2; else goto bb1;
> -     bb1:
> -     bb2:
> -      x = PHI <0 (bb1), 1 (bb0), ...>;
> -
> -   with
> -
> -     bb0:
> -      x' = cond;
> -      goto bb2;
> -     bb2:
> -      x = PHI <x' (bb0), ...>;
> -
> -   We remove bb1 as it becomes unreachable.  This occurs often due to
> -   gimplification of conditionals.
> -
> -   Value Replacement
> -   -----------------
> -
> -   This transformation, implemented in value_replacement, replaces
> -
> -     bb0:
> -       if (a != b) goto bb2; else goto bb1;
> -     bb1:
> -     bb2:
> -       x = PHI <a (bb1), b (bb0), ...>;
> -
> -   with
> -
> -     bb0:
> -     bb2:
> -       x = PHI <b (bb0), ...>;
> -
> -   This opportunity can sometimes occur as a result of other
> -   optimizations.
> -
> -
> -   Another case caught by value replacement looks like this:
> -
> -     bb0:
> -       t1 = a == CONST;
> -       t2 = b > c;
> -       t3 = t1 & t2;
> -       if (t3 != 0) goto bb1; else goto bb2;
> -     bb1:
> -     bb2:
> -       x = PHI (CONST, a)
> -
> -   Gets replaced with:
> -     bb0:
> -     bb2:
> -       t1 = a == CONST;
> -       t2 = b > c;
> -       t3 = t1 & t2;
> -       x = a;
> -
> -   ABS Replacement
> -   ---------------
> -
> -   This transformation, implemented in abs_replacement, replaces
> -
> -     bb0:
> -       if (a >= 0) goto bb2; else goto bb1;
> -     bb1:
> -       x = -a;
> -     bb2:
> -       x = PHI <x (bb1), a (bb0), ...>;
> -
> -   with
> -
> -     bb0:
> -       x' = ABS_EXPR< a >;
> -     bb2:
> -       x = PHI <x' (bb0), ...>;
> -
> -   MIN/MAX Replacement
> -   -------------------
> -
> -   This transformation, minmax_replacement replaces
> -
> -     bb0:
> -       if (a <= b) goto bb2; else goto bb1;
> -     bb1:
> -     bb2:
> -       x = PHI <b (bb1), a (bb0), ...>;
> -
> -   with
> -
> -     bb0:
> -       x' = MIN_EXPR (a, b)
> -     bb2:
> -       x = PHI <x' (bb0), ...>;
> -
> -   A similar transformation is done for MAX_EXPR.
> -
> -
> -   This pass also performs a fifth transformation of a slightly different
> -   flavor.
> -
> -   Adjacent Load Hoisting
> -   ----------------------
> -
> -   This transformation replaces
> -
> -     bb0:
> -       if (...) goto bb2; else goto bb1;
> -     bb1:
> -       x1 = (<expr>).field1;
> -       goto bb3;
> -     bb2:
> -       x2 = (<expr>).field2;
> -     bb3:
> -       # x = PHI <x1, x2>;
> -
> -   with
> -
> -     bb0:
> -       x1 = (<expr>).field1;
> -       x2 = (<expr>).field2;
> -       if (...) goto bb2; else goto bb1;
> -     bb1:
> -       goto bb3;
> -     bb2:
> -     bb3:
> -       # x = PHI <x1, x2>;
> -
> -   The purpose of this transformation is to enable generation of conditional
> -   move instructions such as Intel CMOVE or PowerPC ISEL.  Because one of
> -   the loads is speculative, the transformation is restricted to very
> -   specific cases to avoid introducing a page fault.  We are looking for
> -   the common idiom:
> -
> -     if (...)
> -       x = y->left;
> -     else
> -       x = y->right;
> -
> -   where left and right are typically adjacent pointers in a tree structure.  */
> -
> -static unsigned int
> -tree_ssa_phiopt (void)
> -{
> -  return tree_ssa_phiopt_worker (false, gate_hoist_loads ());
> -}
> -
>  /* This pass tries to transform conditional stores into unconditional
>     ones, enabling further simplifications with the simpler then and else
>     blocks.  In particular it replaces this:
> @@ -2200,8 +2043,155 @@ gate_hoist_loads (void)
>           && HAVE_conditional_move);
>  }
>
> -/* Always do these optimizations if we have SSA
> -   trees to work on.  */
> +/* This pass tries to replaces an if-then-else block with an
> +   assignment.  We have four kinds of transformations.  Some of these
> +   transformations are also performed by the ifcvt RTL optimizer.
> +
> +   Conditional Replacement
> +   -----------------------
> +
> +   This transformation, implemented in conditional_replacement,
> +   replaces
> +
> +     bb0:
> +      if (cond) goto bb2; else goto bb1;
> +     bb1:
> +     bb2:
> +      x = PHI <0 (bb1), 1 (bb0), ...>;
> +
> +   with
> +
> +     bb0:
> +      x' = cond;
> +      goto bb2;
> +     bb2:
> +      x = PHI <x' (bb0), ...>;
> +
> +   We remove bb1 as it becomes unreachable.  This occurs often due to
> +   gimplification of conditionals.
> +
> +   Value Replacement
> +   -----------------
> +
> +   This transformation, implemented in value_replacement, replaces
> +
> +     bb0:
> +       if (a != b) goto bb2; else goto bb1;
> +     bb1:
> +     bb2:
> +       x = PHI <a (bb1), b (bb0), ...>;
> +
> +   with
> +
> +     bb0:
> +     bb2:
> +       x = PHI <b (bb0), ...>;
> +
> +   This opportunity can sometimes occur as a result of other
> +   optimizations.
> +
> +
> +   Another case caught by value replacement looks like this:
> +
> +     bb0:
> +       t1 = a == CONST;
> +       t2 = b > c;
> +       t3 = t1 & t2;
> +       if (t3 != 0) goto bb1; else goto bb2;
> +     bb1:
> +     bb2:
> +       x = PHI (CONST, a)
> +
> +   Gets replaced with:
> +     bb0:
> +     bb2:
> +       t1 = a == CONST;
> +       t2 = b > c;
> +       t3 = t1 & t2;
> +       x = a;
> +
> +   ABS Replacement
> +   ---------------
> +
> +   This transformation, implemented in abs_replacement, replaces
> +
> +     bb0:
> +       if (a >= 0) goto bb2; else goto bb1;
> +     bb1:
> +       x = -a;
> +     bb2:
> +       x = PHI <x (bb1), a (bb0), ...>;
> +
> +   with
> +
> +     bb0:
> +       x' = ABS_EXPR< a >;
> +     bb2:
> +       x = PHI <x' (bb0), ...>;
> +
> +   MIN/MAX Replacement
> +   -------------------
> +
> +   This transformation, minmax_replacement replaces
> +
> +     bb0:
> +       if (a <= b) goto bb2; else goto bb1;
> +     bb1:
> +     bb2:
> +       x = PHI <b (bb1), a (bb0), ...>;
> +
> +   with
> +
> +     bb0:
> +       x' = MIN_EXPR (a, b)
> +     bb2:
> +       x = PHI <x' (bb0), ...>;
> +
> +   A similar transformation is done for MAX_EXPR.
> +
> +
> +   This pass also performs a fifth transformation of a slightly different
> +   flavor.
> +
> +   Adjacent Load Hoisting
> +   ----------------------
> +
> +   This transformation replaces
> +
> +     bb0:
> +       if (...) goto bb2; else goto bb1;
> +     bb1:
> +       x1 = (<expr>).field1;
> +       goto bb3;
> +     bb2:
> +       x2 = (<expr>).field2;
> +     bb3:
> +       # x = PHI <x1, x2>;
> +
> +   with
> +
> +     bb0:
> +       x1 = (<expr>).field1;
> +       x2 = (<expr>).field2;
> +       if (...) goto bb2; else goto bb1;
> +     bb1:
> +       goto bb3;
> +     bb2:
> +     bb3:
> +       # x = PHI <x1, x2>;
> +
> +   The purpose of this transformation is to enable generation of conditional
> +   move instructions such as Intel CMOVE or PowerPC ISEL.  Because one of
> +   the loads is speculative, the transformation is restricted to very
> +   specific cases to avoid introducing a page fault.  We are looking for
> +   the common idiom:
> +
> +     if (...)
> +       x = y->left;
> +     else
> +       x = y->right;
> +
> +   where left and right are typically adjacent pointers in a tree structure.  */
>
>  namespace {
>
> @@ -2229,7 +2219,10 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_phiopt (m_ctxt); }
> -  unsigned int execute () { return tree_ssa_phiopt (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return tree_ssa_phiopt_worker (false, gate_hoist_loads ());
> +    }
>
>  }; // class pass_phiopt
>
> @@ -2267,7 +2260,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tree_cselim; }
> -  unsigned int execute () { return tree_ssa_cs_elim (); }
> +  virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); }
>
>  }; // class pass_cselim
>
> diff --git a/gcc/tree-ssa-phiprop.c b/gcc/tree-ssa-phiprop.c
> index cbdbc6e..0154b47 100644
> --- a/gcc/tree-ssa-phiprop.c
> +++ b/gcc/tree-ssa-phiprop.c
> @@ -374,8 +374,37 @@ next:;
>
>  /* Main entry for phiprop pass.  */
>
> -static unsigned int
> -tree_ssa_phiprop (void)
> +namespace {
> +
> +const pass_data pass_data_phiprop =
> +{
> +  GIMPLE_PASS, /* type */
> +  "phiprop", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_PHIPROP, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_update_ssa | TODO_verify_ssa ), /* todo_flags_finish */
> +};
> +
> +class pass_phiprop : public gimple_opt_pass
> +{
> +public:
> +  pass_phiprop (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_phiprop, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return flag_tree_phiprop; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_phiprop
> +
> +unsigned int
> +pass_phiprop::execute (function *fun)
>  {
>    vec<basic_block> bbs;
>    struct phiprop_d *phivn;
> @@ -393,7 +422,7 @@ tree_ssa_phiprop (void)
>
>    /* Walk the dominator tree in preorder.  */
>    bbs = get_all_dominated_blocks (CDI_DOMINATORS,
> -                                 single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
> +                                 single_succ (ENTRY_BLOCK_PTR_FOR_FN (fun)));
>    FOR_EACH_VEC_ELT (bbs, i, bb)
>      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>        did_something |= propagate_with_phi (bb, gsi_stmt (gsi), phivn, n);
> @@ -409,35 +438,6 @@ tree_ssa_phiprop (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_phiprop =
> -{
> -  GIMPLE_PASS, /* type */
> -  "phiprop", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_PHIPROP, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_update_ssa | TODO_verify_ssa ), /* todo_flags_finish */
> -};
> -
> -class pass_phiprop : public gimple_opt_pass
> -{
> -public:
> -  pass_phiprop (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_phiprop, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_phiprop; }
> -  unsigned int execute () { return tree_ssa_phiprop (); }
> -
> -}; // class pass_phiprop
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
> index cda315a..b5785d8 100644
> --- a/gcc/tree-ssa-pre.c
> +++ b/gcc/tree-ssa-pre.c
> @@ -4690,15 +4690,44 @@ fini_pre ()
>    free_dominance_info (CDI_POST_DOMINATORS);
>  }
>
> -/* Gate and execute functions for PRE.  */
> +namespace {
>
> -static unsigned int
> -do_pre (void)
> +const pass_data pass_data_pre =
> +{
> +  GIMPLE_PASS, /* type */
> +  "pre", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_PRE, /* tv_id */
> +  /* PROP_no_crit_edges is ensured by placing pass_split_crit_edges before
> +     pass_pre.  */
> +  ( PROP_no_crit_edges | PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  PROP_no_crit_edges, /* properties_destroyed */
> +  TODO_rebuild_alias, /* todo_flags_start */
> +  TODO_verify_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_pre : public gimple_opt_pass
> +{
> +public:
> +  pass_pre (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_pre, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return flag_tree_pre != 0; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_pre
> +
> +unsigned int
> +pass_pre::execute (function *fun)
>  {
>    unsigned int todo = 0;
>
>    do_partial_partial =
> -    flag_tree_partial_pre && optimize_function_for_speed_p (cfun);
> +    flag_tree_partial_pre && optimize_function_for_speed_p (fun);
>
>    /* This has to happen before SCCVN runs because
>       loop_optimizer_init may create new phis, etc.  */
> @@ -4721,7 +4750,7 @@ do_pre (void)
>       fixed, don't run it when he have an incredibly large number of
>       bb's.  If we aren't going to run insert, there is no point in
>       computing ANTIC, either, even though it's plenty fast.  */
> -  if (n_basic_blocks_for_fn (cfun) < 4000)
> +  if (n_basic_blocks_for_fn (fun) < 4000)
>      {
>        compute_antic ();
>        insert ();
> @@ -4736,10 +4765,10 @@ do_pre (void)
>    /* Remove all the redundant expressions.  */
>    todo |= eliminate ();
>
> -  statistics_counter_event (cfun, "Insertions", pre_stats.insertions);
> -  statistics_counter_event (cfun, "PA inserted", pre_stats.pa_insert);
> -  statistics_counter_event (cfun, "New PHIs", pre_stats.phis);
> -  statistics_counter_event (cfun, "Eliminated", pre_stats.eliminations);
> +  statistics_counter_event (fun, "Insertions", pre_stats.insertions);
> +  statistics_counter_event (fun, "PA inserted", pre_stats.pa_insert);
> +  statistics_counter_event (fun, "New PHIs", pre_stats.phis);
> +  statistics_counter_event (fun, "Eliminated", pre_stats.eliminations);
>
>    clear_expression_ids ();
>    remove_dead_inserted_code ();
> @@ -4771,37 +4800,6 @@ do_pre (void)
>    return todo;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_pre =
> -{
> -  GIMPLE_PASS, /* type */
> -  "pre", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_PRE, /* tv_id */
> -  /* PROP_no_crit_edges is ensured by placing pass_split_crit_edges before
> -     pass_pre.  */
> -  ( PROP_no_crit_edges | PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  PROP_no_crit_edges, /* properties_destroyed */
> -  TODO_rebuild_alias, /* todo_flags_start */
> -  TODO_verify_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_pre : public gimple_opt_pass
> -{
> -public:
> -  pass_pre (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_pre, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_pre != 0; }
> -  unsigned int execute () { return do_pre (); }
> -
> -}; // class pass_pre
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -4810,32 +4808,6 @@ make_pass_pre (gcc::context *ctxt)
>    return new pass_pre (ctxt);
>  }
>
> -
> -/* Gate and execute functions for FRE.  */
> -
> -static unsigned int
> -execute_fre (void)
> -{
> -  unsigned int todo = 0;
> -
> -  if (!run_scc_vn (VN_WALKREWRITE))
> -    return 0;
> -
> -  memset (&pre_stats, 0, sizeof (pre_stats));
> -
> -  /* Remove all the redundant expressions.  */
> -  todo |= eliminate ();
> -
> -  todo |= fini_eliminate ();
> -
> -  free_scc_vn ();
> -
> -  statistics_counter_event (cfun, "Insertions", pre_stats.insertions);
> -  statistics_counter_event (cfun, "Eliminated", pre_stats.eliminations);
> -
> -  return todo;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_fre =
> @@ -4862,10 +4834,33 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_fre (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_fre != 0; }
> -  unsigned int execute () { return execute_fre (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_fre
>
> +unsigned int
> +pass_fre::execute (function *fun)
> +{
> +  unsigned int todo = 0;
> +
> +  if (!run_scc_vn (VN_WALKREWRITE))
> +    return 0;
> +
> +  memset (&pre_stats, 0, sizeof (pre_stats));
> +
> +  /* Remove all the redundant expressions.  */
> +  todo |= eliminate ();
> +
> +  todo |= fini_eliminate ();
> +
> +  free_scc_vn ();
> +
> +  statistics_counter_event (fun, "Insertions", pre_stats.insertions);
> +  statistics_counter_event (fun, "Eliminated", pre_stats.eliminations);
> +
> +  return todo;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
> index 92a215a..84b681e 100644
> --- a/gcc/tree-ssa-reassoc.c
> +++ b/gcc/tree-ssa-reassoc.c
> @@ -4693,7 +4693,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_reassoc (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_reassoc != 0; }
> -  unsigned int execute () { return execute_reassoc (); }
> +  virtual unsigned int execute (function *) { return execute_reassoc (); }
>
>  }; // class pass_reassoc
>
> diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c
> index 6803160..7992ced 100644
> --- a/gcc/tree-ssa-sink.c
> +++ b/gcc/tree-ssa-sink.c
> @@ -563,31 +563,6 @@ sink_code_in_bb (basic_block bb)
>     Note that this reduces the number of computations of a = b + c to 1
>     when we take the else edge, instead of 2.
>  */
> -static void
> -execute_sink_code (void)
> -{
> -  loop_optimizer_init (LOOPS_NORMAL);
> -  split_critical_edges ();
> -  connect_infinite_loops_to_exit ();
> -  memset (&sink_stats, 0, sizeof (sink_stats));
> -  calculate_dominance_info (CDI_DOMINATORS);
> -  calculate_dominance_info (CDI_POST_DOMINATORS);
> -  sink_code_in_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
> -  statistics_counter_event (cfun, "Sunk statements", sink_stats.sunk);
> -  free_dominance_info (CDI_POST_DOMINATORS);
> -  remove_fake_exit_edges ();
> -  loop_optimizer_finalize ();
> -}
> -
> -/* Gate and execute functions for PRE.  */
> -
> -static unsigned int
> -do_sink (void)
> -{
> -  execute_sink_code ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_sink_code =
> @@ -598,7 +573,7 @@ const pass_data pass_data_sink_code =
>    true, /* has_execute */
>    TV_TREE_SINK, /* tv_id */
>    /* PROP_no_crit_edges is ensured by running split_critical_edges in
> -     execute_sink_code.  */
> +     pass_data_sink_code::execute ().  */
>    ( PROP_cfg | PROP_ssa ), /* properties_required */
>    0, /* properties_provided */
>    0, /* properties_destroyed */
> @@ -616,10 +591,28 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tree_sink != 0; }
> -  unsigned int execute () { return do_sink (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_sink_code
>
> +unsigned int
> +pass_sink_code::execute (function *fun)
> +{
> +  loop_optimizer_init (LOOPS_NORMAL);
> +  split_critical_edges ();
> +  connect_infinite_loops_to_exit ();
> +  memset (&sink_stats, 0, sizeof (sink_stats));
> +  calculate_dominance_info (CDI_DOMINATORS);
> +  calculate_dominance_info (CDI_POST_DOMINATORS);
> +  sink_code_in_bb (EXIT_BLOCK_PTR_FOR_FN (fun));
> +  statistics_counter_event (fun, "Sunk statements", sink_stats.sunk);
> +  free_dominance_info (CDI_POST_DOMINATORS);
> +  remove_fake_exit_edges ();
> +  loop_optimizer_finalize ();
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
> index fb83093..1cc36d8 100644
> --- a/gcc/tree-ssa-strlen.c
> +++ b/gcc/tree-ssa-strlen.c
> @@ -2061,34 +2061,6 @@ strlen_dom_walker::after_dom_children (basic_block bb)
>
>  /* Main entry point.  */
>
> -static unsigned int
> -tree_ssa_strlen (void)
> -{
> -  ssa_ver_to_stridx.safe_grow_cleared (num_ssa_names);
> -  max_stridx = 1;
> -  strinfo_pool = create_alloc_pool ("strinfo_struct pool",
> -                                   sizeof (struct strinfo_struct), 64);
> -
> -  calculate_dominance_info (CDI_DOMINATORS);
> -
> -  /* String length optimization is implemented as a walk of the dominator
> -     tree and a forward walk of statements within each block.  */
> -  strlen_dom_walker (CDI_DOMINATORS).walk (cfun->cfg->x_entry_block_ptr);
> -
> -  ssa_ver_to_stridx.release ();
> -  free_alloc_pool (strinfo_pool);
> -  if (decl_to_stridxlist_htab.is_created ())
> -    {
> -      obstack_free (&stridx_obstack, NULL);
> -      decl_to_stridxlist_htab.dispose ();
> -    }
> -  laststmt.stmt = NULL;
> -  laststmt.len = NULL_TREE;
> -  laststmt.stridx = 0;
> -
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_strlen =
> @@ -2114,10 +2086,38 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_optimize_strlen != 0; }
> -  unsigned int execute () { return tree_ssa_strlen (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_strlen
>
> +unsigned int
> +pass_strlen::execute (function *fun)
> +{
> +  ssa_ver_to_stridx.safe_grow_cleared (num_ssa_names);
> +  max_stridx = 1;
> +  strinfo_pool = create_alloc_pool ("strinfo_struct pool",
> +                                   sizeof (struct strinfo_struct), 64);
> +
> +  calculate_dominance_info (CDI_DOMINATORS);
> +
> +  /* String length optimization is implemented as a walk of the dominator
> +     tree and a forward walk of statements within each block.  */
> +  strlen_dom_walker (CDI_DOMINATORS).walk (fun->cfg->x_entry_block_ptr);
> +
> +  ssa_ver_to_stridx.release ();
> +  free_alloc_pool (strinfo_pool);
> +  if (decl_to_stridxlist_htab.is_created ())
> +    {
> +      obstack_free (&stridx_obstack, NULL);
> +      decl_to_stridxlist_htab.dispose ();
> +    }
> +  laststmt.stmt = NULL;
> +  laststmt.len = NULL_TREE;
> +  laststmt.stridx = 0;
> +
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
> index 3548ac5..2686ba6 100644
> --- a/gcc/tree-ssa-structalias.c
> +++ b/gcc/tree-ssa-structalias.c
> @@ -7444,7 +7444,7 @@ public:
>               && !seen_error ());
>      }
>
> -  unsigned int execute () { return ipa_pta_execute (); }
> +  virtual unsigned int execute (function *) { return ipa_pta_execute (); }
>
>  }; // class pass_ipa_pta
>
> diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c
> index e39ce88..52c568a 100644
> --- a/gcc/tree-ssa-uncprop.c
> +++ b/gcc/tree-ssa-uncprop.c
> @@ -383,47 +383,6 @@ private:
>    auto_vec<tree, 2> m_equiv_stack;
>  };
>
> -/* Main driver for un-cprop.  */
> -
> -static unsigned int
> -tree_ssa_uncprop (void)
> -{
> -  basic_block bb;
> -
> -  associate_equivalences_with_edges ();
> -
> -  /* Create our global data structures.  */
> -  val_ssa_equiv.create (1024);
> -
> -  /* We're going to do a dominator walk, so ensure that we have
> -     dominance information.  */
> -  calculate_dominance_info (CDI_DOMINATORS);
> -
> -  /* Recursively walk the dominator tree undoing unprofitable
> -     constant/copy propagations.  */
> -  uncprop_dom_walker (CDI_DOMINATORS).walk (cfun->cfg->x_entry_block_ptr);
> -
> -  /* we just need to empty elements out of the hash table, and cleanup the
> -    AUX field on the edges.  */
> -  val_ssa_equiv.dispose ();
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      edge e;
> -      edge_iterator ei;
> -
> -      FOR_EACH_EDGE (e, ei, bb->succs)
> -       {
> -         if (e->aux)
> -           {
> -             free (e->aux);
> -             e->aux = NULL;
> -           }
> -       }
> -    }
> -  return 0;
> -}
> -
> -
>  /* We have finished processing the dominator children of BB, perform
>     any finalization actions in preparation for leaving this node in
>     the dominator tree.  */
> @@ -607,10 +566,48 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_uncprop (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_dom != 0; }
> -  unsigned int execute () { return tree_ssa_uncprop (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_uncprop
>
> +unsigned int
> +pass_uncprop::execute (function *fun)
> +{
> +  basic_block bb;
> +
> +  associate_equivalences_with_edges ();
> +
> +  /* Create our global data structures.  */
> +  val_ssa_equiv.create (1024);
> +
> +  /* We're going to do a dominator walk, so ensure that we have
> +     dominance information.  */
> +  calculate_dominance_info (CDI_DOMINATORS);
> +
> +  /* Recursively walk the dominator tree undoing unprofitable
> +     constant/copy propagations.  */
> +  uncprop_dom_walker (CDI_DOMINATORS).walk (fun->cfg->x_entry_block_ptr);
> +
> +  /* we just need to empty elements out of the hash table, and cleanup the
> +    AUX field on the edges.  */
> +  val_ssa_equiv.dispose ();
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      edge e;
> +      edge_iterator ei;
> +
> +      FOR_EACH_EDGE (e, ei, bb->succs)
> +       {
> +         if (e->aux)
> +           {
> +             free (e->aux);
> +             e->aux = NULL;
> +           }
> +       }
> +    }
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-ssa-uninit.c b/gcc/tree-ssa-uninit.c
> index 03ff3b8..5477bb8 100644
> --- a/gcc/tree-ssa-uninit.c
> +++ b/gcc/tree-ssa-uninit.c
> @@ -2282,11 +2282,44 @@ warn_uninitialized_phi (gimple phi, vec<gimple> *worklist,
>
>  }
>
> +static bool
> +gate_warn_uninitialized (void)
> +{
> +  return warn_uninitialized || warn_maybe_uninitialized;
> +}
>
> -/* Entry point to the late uninitialized warning pass.  */
> +namespace {
>
> -static unsigned int
> -execute_late_warn_uninitialized (void)
> +const pass_data pass_data_late_warn_uninitialized =
> +{
> +  GIMPLE_PASS, /* type */
> +  "uninit", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  PROP_ssa, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_late_warn_uninitialized : public gimple_opt_pass
> +{
> +public:
> +  pass_late_warn_uninitialized (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_late_warn_uninitialized, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  opt_pass * clone () { return new pass_late_warn_uninitialized (m_ctxt); }
> +  virtual bool gate (function *) { return gate_warn_uninitialized (); }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_late_warn_uninitialized
> +
> +unsigned int
> +pass_late_warn_uninitialized::execute (function *fun)
>  {
>    basic_block bb;
>    gimple_stmt_iterator gsi;
> @@ -2306,34 +2339,34 @@ execute_late_warn_uninitialized (void)
>    added_to_worklist = pointer_set_create ();
>
>    /* Initialize worklist  */
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>        {
> -        gimple phi = gsi_stmt (gsi);
> -        size_t n, i;
> -
> -        n = gimple_phi_num_args (phi);
> -
> -        /* Don't look at virtual operands.  */
> -        if (virtual_operand_p (gimple_phi_result (phi)))
> -          continue;
> -
> -        for (i = 0; i < n; ++i)
> -          {
> -            tree op = gimple_phi_arg_def (phi, i);
> -            if (TREE_CODE (op) == SSA_NAME
> -                && uninit_undefined_value_p (op))
> -              {
> -                worklist.safe_push (phi);
> +       gimple phi = gsi_stmt (gsi);
> +       size_t n, i;
> +
> +       n = gimple_phi_num_args (phi);
> +
> +       /* Don't look at virtual operands.  */
> +       if (virtual_operand_p (gimple_phi_result (phi)))
> +         continue;
> +
> +       for (i = 0; i < n; ++i)
> +         {
> +           tree op = gimple_phi_arg_def (phi, i);
> +           if (TREE_CODE (op) == SSA_NAME
> +               && uninit_undefined_value_p (op))
> +             {
> +               worklist.safe_push (phi);
>                 pointer_set_insert (added_to_worklist, phi);
> -                if (dump_file && (dump_flags & TDF_DETAILS))
> -                  {
> -                    fprintf (dump_file, "[WORKLIST]: add to initial list: ");
> -                    print_gimple_stmt (dump_file, phi, 0, 0);
> -                  }
> -                break;
> -              }
> -          }
> +               if (dump_file && (dump_flags & TDF_DETAILS))
> +                 {
> +                   fprintf (dump_file, "[WORKLIST]: add to initial list: ");
> +                   print_gimple_stmt (dump_file, phi, 0, 0);
> +                 }
> +               break;
> +             }
> +         }
>        }
>
>    while (worklist.length () != 0)
> @@ -2352,42 +2385,6 @@ execute_late_warn_uninitialized (void)
>    return 0;
>  }
>
> -static bool
> -gate_warn_uninitialized (void)
> -{
> -  return warn_uninitialized || warn_maybe_uninitialized;
> -}
> -
> -namespace {
> -
> -const pass_data pass_data_late_warn_uninitialized =
> -{
> -  GIMPLE_PASS, /* type */
> -  "uninit", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  PROP_ssa, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_late_warn_uninitialized : public gimple_opt_pass
> -{
> -public:
> -  pass_late_warn_uninitialized (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_late_warn_uninitialized, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_late_warn_uninitialized (m_ctxt); }
> -  virtual bool gate (function *) { return gate_warn_uninitialized (); }
> -  unsigned int execute () { return execute_late_warn_uninitialized (); }
> -
> -}; // class pass_late_warn_uninitialized
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -2442,7 +2439,10 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_warn_uninitialized (); }
> -  unsigned int execute () { return execute_early_warn_uninitialized (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_early_warn_uninitialized ();
> +    }
>
>  }; // class pass_early_warn_uninitialized
>
> diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
> index 52126ca..1ea639d 100644
> --- a/gcc/tree-ssa.c
> +++ b/gcc/tree-ssa.c
> @@ -1169,7 +1169,10 @@ public:
>        return !(fun->curr_properties & PROP_ssa);
>      }
>
> -  unsigned int execute () { return execute_init_datastructures (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return execute_init_datastructures ();
> +    }
>
>  }; // class pass_init_datastructures
>
> diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c
> index b18b688..02db6a5 100644
> --- a/gcc/tree-ssanames.c
> +++ b/gcc/tree-ssanames.c
> @@ -569,39 +569,6 @@ replace_ssa_name_symbol (tree ssa_name, tree sym)
>  /* Return SSA names that are unused to GGC memory and compact the SSA
>     version namespace.  This is used to keep footprint of compiler during
>     interprocedural optimization.  */
> -static unsigned int
> -release_dead_ssa_names (void)
> -{
> -  unsigned i, j;
> -  int n = vec_safe_length (FREE_SSANAMES (cfun));
> -
> -  /* Now release the freelist.  */
> -  vec_free (FREE_SSANAMES (cfun));
> -
> -  /* And compact the SSA number space.  We make sure to not change the
> -     relative order of SSA versions.  */
> -  for (i = 1, j = 1; i < cfun->gimple_df->ssa_names->length (); ++i)
> -    {
> -      tree name = ssa_name (i);
> -      if (name)
> -       {
> -         if (i != j)
> -           {
> -             SSA_NAME_VERSION (name) = j;
> -             (*cfun->gimple_df->ssa_names)[j] = name;
> -           }
> -         j++;
> -       }
> -    }
> -  cfun->gimple_df->ssa_names->truncate (j);
> -
> -  statistics_counter_event (cfun, "SSA names released", n);
> -  statistics_counter_event (cfun, "SSA name holes removed", i - j);
> -  if (dump_file)
> -    fprintf (dump_file, "Released %i names, %.2f%%, removed %i holes\n",
> -            n, n * 100.0 / num_ssa_names, i - j);
> -  return 0;
> -}
>
>  namespace {
>
> @@ -627,10 +594,44 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return release_dead_ssa_names (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_release_ssa_names
>
> +unsigned int
> +pass_release_ssa_names::execute (function *fun)
> +{
> +  unsigned i, j;
> +  int n = vec_safe_length (FREE_SSANAMES (fun));
> +
> +  /* Now release the freelist.  */
> +  vec_free (FREE_SSANAMES (fun));
> +
> +  /* And compact the SSA number space.  We make sure to not change the
> +     relative order of SSA versions.  */
> +  for (i = 1, j = 1; i < fun->gimple_df->ssa_names->length (); ++i)
> +    {
> +      tree name = ssa_name (i);
> +      if (name)
> +       {
> +         if (i != j)
> +           {
> +             SSA_NAME_VERSION (name) = j;
> +             (*fun->gimple_df->ssa_names)[j] = name;
> +           }
> +         j++;
> +       }
> +    }
> +  fun->gimple_df->ssa_names->truncate (j);
> +
> +  statistics_counter_event (fun, "SSA names released", n);
> +  statistics_counter_event (fun, "SSA name holes removed", i - j);
> +  if (dump_file)
> +    fprintf (dump_file, "Released %i names, %.2f%%, removed %i holes\n",
> +            n, n * 100.0 / num_ssa_names, i - j);
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c
> index 710711b..1cdf0ed 100644
> --- a/gcc/tree-stdarg.c
> +++ b/gcc/tree-stdarg.c
> @@ -663,10 +663,43 @@ check_all_va_list_escapes (struct stdarg_info *si)
>    return false;
>  }
>
> -/* Entry point to the stdarg optimization pass.  */
>
> -static unsigned int
> -execute_optimize_stdarg (void)
> +namespace {
> +
> +const pass_data pass_data_stdarg =
> +{
> +  GIMPLE_PASS, /* type */
> +  "stdarg", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_NONE, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  0, /* todo_flags_finish */
> +};
> +
> +class pass_stdarg : public gimple_opt_pass
> +{
> +public:
> +  pass_stdarg (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_stdarg, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *fun)
> +    {
> +      /* This optimization is only for stdarg functions.  */
> +      return fun->stdarg != 0;
> +    }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_stdarg
> +
> +unsigned int
> +pass_stdarg::execute (function *fun)
>  {
>    basic_block bb;
>    bool va_list_escapes = false;
> @@ -676,8 +709,8 @@ execute_optimize_stdarg (void)
>    const char *funcname = NULL;
>    tree cfun_va_list;
>
> -  cfun->va_list_gpr_size = 0;
> -  cfun->va_list_fpr_size = 0;
> +  fun->va_list_gpr_size = 0;
> +  fun->va_list_fpr_size = 0;
>    memset (&si, 0, sizeof (si));
>    si.va_list_vars = BITMAP_ALLOC (NULL);
>    si.va_list_escape_vars = BITMAP_ALLOC (NULL);
> @@ -685,13 +718,13 @@ execute_optimize_stdarg (void)
>    if (dump_file)
>      funcname = lang_hooks.decl_printable_name (current_function_decl, 2);
>
> -  cfun_va_list = targetm.fn_abi_va_list (cfun->decl);
> +  cfun_va_list = targetm.fn_abi_va_list (fun->decl);
>    va_list_simple_ptr = POINTER_TYPE_P (cfun_va_list)
>                        && (TREE_TYPE (cfun_va_list) == void_type_node
>                            || TREE_TYPE (cfun_va_list) == char_type_node);
>    gcc_assert (is_gimple_reg_type (cfun_va_list) == va_list_simple_ptr);
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator i;
>
> @@ -740,7 +773,7 @@ execute_optimize_stdarg (void)
>               ap = TREE_OPERAND (ap, 0);
>             }
>           if (TYPE_MAIN_VARIANT (TREE_TYPE (ap))
> -             != TYPE_MAIN_VARIANT (targetm.fn_abi_va_list (cfun->decl))
> +             != TYPE_MAIN_VARIANT (targetm.fn_abi_va_list (fun->decl))
>               || TREE_CODE (ap) != VAR_DECL)
>             {
>               va_list_escapes = true;
> @@ -795,13 +828,13 @@ execute_optimize_stdarg (void)
>    /* For void * or char * va_list there is just one counter
>       (va_list itself).  Use VA_LIST_GPR_SIZE for it.  */
>    if (va_list_simple_ptr)
> -    cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
> +    fun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
>
>    calculate_dominance_info (CDI_DOMINATORS);
>    memset (&wi, 0, sizeof (wi));
>    wi.info = si.va_list_vars;
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        gimple_stmt_iterator i;
>
> @@ -962,8 +995,8 @@ execute_optimize_stdarg (void)
>  finish:
>    if (va_list_escapes)
>      {
> -      cfun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
> -      cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
> +      fun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
> +      fun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
>      }
>    BITMAP_FREE (si.va_list_vars);
>    BITMAP_FREE (si.va_list_escape_vars);
> @@ -972,12 +1005,12 @@ finish:
>      {
>        fprintf (dump_file, "%s: va_list escapes %d, needs to save ",
>                funcname, (int) va_list_escapes);
> -      if (cfun->va_list_gpr_size >= VA_LIST_MAX_GPR_SIZE)
> +      if (fun->va_list_gpr_size >= VA_LIST_MAX_GPR_SIZE)
>         fputs ("all", dump_file);
>        else
>         fprintf (dump_file, "%d", cfun->va_list_gpr_size);
>        fputs (" GPR units and ", dump_file);
> -      if (cfun->va_list_fpr_size >= VA_LIST_MAX_FPR_SIZE)
> +      if (fun->va_list_fpr_size >= VA_LIST_MAX_FPR_SIZE)
>         fputs ("all", dump_file);
>        else
>         fprintf (dump_file, "%d", cfun->va_list_fpr_size);
> @@ -986,41 +1019,6 @@ finish:
>    return 0;
>  }
>
> -
> -namespace {
> -
> -const pass_data pass_data_stdarg =
> -{
> -  GIMPLE_PASS, /* type */
> -  "stdarg", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_NONE, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  0, /* todo_flags_finish */
> -};
> -
> -class pass_stdarg : public gimple_opt_pass
> -{
> -public:
> -  pass_stdarg (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_stdarg, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> -    {
> -      /* This optimization is only for stdarg functions.  */
> -      return fun->stdarg != 0;
> -    }
> -
> -  unsigned int execute () { return execute_optimize_stdarg (); }
> -
> -}; // class pass_stdarg
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
> index a0f9d19..34edc64 100644
> --- a/gcc/tree-switch-conversion.c
> +++ b/gcc/tree-switch-conversion.c
> @@ -1414,12 +1414,43 @@ process_switch (gimple swtch)
>  /* The main function of the pass scans statements for switches and invokes
>     process_switch on them.  */
>
> -static unsigned int
> -do_switchconv (void)
> +namespace {
> +
> +const pass_data pass_data_convert_switch =
> +{
> +  GIMPLE_PASS, /* type */
> +  "switchconv", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_SWITCH_CONVERSION, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_update_ssa | TODO_verify_ssa
> +    | TODO_verify_stmts
> +    | TODO_verify_flow ), /* todo_flags_finish */
> +};
> +
> +class pass_convert_switch : public gimple_opt_pass
> +{
> +public:
> +  pass_convert_switch (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_convert_switch, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return flag_tree_switch_conversion != 0; }
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_convert_switch
> +
> +unsigned int
> +pass_convert_switch::execute (function *fun)
>  {
>    basic_block bb;
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>    {
>      const char *failure_reason;
>      gimple stmt = last_stmt (bb);
> @@ -1465,37 +1496,6 @@ do_switchconv (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_convert_switch =
> -{
> -  GIMPLE_PASS, /* type */
> -  "switchconv", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_SWITCH_CONVERSION, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_update_ssa | TODO_verify_ssa
> -    | TODO_verify_stmts
> -    | TODO_verify_flow ), /* todo_flags_finish */
> -};
> -
> -class pass_convert_switch : public gimple_opt_pass
> -{
> -public:
> -  pass_convert_switch (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_convert_switch, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_switch_conversion != 0; }
> -  unsigned int execute () { return do_switchconv (); }
> -
> -}; // class pass_convert_switch
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
> index 84cdbde..11a2965 100644
> --- a/gcc/tree-tailcall.c
> +++ b/gcc/tree-tailcall.c
> @@ -1065,12 +1065,6 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls)
>    return 0;
>  }
>
> -static unsigned int
> -execute_tail_recursion (void)
> -{
> -  return tree_optimize_tail_calls_1 (false);
> -}
> -
>  static bool
>  gate_tail_calls (void)
>  {
> @@ -1109,7 +1103,10 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_tail_recursion (m_ctxt); }
>    virtual bool gate (function *) { return gate_tail_calls (); }
> -  unsigned int execute () { return execute_tail_recursion (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return tree_optimize_tail_calls_1 (false);
> +    }
>
>  }; // class pass_tail_recursion
>
> @@ -1146,7 +1143,7 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return gate_tail_calls (); }
> -  unsigned int execute () { return execute_tail_calls (); }
> +  virtual unsigned int execute (function *) { return execute_tail_calls (); }
>
>  }; // class pass_tail_calls
>
> diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
> index 4274417..d8b2200 100644
> --- a/gcc/tree-vect-generic.c
> +++ b/gcc/tree-vect-generic.c
> @@ -1585,7 +1585,10 @@ public:
>        return !(fun->curr_properties & PROP_gimple_lvec);
>      }
>
> -  unsigned int execute () { return expand_vector_operations (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return expand_vector_operations ();
> +    }
>
>  }; // class pass_lower_vector
>
> @@ -1625,7 +1628,10 @@ public:
>
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_lower_vector_ssa (m_ctxt); }
> -  unsigned int execute () { return expand_vector_operations (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return expand_vector_operations ();
> +    }
>
>  }; // class pass_lower_vector_ssa
>
> diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
> index 7b5691a..d7de964 100644
> --- a/gcc/tree-vectorizer.c
> +++ b/gcc/tree-vectorizer.c
> @@ -586,33 +586,6 @@ vectorize_loops (void)
>
>  /*  Entry point to basic block SLP phase.  */
>
> -static unsigned int
> -execute_vect_slp (void)
> -{
> -  basic_block bb;
> -
> -  init_stmt_vec_info_vec ();
> -
> -  FOR_EACH_BB_FN (bb, cfun)
> -    {
> -      vect_location = find_bb_location (bb);
> -
> -      if (vect_slp_analyze_bb (bb))
> -        {
> -          if (!dbg_cnt (vect_slp))
> -            break;
> -
> -          vect_slp_transform_bb (bb);
> -          if (dump_enabled_p ())
> -            dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, vect_location,
> -                            "basic block vectorized\n");
> -        }
> -    }
> -
> -  free_stmt_vec_info_vec ();
> -  return 0;
> -}
> -
>  namespace {
>
>  const pass_data pass_data_slp_vectorize =
> @@ -639,10 +612,37 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return flag_tree_slp_vectorize != 0; }
> -  unsigned int execute () { return execute_vect_slp (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_slp_vectorize
>
> +unsigned int
> +pass_slp_vectorize::execute (function *fun)
> +{
> +  basic_block bb;
> +
> +  init_stmt_vec_info_vec ();
> +
> +  FOR_EACH_BB_FN (bb, fun)
> +    {
> +      vect_location = find_bb_location (bb);
> +
> +      if (vect_slp_analyze_bb (bb))
> +        {
> +          if (!dbg_cnt (vect_slp))
> +            break;
> +
> +          vect_slp_transform_bb (bb);
> +          if (dump_enabled_p ())
> +            dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, vect_location,
> +                            "basic block vectorized\n");
> +        }
> +    }
> +
> +  free_stmt_vec_info_vec ();
> +  return 0;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> @@ -725,7 +725,7 @@ public:
>        return flag_section_anchors && flag_tree_loop_vectorize;
>      }
>
> -  unsigned int execute () { return increase_alignment (); }
> +  virtual unsigned int execute (function *) { return increase_alignment (); }
>
>  }; // class pass_ipa_increase_alignment
>
> diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
> index 80f3888..34255ce 100644
> --- a/gcc/tree-vrp.c
> +++ b/gcc/tree-vrp.c
> @@ -9922,7 +9922,7 @@ public:
>    /* opt_pass methods: */
>    opt_pass * clone () { return new pass_vrp (m_ctxt); }
>    virtual bool gate (function *) { return flag_tree_vrp != 0; }
> -  unsigned int execute () { return execute_vrp (); }
> +  virtual unsigned int execute (function *) { return execute_vrp (); }
>
>  }; // class pass_vrp
>
> diff --git a/gcc/tree.c b/gcc/tree.c
> index b897988..8b44ecc 100644
> --- a/gcc/tree.c
> +++ b/gcc/tree.c
> @@ -5642,7 +5642,7 @@ public:
>    {}
>
>    /* opt_pass methods: */
> -  unsigned int execute () { return free_lang_data (); }
> +  virtual unsigned int execute (function *) { return free_lang_data (); }
>
>  }; // class pass_ipa_free_lang_data
>
> diff --git a/gcc/tsan.c b/gcc/tsan.c
> index b413bb5..d9f5718 100644
> --- a/gcc/tsan.c
> +++ b/gcc/tsan.c
> @@ -762,7 +762,7 @@ public:
>    return (flag_sanitize & SANITIZE_THREAD) != 0;
>  }
>
> -  unsigned int execute () { return tsan_pass (); }
> +  virtual unsigned int execute (function *) { return tsan_pass (); }
>
>  }; // class pass_tsan
>
> @@ -803,7 +803,7 @@ public:
>        return (flag_sanitize & SANITIZE_THREAD) != 0 && !optimize;
>      }
>
> -  unsigned int execute () { return tsan_pass (); }
> +  virtual unsigned int execute (function *) { return tsan_pass (); }
>
>  }; // class pass_tsan_O0
>
> diff --git a/gcc/ubsan.c b/gcc/ubsan.c
> index 8e7dda5..cf25aa3 100644
> --- a/gcc/ubsan.c
> +++ b/gcc/ubsan.c
> @@ -859,17 +859,49 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi)
>    gsi_insert_before (&gsi2, g, GSI_SAME_STMT);
>  }
>
> -/* Gate and execute functions for ubsan pass.  */
> +namespace {
>
> -static unsigned int
> -ubsan_pass (void)
> +const pass_data pass_data_ubsan =
> +{
> +  GIMPLE_PASS, /* type */
> +  "ubsan", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_TREE_UBSAN, /* tv_id */
> +  ( PROP_cfg | PROP_ssa ), /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  TODO_update_ssa, /* todo_flags_finish */
> +};
> +
> +class pass_ubsan : public gimple_opt_pass
> +{
> +public:
> +  pass_ubsan (gcc::context *ctxt)
> +    : gimple_opt_pass (pass_data_ubsan, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *)
> +    {
> +      return flag_sanitize & (SANITIZE_NULL | SANITIZE_SI_OVERFLOW
> +                             | SANITIZE_BOOL | SANITIZE_ENUM);
> +    }
> +
> +  virtual unsigned int execute (function *);
> +
> +}; // class pass_ubsan
> +
> +unsigned int
> +pass_ubsan::execute (function *fun)
>  {
>    basic_block bb;
>    gimple_stmt_iterator gsi;
>
>    initialize_sanitizer_builtins ();
>
> -  FOR_EACH_BB_FN (bb, cfun)
> +  FOR_EACH_BB_FN (bb, fun)
>      {
>        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
>         {
> @@ -902,40 +934,6 @@ ubsan_pass (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_ubsan =
> -{
> -  GIMPLE_PASS, /* type */
> -  "ubsan", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_TREE_UBSAN, /* tv_id */
> -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  TODO_update_ssa, /* todo_flags_finish */
> -};
> -
> -class pass_ubsan : public gimple_opt_pass
> -{
> -public:
> -  pass_ubsan (gcc::context *ctxt)
> -    : gimple_opt_pass (pass_data_ubsan, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *)
> -    {
> -      return flag_sanitize & (SANITIZE_NULL | SANITIZE_SI_OVERFLOW
> -                             | SANITIZE_BOOL | SANITIZE_ENUM);
> -    }
> -
> -  unsigned int execute () { return ubsan_pass (); }
> -
> -}; // class pass_ubsan
> -
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
> index 4586afc..3937340 100644
> --- a/gcc/var-tracking.c
> +++ b/gcc/var-tracking.c
> @@ -10373,7 +10373,10 @@ public:
>        return (flag_var_tracking && !targetm.delay_vartrack);
>      }
>
> -  unsigned int execute () { return variable_tracking_main (); }
> +  virtual unsigned int execute (function *)
> +    {
> +      return variable_tracking_main ();
> +    }
>
>  }; // class pass_variable_tracking
>
> diff --git a/gcc/vtable-verify.c b/gcc/vtable-verify.c
> index 601b2ce..b99ff6c 100644
> --- a/gcc/vtable-verify.c
> +++ b/gcc/vtable-verify.c
> @@ -723,23 +723,6 @@ verify_bb_vtables (basic_block bb)
>      }
>  }
>
> -/* Main function, called from pass->excute().  Loop through all the
> -   basic blocks in the current function, passing them to
> -   verify_bb_vtables, which searches for virtual calls, and inserts
> -   calls to __VLTVerifyVtablePointer.  */
> -
> -unsigned int
> -vtable_verify_main (void)
> -{
> -  unsigned int ret = 1;
> -  basic_block bb;
> -
> -  FOR_ALL_BB_FN (bb, cfun)
> -      verify_bb_vtables (bb);
> -
> -  return ret;
> -}
> -
>  /* Definition of this optimization pass.  */
>
>  namespace {
> @@ -767,10 +750,26 @@ public:
>
>    /* opt_pass methods: */
>    virtual bool gate (function *) { return (flag_vtable_verify); }
> -  unsigned int execute () { return vtable_verify_main (); }
> +  virtual unsigned int execute (function *);
>
>  }; // class pass_vtable_verify
>
> +/* Loop through all the basic blocks in the current function, passing them to
> +   verify_bb_vtables, which searches for virtual calls, and inserts
> +   calls to __VLTVerifyVtablePointer.  */
> +
> +unsigned int
> +pass_vtable_verify::execute (function *fun)
> +{
> +  unsigned int ret = 1;
> +  basic_block bb;
> +
> +  FOR_ALL_BB_FN (bb, fun)
> +      verify_bb_vtables (bb);
> +
> +  return ret;
> +}
> +
>  } // anon namespace
>
>  gimple_opt_pass *
> diff --git a/gcc/web.c b/gcc/web.c
> index 50fc9e6..46a6ff7 100644
> --- a/gcc/web.c
> +++ b/gcc/web.c
> @@ -325,10 +325,37 @@ replace_ref (df_ref ref, rtx reg)
>  }
>
>
> -/* Main entry point.  */
> +namespace {
> +
> +const pass_data pass_data_web =
> +{
> +  RTL_PASS, /* type */
> +  "web", /* name */
> +  OPTGROUP_NONE, /* optinfo_flags */
> +  true, /* has_execute */
> +  TV_WEB, /* tv_id */
> +  0, /* properties_required */
> +  0, /* properties_provided */
> +  0, /* properties_destroyed */
> +  0, /* todo_flags_start */
> +  ( TODO_df_finish | TODO_verify_rtl_sharing ), /* todo_flags_finish */
> +};
> +
> +class pass_web : public rtl_opt_pass
> +{
> +public:
> +  pass_web (gcc::context *ctxt)
> +    : rtl_opt_pass (pass_data_web, ctxt)
> +  {}
> +
> +  /* opt_pass methods: */
> +  virtual bool gate (function *) { return (optimize > 0 && flag_web); }
> +  virtual unsigned int execute (function *);
>
> -static unsigned int
> -web_main (void)
> +}; // class pass_web
> +
> +unsigned int
> +pass_web::execute (function *fun)
>  {
>    struct web_entry *def_entry;
>    struct web_entry *use_entry;
> @@ -345,7 +372,7 @@ web_main (void)
>    df_set_flags (DF_DEFER_INSN_RESCAN);
>
>    /* Assign ids to the uses.  */
> -  FOR_ALL_BB_FN (bb, cfun)
> +  FOR_ALL_BB_FN (bb, fun)
>      FOR_BB_INSNS (bb, insn)
>      {
>        unsigned int uid = INSN_UID (insn);
> @@ -373,7 +400,7 @@ web_main (void)
>    use_entry = XCNEWVEC (struct web_entry, uses_num);
>
>    /* Produce the web.  */
> -  FOR_ALL_BB_FN (bb, cfun)
> +  FOR_ALL_BB_FN (bb, fun)
>      FOR_BB_INSNS (bb, insn)
>      {
>        unsigned int uid = INSN_UID (insn);
> @@ -398,7 +425,7 @@ web_main (void)
>
>    /* Update the instruction stream, allocating new registers for split pseudos
>       in progress.  */
> -  FOR_ALL_BB_FN (bb, cfun)
> +  FOR_ALL_BB_FN (bb, fun)
>      FOR_BB_INSNS (bb, insn)
>      {
>        unsigned int uid = INSN_UID (insn);
> @@ -443,35 +470,6 @@ web_main (void)
>    return 0;
>  }
>
> -namespace {
> -
> -const pass_data pass_data_web =
> -{
> -  RTL_PASS, /* type */
> -  "web", /* name */
> -  OPTGROUP_NONE, /* optinfo_flags */
> -  true, /* has_execute */
> -  TV_WEB, /* tv_id */
> -  0, /* properties_required */
> -  0, /* properties_provided */
> -  0, /* properties_destroyed */
> -  0, /* todo_flags_start */
> -  ( TODO_df_finish | TODO_verify_rtl_sharing ), /* todo_flags_finish */
> -};
> -
> -class pass_web : public rtl_opt_pass
> -{
> -public:
> -  pass_web (gcc::context *ctxt)
> -    : rtl_opt_pass (pass_data_web, ctxt)
> -  {}
> -
> -  /* opt_pass methods: */
> -  virtual bool gate (function *) { return (optimize > 0 && flag_web); }
> -  unsigned int execute () { return web_main (); }
> -
> -}; // class pass_web
> -
>  } // anon namespace
>
>  rtl_opt_pass *
> --
> 1.9.2
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]