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]

[tree-profiling/RFC] Extending passmanager to deal with IPA passes


Hi,
this patch extends the passmanager to deal with IPA passes.  This is
done by adding 4 new hooks neccesary to the PM structure and adding some
extra entry points to do the IPA analysis and optimizations to the
tree-optimize.
In general I would like to replace the tree_rest_of_compilation by just
set of nested passes so the passmanager is completely driven by
cgraphunit and all the other actions are driven by the PM.

I hope this to make it less confusing to how the new passes should be
organized in the current framework - ie how to get informed about all
the function/variable bodies and how to modify them.  Still the pass
datastructures needs to be added directly into the global/local info
datastructures of cgraph.  Perhaps I can add some hooks so pass can deal
with copying it's data on clonning and such but I am not quite sure this
is good idea so I will do it separately if at all.

Any comments are welcome.  I am not very happy that adding the hooks
needs so many NULLs around the code and also i don't particularly like
the way execute_one_pass is extended to deal with different hooks,
so if someone has ideas how to make this significantly cleaner, I am all
ears ;)

Bootstrapped/regtested on i686-pc-gnu-linux.  I near future I would like
to decompose cgraphunit into separate files for the optimizations
implemented, but I guess it makes sense to way here for the patches
pending for cprop and inlining.

Bootstrapped/regtested i686-pc-gnu-linux, commited.

Honza

2004-10-25  Jan Hubicka  <jh@suse.cz>
	* cfgexpand.c (pass_expand): Update.
	* cgraphunit.c: Include tree-pass.h
	(cgraph_analyze_function_inlinability): Break out from ...
	(cgraph_analyze_function): ... here; call passmanager.
	(cgraph_analyze_variable): Call passmanager.
	(cgraph_decide_recursive_inlining): Use dump file.
	(cgraph_set_inline_failed): Likewise.
	(cgraph_decide_inlining_of_small_function): Likewise.
	(cgraph_decide_inlining): Likewise.
	(cgraph_apply_inline): Do the inlining, move from tree-inline.c
	(cgraph_gate_inlining): New function.
	(pass_ipa_inline): New structure.
	(cgraph_optimize): Call the passmanager.
	* gimple-low.c (pass_lower_cf, pass_remove_useless): Update.
	* passes.c (pass_rest_of_compil): Update
	* predict.c (pass_profile): Update
	* tree-cfg.c (pass_build_cfg): Update.
	(pass_remove_useless): Update.
	(pass_split_crit_edges): Update.
	(pass_warn_function_return): Update.
	* tree-complex.c (pas_lower_vector_operations, pass_pre_expand): Update.
	* tree-dfa.c (pass_referenced_vars): Update.
	* tree-eh.c (pass_lower_eh): Update.
	* tree-if-conv.c (pass_if_conversion): Update.
	* tree-into-ssa.c (pass_build_ssa): Update.
	* tree-mudflap.c (pass_mudflap_1, pass_mudflap_2): Update.
	* tree-nomudflap.c (pass_mudflap_1, pass_mudflap_2): Update.
	* tree-nrv.c (pass_nrv): Update.
	* tree-optimize.c (all_ipa_passes): New static variable.
	(execute_inline, pass_inline): Kill.
	(pass_gimple, pass_cleanup_cfg_pre_optimizing, pass_all_optimizations,
	pass_cleanup_cfg_post_optimizing, pass_free_datastructures,
	pass_init_datasturcutres);  Update.
	(register_one_dump_file): Add argument IPA, deal with IPA dumps.
	(register_dump_files): Likewise.
	(init_tree_optimization_passes): Do not add pass_inline; enqueue IPA passes.
	(execute_pass_hook): New enum.
	(execute_todo): Deal with new hooks and IPA.
	(execute_one_pass): Likewise.
	(ipa_analyze_function, ipa_analyze_variable, ipa_modify_function,
	ipa_modify_variable, ipa_passes): New entry points.
	(tree_rest_of_compilation): Execute ipa_modify_function.
	* tree-outof-ssa.c (pass_del_ssa): Update.
	* tree-pass.h (tree_opt_pass): Add new hooks and documentation.
	(pass_ipa_inline): Declare.
	(ipa_analyze_function, ipa_analyze_variable, ipa_modify_function,
	ipa_modify_variable, ipa_passes): Declare.
	* tree-profile.c (pass_tree_profile): Update.
	* tree-sra.c (pass_sra): Update.
	* tree-ssa-alias.c (pass_may_alias): Update.
	* tree-ssa-ccp.c (pass_ccp, pass_fold_builtins): Update.
	* tree-ssa-copyrename.c (pass_rename_ssa_copies): Update.
	* tree-ssa-dce.c (pass_dce): Update.
	(pass_cd_dce): Update.
	* tree-ssa-dom.c (pass_dominator): Update.
	* tree-ssa-dse.c (pass_dse): Update.
	* tree-ssa-forwprop.c (gate_forwprop): Update.
	* tree-ssa-loop-ch.c (pass_ch): Update.
	* tree-ssa-loop.c (pass_loop, pass_loop_init, pass_lim, pass_unswitch,
	pass_vectorize, pass_linear_transform, pass_iv_canon,
	pass_record_bounds, pass_complete_unroll, pass_iv_optimize, 
	pass_loop_done): Update.
	* tree-ssa-phiopt.c (pass_phiopt): Update.
	* tree-ssa-pre.c (pass_pre, pass_fre): Update.
	* tree-ssa.c (pass_redundant_phi_nodes, pass_early_warn_unitialized,
	pass_late_warn_unintialized): Update.
	* tree-tailcall.c (pass_tail_recursion, pass_tail_calls): Update.
Index: cfgexpand.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfgexpand.c,v
retrieving revision 1.1.2.22
diff -c -3 -p -r1.1.2.22 cfgexpand.c
*** cfgexpand.c	22 Oct 2004 17:34:19 -0000	1.1.2.22
--- cfgexpand.c	24 Oct 2004 23:01:33 -0000
*************** struct tree_opt_pass pass_expand =
*** 1349,1355 ****
--- 1349,1357 ----
  {
    "expand",		                /* name */
    NULL,                                 /* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_expand_cfg,	                /* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,                                 /* sub */
    NULL,                                 /* next */
    0,                                    /* static_pass_number */
Index: cgraphunit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cgraphunit.c,v
retrieving revision 1.1.4.35.2.20
diff -c -3 -p -r1.1.4.35.2.20 cgraphunit.c
*** cgraphunit.c	22 Oct 2004 23:54:31 -0000	1.1.4.35.2.20
--- cgraphunit.c	24 Oct 2004 23:01:33 -0000
*************** Software Foundation, 59 Temple Place - S
*** 203,208 ****
--- 203,209 ----
  #include "ipa_prop.h"
  #include "tree-gimple.h"
  #include "output.h"
+ #include "tree-pass.h"
  
  #define INSNS_PER_CALL 10
  
*************** cgraph_assemble_pending_functions (void)
*** 549,554 ****
--- 550,583 ----
    return output;
  }
  
+ /* Compute function size and other parameters used by inlining arguments.  */
+ static void
+ cgraph_analyze_function_inlinability (struct cgraph_node *node)
+ {
+   tree decl = node->decl;
+   struct cgraph_edge *e;
+ 
+   node->local.inlinable = tree_inlinable_function_p (decl);
+   node->local.self_insns = estimate_num_insns (DECL_SAVED_TREE (decl));
+   if (node->local.inlinable)
+     node->local.disregard_inline_limits
+       = lang_hooks.tree_inlining.disregard_inline_limits (decl);
+   for (e = node->callers; e; e = e->next_caller)
+     {
+       if (node->local.redefined_extern_inline)
+ 	e->inline_failed = N_("redefined extern inline functions are not "
+ 			      "considered for inlining");
+       else if (!node->local.inlinable)
+ 	e->inline_failed = N_("function not inlinable");
+       else
+ 	e->inline_failed = N_("function not considered for inlining");
+     }
+   if (flag_really_no_inline && !node->local.disregard_inline_limits)
+     node->local.inlinable = 0;
+   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
+   node->global.insns = node->local.self_insns;
+ }
+ 
  /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
     logic in effect.  If NESTED is true, then our caller cannot stand to have
     the garbage collector run at the moment.  We would need to either create
*************** cgraph_varpool_analyze_pending_decls (vo
*** 888,893 ****
--- 917,923 ----
        tree decl = cgraph_varpool_first_unanalyzed_node->decl;
  
        cgraph_varpool_first_unanalyzed_node->analyzed = true;
+       ipa_analyze_variable (cgraph_varpool_first_unanalyzed_node);
        cgraph_varpool_first_unanalyzed_node = cgraph_varpool_first_unanalyzed_node->next_needed;
        cgraph_create_edges (NULL, DECL_INITIAL (decl));
        changed = true;
*************** cgraph_varpool_assemble_pending_decls (v
*** 917,922 ****
--- 947,953 ----
        cgraph_varpool_nodes_queue = cgraph_varpool_nodes_queue->next_needed;
        if (!TREE_ASM_WRITTEN (decl) && !DECL_EXTERNAL (decl))
  	{
+           ipa_modify_variable (node);
  	  assemble_variable (decl, 0, 1, 0);
  	  changed = true;
  	}
*************** static void
*** 930,961 ****
  cgraph_analyze_function (struct cgraph_node *node)
  {
    tree decl = node->decl;
-   struct cgraph_edge *e;
  
    current_function_decl = decl;
  
    /* First kill forward declaration so reverse inlining works properly.  */
    cgraph_create_edges (node, DECL_SAVED_TREE (decl));
  
!   node->local.inlinable = tree_inlinable_function_p (decl);
!   node->local.self_insns = estimate_num_insns (DECL_SAVED_TREE (decl));
!   if (node->local.inlinable)
!     node->local.disregard_inline_limits
!       = lang_hooks.tree_inlining.disregard_inline_limits (decl);
!   for (e = node->callers; e; e = e->next_caller)
!     {
!       if (node->local.redefined_extern_inline)
! 	e->inline_failed = N_("redefined extern inline functions are not "
! 			   "considered for inlining");
!       else if (!node->local.inlinable)
! 	e->inline_failed = N_("function not inlinable");
!       else
! 	e->inline_failed = N_("function not considered for inlining");
!     }
!   if (flag_really_no_inline && !node->local.disregard_inline_limits)
!     node->local.inlinable = 0;
!   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
!   node->global.insns = node->local.self_insns;
  
    node->analyzed = true;
    current_function_decl = NULL;
--- 961,979 ----
  cgraph_analyze_function (struct cgraph_node *node)
  {
    tree decl = node->decl;
  
    current_function_decl = decl;
  
    /* First kill forward declaration so reverse inlining works properly.  */
    cgraph_create_edges (node, DECL_SAVED_TREE (decl));
  
!   /* Only optimization we do in non-unit-at-a-time mode is inlining.  We don't
!      use the passmanager then and instead call it directly.  Since we probably
!      don't want to add more passes like this, it should be OK.  */
!   if (!flag_unit_at_a_time)
!     cgraph_analyze_function_inlinability (node);
!   else
!     ipa_analyze_function (node);
  
    node->analyzed = true;
    current_function_decl = NULL;
*************** cgraph_decide_recursive_inlining (struct
*** 1732,1739 ****
    if (!first_call)
      return;
  
!   if (cgraph_dump_file)
!     fprintf (cgraph_dump_file, 
  	     "\nPerforming recursive inlining on %s\n",
  	     cgraph_node_name (node));
  
--- 1750,1757 ----
    if (!first_call)
      return;
  
!   if (dump_file)
!     fprintf (dump_file, 
  	     "\nPerforming recursive inlining on %s\n",
  	     cgraph_node_name (node));
  
*************** cgraph_decide_recursive_inlining (struct
*** 1771,1778 ****
        first_call->aux = NULL;
        first_call = next;
      }
!   if (cgraph_dump_file)
!     fprintf (cgraph_dump_file, 
  	     "\n   Inlined %i times, body grown from %i to %i insns\n", n,
  	     master_clone->global.insns, node->global.insns);
  
--- 1789,1796 ----
        first_call->aux = NULL;
        first_call = next;
      }
!   if (dump_file)
!     fprintf (dump_file, 
  	     "\n   Inlined %i times, body grown from %i to %i insns\n", n,
  	     master_clone->global.insns, node->global.insns);
  
*************** cgraph_set_inline_failed (struct cgraph_
*** 1793,1800 ****
  {
    struct cgraph_edge *e;
  
!   if (cgraph_dump_file)
!     fprintf (cgraph_dump_file, "Inlining failed: %s\n", reason);
    for (e = node->callers; e; e = e->next_caller)
      if (e->inline_failed)
        e->inline_failed = reason;
--- 1811,1818 ----
  {
    struct cgraph_edge *e;
  
!   if (dump_file)
!     fprintf (dump_file, "Inlining failed: %s\n", reason);
    for (e = node->callers; e; e = e->next_caller)
      if (e->inline_failed)
        e->inline_failed = reason;
*************** cgraph_decide_inlining_of_small_function
*** 1835,1850 ****
  	fibheap_insert (heap, cgraph_estimate_growth (node), node);
      }
  
!   if (cgraph_dump_file)
!     fprintf (cgraph_dump_file, "\nDeciding on smaller functions:\n");
    while (overall_insns <= max_insns && (node = fibheap_extract_min (heap)))
      {
        struct cgraph_edge *e, *next;
        int old_insns = overall_insns;
  
        heap_node[node->uid] = NULL;
!       if (cgraph_dump_file)
! 	fprintf (cgraph_dump_file, 
  		 "\nConsidering %s with %i insns\n"
  		 " Estimated growth is %+i insns.\n",
  		 cgraph_node_name (node), node->global.insns,
--- 1853,1868 ----
  	fibheap_insert (heap, cgraph_estimate_growth (node), node);
      }
  
!   if (dump_file)
!     fprintf (dump_file, "\nDeciding on smaller functions:\n");
    while (overall_insns <= max_insns && (node = fibheap_extract_min (heap)))
      {
        struct cgraph_edge *e, *next;
        int old_insns = overall_insns;
  
        heap_node[node->uid] = NULL;
!       if (dump_file)
! 	fprintf (dump_file, 
  		 "\nConsidering %s with %i insns\n"
  		 " Estimated growth is %+i insns.\n",
  		 cgraph_node_name (node), node->global.insns,
*************** cgraph_decide_inlining_of_small_function
*** 1867,1874 ****
  		  || !cgraph_check_inline_limits (e->caller, e->callee,
  			  			  &e->inline_failed))
  		{
! 		  if (cgraph_dump_file)
! 		    fprintf (cgraph_dump_file, " Not inlining into %s:%s.\n",
  			     cgraph_node_name (e->caller), e->inline_failed);
  		  continue;
  		}
--- 1885,1892 ----
  		  || !cgraph_check_inline_limits (e->caller, e->callee,
  			  			  &e->inline_failed))
  		{
! 		  if (dump_file)
! 		    fprintf (dump_file, " Not inlining into %s:%s.\n",
  			     cgraph_node_name (e->caller), e->inline_failed);
  		  continue;
  		}
*************** cgraph_decide_inlining_of_small_function
*** 1881,1888 ****
  		fibheap_replace_key (heap, heap_node[where->uid],
  				     cgraph_estimate_growth (where));
  
! 	      if (cgraph_dump_file)
! 		fprintf (cgraph_dump_file, 
  			 " Inlined into %s which now has %i insns.\n",
  			 cgraph_node_name (e->caller),
  			 e->caller->global.insns);
--- 1899,1906 ----
  		fibheap_replace_key (heap, heap_node[where->uid],
  				     cgraph_estimate_growth (where));
  
! 	      if (dump_file)
! 		fprintf (dump_file, 
  			 " Inlined into %s which now has %i insns.\n",
  			 cgraph_node_name (e->caller),
  			 e->caller->global.insns);
*************** cgraph_decide_inlining_of_small_function
*** 1895,1902 ****
           are now called more times; update keys.  */
        update_callee_keys (heap, heap_node, node);
  
!       if (cgraph_dump_file)
! 	fprintf (cgraph_dump_file, 
  		 " Inlined for a net change of %+i insns.\n",
  		 overall_insns - old_insns);
      }
--- 1913,1920 ----
           are now called more times; update keys.  */
        update_callee_keys (heap, heap_node, node);
  
!       if (dump_file)
! 	fprintf (dump_file, 
  		 " Inlined for a net change of %+i insns.\n",
  		 overall_insns - old_insns);
      }
*************** cgraph_decide_inlining (void)
*** 1926,1941 ****
  
    nnodes = cgraph_postorder (order);
  
!   if (cgraph_dump_file)
!     fprintf (cgraph_dump_file,
  	     "\nDeciding on inlining.  Starting with %i insns.\n",
  	     initial_insns);
  
    for (node = cgraph_nodes; node; node = node->next)
      node->aux = 0;
  
!   if (cgraph_dump_file)
!     fprintf (cgraph_dump_file, "\nInlining always_inline functions:\n");
  
    /* In the first pass mark all always_inline edges.  Do this with a priority
       so none of our later choices will make this impossible.  */
--- 1944,1959 ----
  
    nnodes = cgraph_postorder (order);
  
!   if (dump_file)
!     fprintf (dump_file,
  	     "\nDeciding on inlining.  Starting with %i insns.\n",
  	     initial_insns);
  
    for (node = cgraph_nodes; node; node = node->next)
      node->aux = 0;
  
!   if (dump_file)
!     fprintf (dump_file, "\nInlining always_inline functions:\n");
  
    /* In the first pass mark all always_inline edges.  Do this with a priority
       so none of our later choices will make this impossible.  */
*************** cgraph_decide_inlining (void)
*** 1947,1954 ****
  
        if (!node->local.disregard_inline_limits)
  	continue;
!       if (cgraph_dump_file)
! 	fprintf (cgraph_dump_file,
  		 "\nConsidering %s %i insns (always inline)\n",
  		 cgraph_node_name (node), node->global.insns);
        old_insns = overall_insns;
--- 1965,1972 ----
  
        if (!node->local.disregard_inline_limits)
  	continue;
!       if (dump_file)
! 	fprintf (dump_file,
  		 "\nConsidering %s %i insns (always inline)\n",
  		 cgraph_node_name (node), node->global.insns);
        old_insns = overall_insns;
*************** cgraph_decide_inlining (void)
*** 1961,1974 ****
  				  	   &e->inline_failed))
  	    continue;
  	  cgraph_mark_inline_edge (e);
! 	  if (cgraph_dump_file)
! 	    fprintf (cgraph_dump_file, 
  		     " Inlined into %s which now has %i insns.\n",
  		     cgraph_node_name (e->caller),
  		     e->caller->global.insns);
  	}
!       if (cgraph_dump_file)
! 	fprintf (cgraph_dump_file, 
  		 " Inlined for a net change of %+i insns.\n",
  		 overall_insns - old_insns);
      }
--- 1979,1992 ----
  				  	   &e->inline_failed))
  	    continue;
  	  cgraph_mark_inline_edge (e);
! 	  if (dump_file)
! 	    fprintf (dump_file, 
  		     " Inlined into %s which now has %i insns.\n",
  		     cgraph_node_name (e->caller),
  		     e->caller->global.insns);
  	}
!       if (dump_file)
! 	fprintf (dump_file, 
  		 " Inlined for a net change of %+i insns.\n",
  		 overall_insns - old_insns);
      }
*************** cgraph_decide_inlining (void)
*** 1977,1984 ****
      {
        cgraph_decide_inlining_of_small_functions ();
  
!       if (cgraph_dump_file)
! 	fprintf (cgraph_dump_file, "\nDeciding on functions called once:\n");
  
        /* And finally decide what functions are called once.  */
  
--- 1995,2002 ----
      {
        cgraph_decide_inlining_of_small_functions ();
  
!       if (dump_file)
! 	fprintf (dump_file, "\nDeciding on functions called once:\n");
  
        /* And finally decide what functions are called once.  */
  
*************** cgraph_decide_inlining (void)
*** 2001,2008 ****
  		  ok = false;
  	      if (ok)
  		{
! 		  if (cgraph_dump_file)
! 		    fprintf (cgraph_dump_file,
  			     "\nConsidering %s %i insns.\n"
  			     " Called once from %s %i insns.\n",
  			     cgraph_node_name (node), node->global.insns,
--- 2019,2026 ----
  		  ok = false;
  	      if (ok)
  		{
! 		  if (dump_file)
! 		    fprintf (dump_file,
  			     "\nConsidering %s %i insns.\n"
  			     " Called once from %s %i insns.\n",
  			     cgraph_node_name (node), node->global.insns,
*************** cgraph_decide_inlining (void)
*** 2015,2022 ****
  					  	  NULL))
  		    {
  		      cgraph_mark_inline (node->callers);
! 		      if (cgraph_dump_file)
! 			fprintf (cgraph_dump_file,
  				 " Inlined into %s which now has %i insns"
  				 " for a net change of %+i insns.\n",
  				 cgraph_node_name (node->callers->caller),
--- 2033,2040 ----
  					  	  NULL))
  		    {
  		      cgraph_mark_inline (node->callers);
! 		      if (dump_file)
! 			fprintf (dump_file,
  				 " Inlined into %s which now has %i insns"
  				 " for a net change of %+i insns.\n",
  				 cgraph_node_name (node->callers->caller),
*************** cgraph_decide_inlining (void)
*** 2025,2032 ****
  		    }
  		  else
  		    {
! 		      if (cgraph_dump_file)
! 			fprintf (cgraph_dump_file,
  				 " Inline limit reached, not inlined.\n");
  		    }
  		}
--- 2043,2050 ----
  		    }
  		  else
  		    {
! 		      if (dump_file)
! 			fprintf (dump_file,
  				 " Inline limit reached, not inlined.\n");
  		    }
  		}
*************** cgraph_decide_inlining (void)
*** 2039,2046 ****
       inline functions.  */
    cgraph_remove_unreachable_nodes (false);
  
!   if (cgraph_dump_file)
!     fprintf (cgraph_dump_file,
  	     "\nInlined %i calls, eliminated %i functions, "
  	     "%i insns turned to %i insns.\n\n",
  	     ncalls_inlined, nfunctions_inlined, initial_insns,
--- 2057,2064 ----
       inline functions.  */
    cgraph_remove_unreachable_nodes (false);
  
!   if (dump_file)
!     fprintf (dump_file,
  	     "\nInlined %i calls, eliminated %i functions, "
  	     "%i insns turned to %i insns.\n\n",
  	     ncalls_inlined, nfunctions_inlined, initial_insns,
*************** cgraph_decide_inlining_incrementally (st
*** 2084,2089 ****
--- 2102,2158 ----
  	}
  }
  
+ static void
+ cgraph_apply_inline (struct cgraph_node *node)
+ {
+   if (flag_inline_trees)
+     {
+       struct cgraph_edge *e;
+       for (e = node->callees; e; e = e->next_callee)
+ 	if (!e->inline_failed || warn_inline)
+ 	  break;
+       if (e)
+ 	optimize_inline_calls (current_function_decl);
+     }
+ 
+   /* We are not going to maintain the cgraph edges up to date.
+      Kill it so it won't confuse us.  */
+   while (node->callees)
+     {
+       /* In non-unit-at-a-time we must mark all referenced functions as needed.
+          */
+       if (node->callees->callee->analyzed && !flag_unit_at_a_time)
+         cgraph_mark_needed_node (node->callees->callee);
+       cgraph_remove_edge (node->callees);
+     }
+ }
+ 
+ static bool
+ cgraph_gate_inlining (void)
+ {
+   return flag_inline_trees;
+ }
+ 
+ struct tree_opt_pass pass_ipa_inline = 
+ {
+   "inline",				/* name */
+   cgraph_gate_inlining,			/* gate */
+   cgraph_analyze_function_inlinability,	/* function analysis */
+   NULL,					/* variable analysis */
+   cgraph_decide_inlining,		/* execute */
+   cgraph_apply_inline,			/* function modification */
+   NULL,					/* variable modification */
+   NULL,					/* sub */
+   NULL,					/* next */
+   0,					/* static_pass_number */
+   TV_INTEGRATION,			/* tv_id */
+   0,	                                /* properties_required */
+   PROP_trees,				/* properties_provided */
+   0,					/* properties_destroyed */
+   0,					/* todo_flags_start */
+   TODO_dump_cgraph | TODO_dump_func,	/* todo_flags_finish */
+   0					/* letter */
+ };
  
  /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.  */
  
*************** cgraph_optimize (void)
*** 2927,2934 ****
        dump_cgraph (cgraph_dump_file);
      }
  
!   if (flag_inline_trees)
!     cgraph_decide_inlining ();
    cgraph_global_info_ready = true;
    if (cgraph_dump_file)
      {
--- 2996,3002 ----
        dump_cgraph (cgraph_dump_file);
      }
  
!   ipa_passes ();
    cgraph_global_info_ready = true;
    if (cgraph_dump_file)
      {
Index: gimple-low.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gimple-low.c,v
retrieving revision 1.1.4.17.2.9
diff -c -3 -p -r1.1.4.17.2.9 gimple-low.c
*** gimple-low.c	12 Sep 2004 16:39:17 -0000	1.1.4.17.2.9
--- gimple-low.c	24 Oct 2004 23:01:33 -0000
*************** struct tree_opt_pass pass_lower_cf = 
*** 127,133 ****
--- 127,135 ----
  {
    "lower",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    lower_function_body,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_remove_useless
*** 530,536 ****
--- 532,540 ----
  {
    "vars",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    remove_useless_vars,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: passes.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/passes.c,v
retrieving revision 2.2.4.15
diff -c -3 -p -r2.2.4.15 passes.c
*** passes.c	17 Oct 2004 18:30:46 -0000	2.2.4.15
--- passes.c	24 Oct 2004 23:01:33 -0000
*************** struct tree_opt_pass pass_rest_of_compil
*** 1876,1882 ****
--- 1876,1884 ----
  {
    NULL,			                /* name */
    NULL,		                        /* gate */
+   NULL, NULL,				/* IPA analysis */
    rest_of_compilation,                  /* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,                                 /* sub */
    NULL,                                 /* next */
    0,                                    /* static_pass_number */
Index: predict.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/predict.c,v
retrieving revision 1.71.2.18.2.22
diff -c -3 -p -r1.71.2.18.2.22 predict.c
*** predict.c	17 Oct 2004 18:30:46 -0000	1.71.2.18.2.22
--- predict.c	24 Oct 2004 23:01:33 -0000
*************** struct tree_opt_pass pass_profile = 
*** 1902,1908 ****
--- 1902,1910 ----
  {
    "profile",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_estimate_probability,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-cfg.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-cfg.c,v
retrieving revision 1.1.4.267.2.27
diff -c -3 -p -r1.1.4.267.2.27 tree-cfg.c
*** tree-cfg.c	22 Oct 2004 17:35:00 -0000	1.1.4.267.2.27
--- tree-cfg.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_build_cfg =
*** 192,198 ****
--- 192,200 ----
  {
    "cfg",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_build_cfg,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_remove_useless
*** 1629,1635 ****
--- 1631,1639 ----
  {
    "useless",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    remove_useless_stmts,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_split_crit_edg
*** 5199,5205 ****
--- 5203,5211 ----
  {
    "crited",                          /* name */
    NULL,                          /* gate */
+   NULL, NULL,				/* IPA analysis */
    split_critical_edges,          /* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,                          /* sub */
    NULL,                          /* next */
    0,                             /* static_pass_number */
*************** struct tree_opt_pass pass_warn_function_
*** 5396,5402 ****
--- 5402,5410 ----
  {
    NULL,					/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_warn_function_return,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-complex.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-complex.c,v
retrieving revision 1.1.2.6.2.8
diff -c -3 -p -r1.1.2.6.2.8 tree-complex.c
*** tree-complex.c	17 Oct 2004 18:30:59 -0000	1.1.2.6.2.8
--- tree-complex.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_lower_vector_s
*** 921,927 ****
--- 921,929 ----
  {
    "vector",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    expand_vector_operations,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_pre_expand = 
*** 940,946 ****
--- 942,950 ----
  {
    "oplower",				/* name */
    0,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_lower_operations,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-dfa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-dfa.c,v
retrieving revision 1.1.4.217.2.12
diff -c -3 -p -r1.1.4.217.2.12 tree-dfa.c
*** tree-dfa.c	17 Oct 2004 18:30:59 -0000	1.1.4.217.2.12
--- tree-dfa.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_referenced_var
*** 128,134 ****
--- 128,136 ----
  {
    NULL,					/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    find_referenced_vars,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-eh.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-eh.c,v
retrieving revision 1.1.2.23.2.9
diff -c -3 -p -r1.1.2.23.2.9 tree-eh.c
*** tree-eh.c	25 Sep 2004 23:17:56 -0000	1.1.2.23.2.9
--- tree-eh.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_lower_eh =
*** 1650,1656 ****
--- 1650,1658 ----
  {
    "eh",					/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    lower_eh_constructs,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-if-conv.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-if-conv.c,v
retrieving revision 2.8.6.2
diff -c -3 -p -r2.8.6.2 tree-if-conv.c
*** tree-if-conv.c	17 Oct 2004 18:31:00 -0000	2.8.6.2
--- tree-if-conv.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_if_conversion 
*** 1097,1103 ****
--- 1097,1105 ----
  {
    "ifcvt",                           /* name */
    gate_tree_if_conversion,           /* gate */
+   NULL, NULL,				/* IPA analysis */
    main_tree_if_conversion,           /* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,                              /* sub */
    NULL,                              /* next */
    0,                                 /* static_pass_number */
Index: tree-into-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-into-ssa.c,v
retrieving revision 1.1.6.10
diff -c -3 -p -r1.1.6.10 tree-into-ssa.c
*** tree-into-ssa.c	17 Oct 2004 18:31:01 -0000	1.1.6.10
--- tree-into-ssa.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_build_ssa = 
*** 1709,1715 ****
--- 1709,1717 ----
  {
    "ssa",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    rewrite_all_into_ssa,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-mudflap.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-mudflap.c,v
retrieving revision 1.1.2.71.2.13
diff -c -3 -p -r1.1.2.71.2.13 tree-mudflap.c
*** tree-mudflap.c	17 Oct 2004 18:31:01 -0000	1.1.2.71.2.13
--- tree-mudflap.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_mudflap_1 = 
*** 1316,1322 ****
--- 1316,1324 ----
  {
    "mudflap1",                           /* name */
    gate_mudflap,                         /* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_mudflap_function_decls,       /* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,                                 /* sub */
    NULL,                                 /* next */
    0,                                    /* static_pass_number */
*************** struct tree_opt_pass pass_mudflap_2 = 
*** 1333,1339 ****
--- 1335,1343 ----
  {
    "mudflap2",                           /* name */
    gate_mudflap,                         /* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_mudflap_function_ops,         /* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,                                 /* sub */
    NULL,                                 /* next */
    0,                                    /* static_pass_number */
Index: tree-nomudflap.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-nomudflap.c,v
retrieving revision 1.1.2.13.2.2
diff -c -3 -p -r1.1.2.13.2.2 tree-nomudflap.c
*** tree-nomudflap.c	12 Sep 2004 16:39:36 -0000	1.1.2.13.2.2
--- tree-nomudflap.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_mudflap_1 = 
*** 89,95 ****
--- 89,97 ----
  {
    "mudflap1",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    NULL,					/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_mudflap_2 = 
*** 106,112 ****
--- 108,116 ----
  {
    "mudflap2",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    NULL,					/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-nrv.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-nrv.c,v
retrieving revision 1.1.4.5
diff -c -3 -p -r1.1.4.5 tree-nrv.c
*** tree-nrv.c	12 Sep 2004 16:39:36 -0000	1.1.4.5
--- tree-nrv.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_nrv = 
*** 205,211 ****
--- 205,213 ----
  {
    "nrv",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_nrv,				/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-optimize.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-optimize.c,v
retrieving revision 1.1.4.122.2.22
diff -c -3 -p -r1.1.4.122.2.22 tree-optimize.c
*** tree-optimize.c	17 Oct 2004 18:31:01 -0000	1.1.4.122.2.22
--- tree-optimize.c	24 Oct 2004 23:01:34 -0000
*************** bitmap vars_to_rename;
*** 55,113 ****
  bool in_gimple_form;
  
  /* The root of the compilation pass tree, once constructed.  */
! static struct tree_opt_pass *all_passes;
! 
! /* Pass: inline.  */
! 
! static void
! execute_inline (void)
! {
!   struct cgraph_node *node;
! 
!   node = cgraph_node (current_function_decl);
! 
!   if (flag_inline_trees)
!     {
!       struct cgraph_edge *e;
!       for (e = node->callees; e; e = e->next_callee)
! 	if (!e->inline_failed || warn_inline)
! 	  break;
!       if (e)
! 	{
! 	  timevar_push (TV_INTEGRATION);
! 	  optimize_inline_calls (current_function_decl);
! 	  timevar_pop (TV_INTEGRATION);
! 	}
!     }
! 
!   /* We are not going to maintain the cgraph edges up to date.
!      Kill it so it won't confuse us.  */
!   while (node->callees)
!     {
!       /* In non-unit-at-a-time we must mark all referenced functions as needed.
!          */
!       if (node->callees->callee->analyzed && !flag_unit_at_a_time)
!         cgraph_mark_needed_node (node->callees->callee);
!       cgraph_remove_edge (node->callees);
!     }
! }
! 
! static struct tree_opt_pass pass_inline = 
! {
!   "inline",				/* name */
!   NULL,					/* gate */
!   execute_inline,			/* execute */
!   NULL,					/* sub */
!   NULL,					/* next */
!   0,					/* static_pass_number */
!   0,					/* tv_id */
!   0,					/* properties_required */
!   0,					/* properties_provided */
!   0,					/* properties_destroyed */
!   0,					/* todo_flags_start */
!   TODO_dump_func,			/* todo_flags_finish */
!   0					/* letter */
! };
  
  /* Pass: dump the gimplified, inlined, functions.  */
  
--- 55,61 ----
  bool in_gimple_form;
  
  /* The root of the compilation pass tree, once constructed.  */
! static struct tree_opt_pass *all_passes, *all_ipa_passes;
  
  /* Pass: dump the gimplified, inlined, functions.  */
  
*************** static struct tree_opt_pass pass_gimple 
*** 115,121 ****
--- 63,71 ----
  {
    "gimple",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    NULL,					/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** static struct tree_opt_pass pass_cleanup
*** 140,146 ****
--- 90,98 ----
  {
    "cleanupcfg",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_cleanup_cfg_pre_optimizing,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** static struct tree_opt_pass pass_all_opt
*** 170,176 ****
--- 122,130 ----
  {
    NULL,					/* name */
    gate_all_optimizations,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    NULL,					/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** static struct tree_opt_pass pass_cleanup
*** 200,206 ****
--- 154,162 ----
  {
    NULL,					/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_cleanup_cfg_post_optimizing,	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** static struct tree_opt_pass pass_free_da
*** 244,250 ****
--- 200,208 ----
  {
    NULL,					/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_free_datastructures,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** static struct tree_opt_pass pass_init_da
*** 272,278 ****
--- 230,238 ----
  {
    NULL,					/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_init_datastructures,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** static struct tree_opt_pass pass_init_da
*** 290,296 ****
     enabled or not.  */
  
  static void
! register_one_dump_file (struct tree_opt_pass *pass, int n)
  {
    char *dot_name, *flag_name;
    char num[10];
--- 250,256 ----
     enabled or not.  */
  
  static void
! register_one_dump_file (struct tree_opt_pass *pass, bool ipa, int n)
  {
    char *dot_name, *flag_name;
    char num[10];
*************** register_one_dump_file (struct tree_opt_
*** 302,308 ****
  			 ? 1 : pass->static_pass_number));
  
    dot_name = concat (".", pass->name, num, NULL);
!   if (pass->properties_provided & PROP_trees)
      {
        flag_name = concat ("tree-", pass->name, num, NULL);
        pass->static_pass_number = dump_register (dot_name, flag_name,
--- 262,274 ----
  			 ? 1 : pass->static_pass_number));
  
    dot_name = concat (".", pass->name, num, NULL);
!   if (ipa)
!     {
!       flag_name = concat ("ipa-", pass->name, num, NULL);
!       pass->static_pass_number = dump_register (dot_name, flag_name,
!                                                 TDF_IPA, n + 2, 0);
!     }
!   else if (pass->properties_provided & PROP_trees)
      {
        flag_name = concat ("tree-", pass->name, num, NULL);
        pass->static_pass_number = dump_register (dot_name, flag_name,
*************** register_one_dump_file (struct tree_opt_
*** 317,323 ****
  }
  
  static int 
! register_dump_files (struct tree_opt_pass *pass, int properties)
  {
    static int n = 0;
    do
--- 283,289 ----
  }
  
  static int 
! register_dump_files (struct tree_opt_pass *pass, bool ipa, int properties)
  {
    static int n = 0;
    do
*************** register_dump_files (struct tree_opt_pas
*** 338,344 ****
          n++;
  
        if (pass->sub)
!         new_properties = register_dump_files (pass->sub, new_properties);
  
        /* If we have a gate, combine the properties that we could have with
           and without the pass being examined.  */
--- 304,310 ----
          n++;
  
        if (pass->sub)
!         new_properties = register_dump_files (pass->sub, ipa, new_properties);
  
        /* If we have a gate, combine the properties that we could have with
           and without the pass being examined.  */
*************** register_dump_files (struct tree_opt_pas
*** 349,355 ****
  
        pass->properties_provided = properties;
        if (pass->name)
!         register_one_dump_file (pass, pass_number);
  
        pass = pass->next;
      }
--- 315,321 ----
  
        pass->properties_provided = properties;
        if (pass->name)
!         register_one_dump_file (pass, ipa, pass_number);
  
        pass = pass->next;
      }
*************** init_tree_optimization_passes (void)
*** 407,413 ****
  
    p = &all_passes;
    NEXT_PASS (pass_gimple);
-   NEXT_PASS (pass_inline);
    NEXT_PASS (pass_remove_useless_stmts);
    NEXT_PASS (pass_mudflap_1);
    NEXT_PASS (pass_lower_cf);
--- 373,378 ----
*************** init_tree_optimization_passes (void)
*** 482,501 ****
    NEXT_PASS (pass_complete_unroll);
    NEXT_PASS (pass_iv_optimize);
    NEXT_PASS (pass_loop_done);
    *p = NULL;
  
  #undef NEXT_PASS
  
    /* Register the passes with the tree dump code.  */
!   register_dump_files (all_passes, 0);
  }
  
- static void execute_pass_list (struct tree_opt_pass *);
- 
  static unsigned int last_verified;
  
  static void
! execute_todo (int properties, unsigned int flags)
  {
    if (flags & TODO_rename_vars)
      {
--- 447,476 ----
    NEXT_PASS (pass_complete_unroll);
    NEXT_PASS (pass_iv_optimize);
    NEXT_PASS (pass_loop_done);
+   p = &all_ipa_passes;
+   NEXT_PASS (pass_ipa_inline);
    *p = NULL;
  
  #undef NEXT_PASS
  
    /* Register the passes with the tree dump code.  */
!   register_dump_files (all_passes, false, 0);
!   register_dump_files (all_ipa_passes, true, 0);
  }
  
  static unsigned int last_verified;
  
+ enum execute_pass_hook
+ {
+   ANALYZE_FUNCTION_HOOK,
+   ANALYZE_VARIABLE_HOOK,
+   EXECUTE_HOOK,
+   MODIFY_FUNCTION_HOOK,
+   MODIFY_VARIABLE_HOOK
+ };
+ 
  static void
! execute_todo (int properties, unsigned int flags, enum execute_pass_hook hook)
  {
    if (flags & TODO_rename_vars)
      {
*************** execute_todo (int properties, unsigned i
*** 503,511 ****
        bitmap_clear (vars_to_rename);
      }
  
!   if ((flags & TODO_dump_func) && dump_file)
      {
!       if (properties & PROP_trees)
          dump_function_to_file (current_function_decl,
                                 dump_file, dump_flags);
        else if (properties & PROP_cfg)
--- 478,488 ----
        bitmap_clear (vars_to_rename);
      }
  
!   if ((flags & TODO_dump_func)
!       && (hook == MODIFY_FUNCTION_HOOK || hook == EXECUTE_HOOK)
!       && dump_file && current_function_decl)
      {
!       if ((properties & PROP_trees) || (hook == MODIFY_FUNCTION_HOOK))
          dump_function_to_file (current_function_decl,
                                 dump_file, dump_flags);
        else if (properties & PROP_cfg)
*************** execute_todo (int properties, unsigned i
*** 517,522 ****
--- 494,508 ----
  	 close the file before aborting.  */
        fflush (dump_file);
      }
+   if ((flags & TODO_dump_cgraph)
+       && dump_file && !current_function_decl
+       && hook == EXECUTE_HOOK)
+     {
+       dump_cgraph (dump_file);
+       /* Flush the file.  If verification fails, we won't be able to
+ 	 close the file before aborting.  */
+       fflush (dump_file);
+     }
  
    if (flags & TODO_ggc_collect)
      ggc_collect ();
*************** execute_todo (int properties, unsigned i
*** 532,538 ****
  }
  
  static bool
! execute_one_pass (struct tree_opt_pass *pass)
  {
    unsigned int todo; 
  
--- 518,525 ----
  }
  
  static bool
! execute_one_pass (struct tree_opt_pass *pass, enum execute_pass_hook hook,
! 		  struct cgraph_node *node, struct cgraph_varpool_node *vnode)
  {
    unsigned int todo; 
  
*************** execute_one_pass (struct tree_opt_pass *
*** 547,553 ****
    /* Run pre-pass verification.  */
    todo = pass->todo_flags_start & ~last_verified;
    if (todo)
!     execute_todo (pass->properties_required, todo);
  
    /* If a dump file name is present, open it if enabled.  */
    if (pass->static_pass_number != -1)
--- 534,540 ----
    /* Run pre-pass verification.  */
    todo = pass->todo_flags_start & ~last_verified;
    if (todo)
!     execute_todo (pass->properties_required, todo, hook);
  
    /* If a dump file name is present, open it if enabled.  */
    if (pass->static_pass_number != -1)
*************** execute_one_pass (struct tree_opt_pass *
*** 555,572 ****
        bool initializing_dump = !dump_initialized_p (pass->static_pass_number);
        dump_file_name = get_dump_file_name (pass->static_pass_number);
        dump_file = dump_begin (pass->static_pass_number, &dump_flags);
!       if (dump_file)
  	{
  	  const char *dname, *aname;
  	  dname = lang_hooks.decl_printable_name (current_function_decl, 2);
  	  aname = (IDENTIFIER_POINTER
  		   (DECL_ASSEMBLER_NAME (current_function_decl)));
!           fprintf (dump_file, "\n;; Function %s (%s)%s\n\n", dname, aname,
!              cfun->function_frequency == FUNCTION_FREQUENCY_HOT
!              ? " (hot)"
!              : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
!              ? " (unlikely executed)"
!              : "");
  	}
  
        if (initializing_dump
--- 542,561 ----
        bool initializing_dump = !dump_initialized_p (pass->static_pass_number);
        dump_file_name = get_dump_file_name (pass->static_pass_number);
        dump_file = dump_begin (pass->static_pass_number, &dump_flags);
!       if (dump_file
! 	  && ((current_function_decl && hook == EXECUTE_HOOK)
! 	      || hook == MODIFY_FUNCTION_HOOK))
  	{
  	  const char *dname, *aname;
  	  dname = lang_hooks.decl_printable_name (current_function_decl, 2);
  	  aname = (IDENTIFIER_POINTER
  		   (DECL_ASSEMBLER_NAME (current_function_decl)));
! 	  fprintf (dump_file, "\n;; Function %s (%s)%s\n\n", dname, aname,
! 	     cfun->function_frequency == FUNCTION_FREQUENCY_HOT
! 	     ? " (hot)"
! 	     : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
! 	     ? " (unlikely executed)"
! 	     : "");
  	}
  
        if (initializing_dump
*************** execute_one_pass (struct tree_opt_pass *
*** 581,588 ****
      timevar_push (pass->tv_id);
  
    /* Do it!  */
!   if (pass->execute)
!     pass->execute ();
  
    /* Stop timevar.  */
    if (pass->tv_id)
--- 570,598 ----
      timevar_push (pass->tv_id);
  
    /* Do it!  */
!   switch (hook)
!     {
!     case ANALYZE_FUNCTION_HOOK:
!       if (pass->analyze_function)
! 	pass->analyze_function (node);
!       break;
!     case ANALYZE_VARIABLE_HOOK:
!       if (pass->analyze_variable)
! 	pass->analyze_variable (vnode);
!       break;
!     case EXECUTE_HOOK:
!       if (pass->execute)
! 	pass->execute ();
!       break;
!     case MODIFY_FUNCTION_HOOK:
!       if (pass->modify_function)
! 	pass->modify_function (node);
!       break;
!     case MODIFY_VARIABLE_HOOK:
!       if (pass->modify_variable)
! 	pass->modify_variable (vnode);
!       break;
!     }
  
    /* Stop timevar.  */
    if (pass->tv_id)
*************** execute_one_pass (struct tree_opt_pass *
*** 597,603 ****
    todo = pass->todo_flags_finish;
    last_verified = todo & TODO_verify_all;
    if (todo)
!     execute_todo (pass->properties_provided, todo);
  
    /* Flush and close dump file.  */
    if (dump_file_name)
--- 607,613 ----
    todo = pass->todo_flags_finish;
    last_verified = todo & TODO_verify_all;
    if (todo)
!     execute_todo (pass->properties_provided, todo, hook);
  
    /* Flush and close dump file.  */
    if (dump_file_name)
*************** execute_one_pass (struct tree_opt_pass *
*** 615,630 ****
  }
  
  static void
! execute_pass_list (struct tree_opt_pass *pass)
  {
    do
      {
!       if (execute_one_pass (pass) && pass->sub)
! 	execute_pass_list (pass->sub);
        pass = pass->next;
      }
    while (pass);
  }
  
  
  /* Update recursively all inlined_to pointers of functions
--- 625,667 ----
  }
  
  static void
! execute_pass_list (struct tree_opt_pass *pass, enum execute_pass_hook hook,
! 		   struct cgraph_node *node, struct cgraph_varpool_node *vnode)
  {
    do
      {
!       if (execute_one_pass (pass, hook, node, vnode) && pass->sub)
! 	execute_pass_list (pass->sub, hook, node, vnode);
        pass = pass->next;
      }
    while (pass);
  }
+ 
+ void
+ ipa_analyze_function (struct cgraph_node *node)
+ {
+    execute_pass_list (all_ipa_passes, ANALYZE_FUNCTION_HOOK, node, NULL);
+ }
+ void
+ ipa_analyze_variable (struct cgraph_varpool_node *vnode)
+ {
+    execute_pass_list (all_ipa_passes, ANALYZE_VARIABLE_HOOK, NULL, vnode);
+ }
+ void
+ ipa_modify_function (struct cgraph_node *node)
+ {
+    execute_pass_list (all_ipa_passes, MODIFY_FUNCTION_HOOK, node, NULL);
+ }
+ void
+ ipa_modify_variable (struct cgraph_varpool_node *vnode)
+ {
+    execute_pass_list (all_ipa_passes, MODIFY_VARIABLE_HOOK, NULL, vnode);
+ }
+ void
+ ipa_passes (void)
+ {
+    execute_pass_list (all_ipa_passes, EXECUTE_HOOK, NULL, NULL);
+ }
  
  
  /* Update recursively all inlined_to pointers of functions
*************** tree_rest_of_compilation (tree fndecl)
*** 695,701 ****
      vars_to_rename = BITMAP_XMALLOC ();
  
    /* Perform all tree transforms and optimizations.  */
!   execute_pass_list (all_passes);
  
    /* Restore original body if still needed.  */
    if (cfun->saved_tree)
--- 732,739 ----
      vars_to_rename = BITMAP_XMALLOC ();
  
    /* Perform all tree transforms and optimizations.  */
!   ipa_modify_function (cgraph_node (fndecl));
!   execute_pass_list (all_passes, EXECUTE_HOOK, NULL, NULL);
  
    /* Restore original body if still needed.  */
    if (cfun->saved_tree)
Index: tree-outof-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-outof-ssa.c,v
retrieving revision 1.1.6.9
diff -c -3 -p -r1.1.6.9 tree-outof-ssa.c
*** tree-outof-ssa.c	17 Oct 2004 18:31:01 -0000	1.1.6.9
--- tree-outof-ssa.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_del_ssa = 
*** 2078,2084 ****
--- 2078,2086 ----
  {
    "optimized",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    rewrite_out_of_ssa,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-pass.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-pass.h,v
retrieving revision 1.1.2.12.2.8
diff -c -3 -p -r1.1.2.12.2.8 tree-pass.h
*** tree-pass.h	17 Oct 2004 18:31:01 -0000	1.1.2.12.2.8
--- tree-pass.h	24 Oct 2004 23:01:34 -0000
*************** extern struct bitmap_head_def *vars_to_r
*** 33,38 ****
--- 33,41 ----
  /* Return the dump_file_info for the given phase.  */
  extern struct dump_file_info *get_dump_file_info (enum tree_dump_index);
  
+ struct cgraph_node;
+ struct cgraph_varpool_node;
+ 
  /* Describe one pass.  */
  struct tree_opt_pass
  {
*************** struct tree_opt_pass
*** 43,52 ****
       the function returns true.  */
    bool (*gate) (void);
  
    /* This is the code to run.  If null, then there should be sub-passes
!      otherwise this pass does nothing.  */
    void (*execute) (void);
  
    /* A list of sub-passes to run, dependent on gate predicate.  */
    struct tree_opt_pass *sub;
  
--- 46,73 ----
       the function returns true.  */
    bool (*gate) (void);
  
+   /* For intraprocedural passes, these hooks are used to analyze each function
+      and variable within the compilation unit, before EXECUTE hooks is called.
+      Note that some nodes may be removed or clonned before execution takes
+      place.  */
+   void (*analyze_function) (struct cgraph_node *);
+   void (*analyze_variable) (struct cgraph_varpool_node *);
+ 
    /* This is the code to run.  If null, then there should be sub-passes
!      otherwise this pass does nothing. 
!      
!      For interprocuedrual passes it is supposed to optimize
!      current_function_decl, for intraprocedural passes it is supposed to walk
!      the callgraph and do the analysis from previously garthered static data
!      without actually touching the function bodies or variable initializers.
!      */
    void (*execute) (void);
  
+   /* For intraprocedural passes, these hooks are used to apply the changes
+      to each function and variable before it is compiled.  */
+   void (*modify_function) (struct cgraph_node *);
+   void (*modify_variable) (struct cgraph_varpool_node *);
+ 
    /* A list of sub-passes to run, dependent on gate predicate.  */
    struct tree_opt_pass *sub;
  
*************** struct dump_file_info
*** 106,115 ****
--- 127,142 ----
  #define TODO_verify_ssa		(1 << 3)
  #define TODO_verify_flow	(1 << 4)
  #define TODO_verify_stmts	(1 << 5)
+ #define TODO_dump_cgraph	(1 << 6)
  
  #define TODO_verify_all \
    (TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts)
  
+ extern void ipa_analyze_function (struct cgraph_node *node);
+ extern void ipa_analyze_variable (struct cgraph_varpool_node *vnode);
+ extern void ipa_modify_function (struct cgraph_node *node);
+ extern void ipa_modify_variable (struct cgraph_varpool_node *vnode);
+ extern void ipa_passes (void);
  
  extern struct tree_opt_pass pass_mudflap_1;
  extern struct tree_opt_pass pass_mudflap_2;
*************** extern struct tree_opt_pass pass_rest_of
*** 162,165 ****
--- 189,194 ----
  extern struct tree_opt_pass pass_fre;
  extern struct tree_opt_pass pass_linear_transform;
  
+ extern struct tree_opt_pass pass_ipa_inline;
+ 
  #endif /* GCC_TREE_PASS_H */
Index: tree-profile.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-profile.c,v
retrieving revision 1.1.4.6
diff -c -3 -p -r1.1.4.6 tree-profile.c
*** tree-profile.c	22 Oct 2004 21:51:39 -0000	1.1.4.6
--- tree-profile.c	24 Oct 2004 23:01:34 -0000
*************** struct tree_opt_pass pass_tree_profile =
*** 601,607 ****
--- 601,609 ----
  {
    "tree_profile",			/* name */
    do_tree_profiling,			/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_profiling,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-sra.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-sra.c,v
retrieving revision 1.1.2.20.2.11
diff -c -3 -p -r1.1.2.20.2.11 tree-sra.c
*** tree-sra.c	22 Oct 2004 17:35:01 -0000	1.1.2.20.2.11
--- tree-sra.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_sra =
*** 2066,2072 ****
--- 2066,2074 ----
  {
    "sra",				/* name */
    gate_sra,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_sra,				/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-alias.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-alias.c,v
retrieving revision 1.1.2.1.2.12
diff -c -3 -p -r1.1.2.1.2.12 tree-ssa-alias.c
*** tree-ssa-alias.c	17 Oct 2004 18:31:02 -0000	1.1.2.1.2.12
--- tree-ssa-alias.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_may_alias = 
*** 345,351 ****
--- 345,353 ----
  {
    "alias",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    compute_may_aliases,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-ccp.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-ccp.c,v
retrieving revision 1.1.2.139.2.14
diff -c -3 -p -r1.1.2.139.2.14 tree-ssa-ccp.c
*** tree-ssa-ccp.c	17 Oct 2004 18:31:03 -0000	1.1.2.139.2.14
--- tree-ssa-ccp.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_ccp = 
*** 1221,1227 ****
--- 1221,1229 ----
  {
    "ccp",				/* name */
    gate_ccp,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_ssa_ccp,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_fold_builtins 
*** 2212,2218 ****
--- 2214,2222 ----
  {
    "fab",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_fold_all_builtins,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-copyrename.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-copyrename.c,v
retrieving revision 1.1.4.10
diff -c -3 -p -r1.1.4.10 tree-ssa-copyrename.c
*** tree-ssa-copyrename.c	17 Oct 2004 18:31:03 -0000	1.1.4.10
--- tree-ssa-copyrename.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_rename_ssa_cop
*** 389,395 ****
--- 389,397 ----
  {  
    "copyrename",				/* name */
    gate_copyrename,			/* gate */
+   NULL, NULL,				/* IPA analysis */
    rename_ssa_copies,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-dce.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-dce.c,v
retrieving revision 1.1.2.78.2.12
diff -c -3 -p -r1.1.2.78.2.12 tree-ssa-dce.c
*** tree-ssa-dce.c	17 Oct 2004 18:31:03 -0000	1.1.2.78.2.12
--- tree-ssa-dce.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_dce =
*** 918,924 ****
--- 918,926 ----
  {
    "dce",				/* name */
    gate_dce,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_dce,				/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_cd_dce =
*** 935,941 ****
--- 937,945 ----
  {
    "cddce",				/* name */
    gate_dce,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_cd_dce,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-dom.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-dom.c,v
retrieving revision 1.1.2.135.2.17
diff -c -3 -p -r1.1.2.135.2.17 tree-ssa-dom.c
*** tree-ssa-dom.c	17 Oct 2004 18:31:03 -0000	1.1.2.135.2.17
--- tree-ssa-dom.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_dominator = 
*** 437,443 ****
--- 437,445 ----
  {
    "dom",				/* name */
    gate_dominator,			/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_dominator_optimize,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-dse.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-dse.c,v
retrieving revision 1.1.4.9
diff -c -3 -p -r1.1.4.9 tree-ssa-dse.c
*** tree-ssa-dse.c	17 Oct 2004 18:31:04 -0000	1.1.4.9
--- tree-ssa-dse.c	24 Oct 2004 23:01:35 -0000
*************** gate_dse (void)
*** 452,458 ****
--- 452,460 ----
  struct tree_opt_pass pass_dse = {
    "dse",			/* name */
    gate_dse,			/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_dse,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,				/* sub */
    NULL,				/* next */
    0,				/* static_pass_number */
Index: tree-ssa-forwprop.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-forwprop.c,v
retrieving revision 1.1.2.1.2.11
diff -c -3 -p -r1.1.2.1.2.11 tree-ssa-forwprop.c
*** tree-ssa-forwprop.c	17 Oct 2004 18:31:04 -0000	1.1.2.1.2.11
--- tree-ssa-forwprop.c	24 Oct 2004 23:01:35 -0000
*************** gate_forwprop (void)
*** 543,549 ****
--- 543,551 ----
  struct tree_opt_pass pass_forwprop = {
    "forwprop",			/* name */
    gate_forwprop,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_forward_propagate_single_use_vars,	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,				/* sub */
    NULL,				/* next */
    0,				/* static_pass_number */
Index: tree-ssa-loop-ch.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-loop-ch.c,v
retrieving revision 2.2.2.5
diff -c -3 -p -r2.2.2.5 tree-ssa-loop-ch.c
*** tree-ssa-loop-ch.c	17 Oct 2004 18:31:04 -0000	2.2.2.5
--- tree-ssa-loop-ch.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_ch = 
*** 231,237 ****
--- 231,239 ----
  {
    "ch",					/* name */
    gate_ch,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    copy_loop_headers,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-loop.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-loop.c,v
retrieving revision 1.1.2.6.2.10
diff -c -3 -p -r1.1.2.6.2.10 tree-ssa-loop.c
*** tree-ssa-loop.c	17 Oct 2004 18:31:05 -0000	1.1.2.6.2.10
--- tree-ssa-loop.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_loop = 
*** 80,86 ****
--- 80,88 ----
  {
    "loop",				/* name */
    gate_loop,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    NULL,					/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_loop_init = 
*** 112,118 ****
--- 114,122 ----
  {
    "loopinit",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_loop_init,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_lim = 
*** 146,152 ****
--- 150,158 ----
  {
    "lim",				/* name */
    gate_tree_ssa_loop_im,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_loop_im,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_unswitch = 
*** 180,186 ****
--- 186,194 ----
  {
    "unswitch",				/* name */
    gate_tree_ssa_loop_unswitch,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_loop_unswitch,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_vectorize =
*** 215,221 ****
--- 223,231 ----
  {
    "vect",                               /* name */
    gate_tree_vectorize,                  /* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_vectorize,                       /* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,                                 /* sub */
    NULL,                                 /* next */
    0,                                    /* static_pass_number */
*************** struct tree_opt_pass pass_linear_transfo
*** 250,256 ****
--- 260,268 ----
  {
    "ltrans",				/* name */
    gate_tree_linear_transform,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_linear_transform,       		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_iv_canon =
*** 284,290 ****
--- 296,304 ----
  {
    "ivcanon",				/* name */
    gate_tree_ssa_loop_ivcanon,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_loop_ivcanon,	       	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_record_bounds 
*** 313,319 ****
--- 327,335 ----
  {
    NULL,					/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_loop_bounds,		       	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_complete_unrol
*** 347,353 ****
--- 363,371 ----
  {
    "cunroll",				/* name */
    gate_tree_complete_unroll,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_complete_unroll,		       	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_iv_optimize =
*** 381,387 ****
--- 399,407 ----
  {
    "ivopts",				/* name */
    gate_tree_ssa_loop_ivopts,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_loop_ivopts,		       	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_loop_done = 
*** 418,424 ****
--- 438,446 ----
  {
    "loopdone",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_loop_done,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-phiopt.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-phiopt.c,v
retrieving revision 1.1.2.1.2.14
diff -c -3 -p -r1.1.2.1.2.14 tree-ssa-phiopt.c
*** tree-ssa-phiopt.c	17 Oct 2004 18:31:05 -0000	1.1.2.1.2.14
--- tree-ssa-phiopt.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_phiopt =
*** 660,666 ****
--- 660,668 ----
  {
    "phiopt",				/* name */
    gate_phiopt,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    tree_ssa_phiopt,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa-pre.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-pre.c,v
retrieving revision 1.1.4.129.2.13
diff -c -3 -p -r1.1.4.129.2.13 tree-ssa-pre.c
*** tree-ssa-pre.c	17 Oct 2004 18:31:05 -0000	1.1.4.129.2.13
--- tree-ssa-pre.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_pre =
*** 2078,2084 ****
--- 2078,2086 ----
  {
    "pre",				/* name */
    gate_pre,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    do_pre,				/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_fre =
*** 2111,2117 ****
--- 2113,2121 ----
  {
    "fre",				/* name */
    gate_fre,				/* gate */
+   NULL, NULL,				/* IPA analysis */
    do_fre,				/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa.c,v
retrieving revision 1.1.4.199.2.15
diff -c -3 -p -r1.1.4.199.2.15 tree-ssa.c
*** tree-ssa.c	22 Oct 2004 17:35:02 -0000	1.1.4.199.2.15
--- tree-ssa.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_redundant_phi 
*** 1293,1299 ****
--- 1293,1301 ----
  {
    "redphi",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    kill_redundant_phi_nodes,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_early_warn_uni
*** 1435,1441 ****
--- 1437,1445 ----
  {
    NULL,					/* name */
    gate_warn_uninitialized,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_early_warn_uninitialized,	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_late_warn_unin
*** 1452,1458 ****
--- 1456,1464 ----
  {
    NULL,					/* name */
    gate_warn_uninitialized,		/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_late_warn_uninitialized,	/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
Index: tree-tailcall.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-tailcall.c,v
retrieving revision 1.1.2.17.2.9
diff -c -3 -p -r1.1.2.17.2.9 tree-tailcall.c
*** tree-tailcall.c	17 Oct 2004 18:31:06 -0000	1.1.2.17.2.9
--- tree-tailcall.c	24 Oct 2004 23:01:35 -0000
*************** struct tree_opt_pass pass_tail_recursion
*** 971,977 ****
--- 971,979 ----
  {
    "tailr",				/* name */
    NULL,					/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_tail_recursion,		/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */
*************** struct tree_opt_pass pass_tail_calls = 
*** 988,994 ****
--- 990,998 ----
  {
    "tailc",				/* name */
    gate_tail_calls,			/* gate */
+   NULL, NULL,				/* IPA analysis */
    execute_tail_calls,			/* execute */
+   NULL, NULL,				/* IPA modification */
    NULL,					/* sub */
    NULL,					/* next */
    0,					/* static_pass_number */


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