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: IPA merge 3: passmanager tweeks


> OK, with some revisions.

Hi,
for a record, this is revised version of patch I intend to commit once
re-testing converge.

Thanks and promise to try to figure out how to cleanup the tree-optimize
relations ;)

Honza

	* omp-low.c (expand_omp_parallel): Set function properties.
	* function.h (struct function): Add curr_properties and last_verified.
	* passes.c (register_dump_files): Do not set TODO_set_props for the
	first pass
	(init_optimization_passes): Set it here; reorder initialization so the
	dump files appear in more logical order.
	(last_verified, curr_properties): Kill.
	(do_per_function): New function.
	(execute_function_todo): Break out from ...
	(execute_todo): ... here; handle per-function flags.
	(clear_last_verified, verify_curr_properties,
	update_properties_after_pass): New functions.
	(execute_one_pass): Handle per-function properties.
	(execute_ipa_pass_list): Use do_per_function; sanity check that cfun
	and current_function_decls are cleared out.
	* ipa-cp.c (constant_val_insert): Clear cfun/current_function_decl
	after use.
Index: ipa-cp.c
===================================================================
*** ipa-cp.c	(revision 119965)
--- ipa-cp.c	(working copy)
*************** constant_val_insert (tree fn, tree parm1
*** 453,458 ****
--- 453,460 ----
    if (ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs)
      FOR_EACH_EDGE (e_step, ei, ENTRY_BLOCK_PTR_FOR_FUNCTION (func)->succs)
        bsi_insert_on_edge_immediate (e_step, init_stmt);
+   current_function_decl = NULL;
+   cfun = NULL;
  }
  
  /* build INTEGER_CST tree with type TREE_TYPE and 
Index: omp-low.c
===================================================================
*** omp-low.c	(revision 119965)
--- omp-low.c	(working copy)
*************** expand_omp_parallel (struct omp_region *
*** 2531,2536 ****
--- 2531,2538 ----
        new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb);
        if (exit_bb)
  	single_succ_edge (new_bb)->flags = EDGE_FALLTHRU;
+       DECL_STRUCT_FUNCTION (child_fn)->curr_properties
+ 	= cfun->curr_properties;
        cgraph_add_new_function (child_fn);
  
        /* Convert OMP_RETURN into a RETURN_EXPR.  */
Index: function.h
===================================================================
*** function.h	(revision 119965)
--- function.h	(working copy)
*************** struct function GTY(())
*** 373,378 ****
--- 373,382 ----
       Used for detecting stack clobbers.  */
    tree stack_protect_guard;
  
+   /* Properties used by the pass manager.  */
+   unsigned int curr_properties;
+   unsigned int last_verified;
+ 
    /* Collected bit flags.  */
  
    /* Nonzero if function being compiled needs to be given an address
Index: passes.c
===================================================================
*** passes.c	(revision 119965)
--- passes.c	(working copy)
*************** static void 
*** 371,377 ****
  register_dump_files (struct tree_opt_pass *pass, bool ipa, int properties)
  {
    pass->properties_required |= properties;
-   pass->todo_flags_start |= TODO_set_props;
    register_dump_files_1 (pass, ipa, properties);
  }
  
--- 371,376 ----
*************** init_optimization_passes (void)
*** 695,723 ****
  #undef NEXT_PASS
  
    /* Register the passes with the tree dump code.  */
    register_dump_files (all_ipa_passes, true,
  		       PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
  		       | PROP_cfg);
-   register_dump_files (all_lowering_passes, false, PROP_gimple_any);
    register_dump_files (all_passes, false,
  		       PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
  		       | PROP_cfg);
  }
  
! static unsigned int last_verified;
! static unsigned int curr_properties;
  
  static void
! execute_todo (unsigned int flags)
  {
! #if defined ENABLE_CHECKING
!   if (need_ssa_update_p ())
!     gcc_assert (flags & TODO_update_ssa_any);
! #endif
  
!   if (curr_properties & PROP_ssa)
      flags |= TODO_verify_ssa;
!   flags &= ~last_verified;
    if (!flags)
      return;
    
--- 694,745 ----
  #undef NEXT_PASS
  
    /* Register the passes with the tree dump code.  */
+   register_dump_files (all_lowering_passes, false, PROP_gimple_any);
+   all_lowering_passes->todo_flags_start |= TODO_set_props;
    register_dump_files (all_ipa_passes, true,
  		       PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
  		       | PROP_cfg);
    register_dump_files (all_passes, false,
  		       PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
  		       | PROP_cfg);
  }
  
! /* If we are in IPA mode (i.e., current_function_decl is NULL), call
!    function CALLBACK for every function in the call graph.  Otherwise,
!    call CALLBACK on the current function.  */ 
  
  static void
! do_per_function (void (*callback) (void *data), void *data)
  {
!   if (current_function_decl)
!     callback (data);
!   else
!     {
!       struct cgraph_node *node;
!       for (node = cgraph_nodes; node; node = node->next)
! 	if (node->analyzed)
! 	  {
! 	    push_cfun (DECL_STRUCT_FUNCTION (node->decl));
! 	    current_function_decl = node->decl;
! 	    callback (data);
! 	    free_dominance_info (CDI_DOMINATORS);
! 	    free_dominance_info (CDI_POST_DOMINATORS);
! 	    current_function_decl = NULL;
! 	    pop_cfun ();
! 	    ggc_collect ();
! 	  }
!     }
! }
! 
! /* Perform all TODO actions that ought to be done on each function.  */
  
! static void
! execute_function_todo (void *data)
! {
!   unsigned int flags = (size_t)data;
!   if (cfun->curr_properties & PROP_ssa)
      flags |= TODO_verify_ssa;
!   flags &= ~cfun->last_verified;
    if (!flags)
      return;
    
*************** execute_todo (unsigned int flags)
*** 743,749 ****
      {
        unsigned update_flags = flags & TODO_update_ssa_any;
        update_ssa (update_flags);
!       last_verified &= ~TODO_verify_ssa;
      }
  
    if (flags & TODO_remove_unused_locals)
--- 765,771 ----
      {
        unsigned update_flags = flags & TODO_update_ssa_any;
        update_ssa (update_flags);
!       cfun->last_verified &= ~TODO_verify_ssa;
      }
  
    if (flags & TODO_remove_unused_locals)
*************** execute_todo (unsigned int flags)
*** 752,770 ****
    if ((flags & TODO_dump_func)
        && dump_file && current_function_decl)
      {
!       if (curr_properties & PROP_trees)
          dump_function_to_file (current_function_decl,
                                 dump_file, dump_flags);
        else
  	{
  	  if (dump_flags & TDF_SLIM)
  	    print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
! 	  else if ((curr_properties & PROP_cfg) && (dump_flags & TDF_BLOCKS))
  	    print_rtl_with_bb (dump_file, get_insns ());
            else
  	    print_rtl (dump_file, get_insns ());
  
! 	  if (curr_properties & PROP_cfg
  	      && graph_dump_format != no_graph
  	      && (dump_flags & TDF_GRAPH))
  	    print_rtl_graph_with_bb (dump_file_name, get_insns ());
--- 774,793 ----
    if ((flags & TODO_dump_func)
        && dump_file && current_function_decl)
      {
!       if (cfun->curr_properties & PROP_trees)
          dump_function_to_file (current_function_decl,
                                 dump_file, dump_flags);
        else
  	{
  	  if (dump_flags & TDF_SLIM)
  	    print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
! 	  else if ((cfun->curr_properties & PROP_cfg)
! 		   && (dump_flags & TDF_BLOCKS))
  	    print_rtl_with_bb (dump_file, get_insns ());
            else
  	    print_rtl (dump_file, get_insns ());
  
! 	  if (cfun->curr_properties & PROP_cfg
  	      && graph_dump_format != no_graph
  	      && (dump_flags & TDF_GRAPH))
  	    print_rtl_graph_with_bb (dump_file_name, get_insns ());
*************** execute_todo (unsigned int flags)
*** 774,779 ****
--- 797,828 ----
  	 close the file before aborting.  */
        fflush (dump_file);
      }
+ 
+ #if defined ENABLE_CHECKING
+   if (flags & TODO_verify_ssa)
+     verify_ssa (true);
+   if (flags & TODO_verify_flow)
+     verify_flow_info ();
+   if (flags & TODO_verify_stmts)
+     verify_stmts ();
+   if (flags & TODO_verify_loops)
+     verify_loop_closed_ssa ();
+ #endif
+ 
+   cfun->last_verified = flags & TODO_verify_all;
+ }
+ 
+ /* Perform all TODO actions.  */
+ static void
+ execute_todo (unsigned int flags)
+ {
+ #if defined ENABLE_CHECKING
+   if (need_ssa_update_p ())
+     gcc_assert (flags & TODO_update_ssa_any);
+ #endif
+ 
+   do_per_function (execute_function_todo, (void *)(size_t) flags);
+ 
    if ((flags & TODO_dump_cgraph)
        && dump_file && !current_function_decl)
      {
*************** execute_todo (unsigned int flags)
*** 787,805 ****
      {
        ggc_collect ();
      }
  
! #if defined ENABLE_CHECKING
!   if (flags & TODO_verify_ssa)
!     verify_ssa (true);
!   if (flags & TODO_verify_flow)
!     verify_flow_info ();
!   if (flags & TODO_verify_stmts)
!     verify_stmts ();
!   if (flags & TODO_verify_loops)
!     verify_loop_closed_ssa ();
! #endif
  
!   last_verified = flags & TODO_verify_all;
  }
  
  static bool
--- 836,869 ----
      {
        ggc_collect ();
      }
+ }
  
! /* Clear the last verified flag.  */
! 
! static void
! clear_last_verified (void *data ATTRIBUTE_UNUSED)
! {
!   cfun->last_verified = 0;
! }
! 
! /* Helper function. Verify that the properties has been turn into the
!    properties expected by the pass.  */
  
! static void
! verify_curr_properties (void *data)
! {
!   unsigned int props = (size_t)data;
!   gcc_assert ((cfun->curr_properties & props) == props);
! }
! 
! /* After executing the pass, apply expected changes to the function
!    properties. */
! static void
! update_properties_after_pass (void *data)
! {
!   struct tree_opt_pass *pass = data;
!   cfun->curr_properties = (cfun->curr_properties | pass->properties_provided)
! 		           & ~pass->properties_destroyed;
  }
  
  static bool
*************** execute_one_pass (struct tree_opt_pass *
*** 813,829 ****
      return false;
  
    if (pass->todo_flags_start & TODO_set_props)
!     curr_properties = pass->properties_required;
  
    /* Note that the folders should only create gimple expressions.
       This is a hack until the new folder is ready.  */
!   in_gimple_form = (curr_properties & PROP_trees) != 0;
  
    /* Run pre-pass verification.  */
    execute_todo (pass->todo_flags_start);
  
!   gcc_assert ((curr_properties & pass->properties_required)
! 	      == pass->properties_required);
  
    /* If a dump file name is present, open it if enabled.  */
    if (pass->static_pass_number != -1)
--- 877,895 ----
      return false;
  
    if (pass->todo_flags_start & TODO_set_props)
!     cfun->curr_properties = pass->properties_required;
  
    /* Note that the folders should only create gimple expressions.
       This is a hack until the new folder is ready.  */
!   in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
  
    /* Run pre-pass verification.  */
    execute_todo (pass->todo_flags_start);
  
! #ifdef ENABLE_CHECKING
!   do_per_function (verify_curr_properties,
! 		   (void *)(size_t)pass->properties_required);
! #endif
  
    /* If a dump file name is present, open it if enabled.  */
    if (pass->static_pass_number != -1)
*************** execute_one_pass (struct tree_opt_pass *
*** 856,875 ****
    if (pass->execute)
      {
        todo_after = pass->execute ();
!       last_verified = 0;
      }
  
    /* Stop timevar.  */
    if (pass->tv_id)
      timevar_pop (pass->tv_id);
  
!   curr_properties = (curr_properties | pass->properties_provided)
! 		    & ~pass->properties_destroyed;
  
    if (initializing_dump
        && dump_file
        && graph_dump_format != no_graph
!       && (curr_properties & (PROP_cfg | PROP_rtl)) == (PROP_cfg | PROP_rtl))
      {
        get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH;
        dump_flags |= TDF_GRAPH;
--- 922,941 ----
    if (pass->execute)
      {
        todo_after = pass->execute ();
!       do_per_function (clear_last_verified, NULL);
      }
  
    /* Stop timevar.  */
    if (pass->tv_id)
      timevar_pop (pass->tv_id);
  
!   do_per_function (update_properties_after_pass, pass);
  
    if (initializing_dump
        && dump_file
        && graph_dump_format != no_graph
!       && (cfun->curr_properties & (PROP_cfg | PROP_rtl))
! 	  == (PROP_cfg | PROP_rtl))
      {
        get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH;
        dump_flags |= TDF_GRAPH;
*************** execute_ipa_pass_list (struct tree_opt_p
*** 914,935 ****
  {
    do
      {
        if (execute_one_pass (pass) && pass->sub)
! 	{
! 	  struct cgraph_node *node;
! 	  for (node = cgraph_nodes; node; node = node->next)
! 	    if (node->analyzed)
! 	      {
! 		push_cfun (DECL_STRUCT_FUNCTION (node->decl));
! 		current_function_decl = node->decl;
! 		execute_pass_list (pass->sub);
! 		free_dominance_info (CDI_DOMINATORS);
! 		free_dominance_info (CDI_POST_DOMINATORS);
! 		current_function_decl = NULL;
! 		pop_cfun ();
! 		ggc_collect ();
! 	      }
! 	}
        pass = pass->next;
      }
    while (pass);
--- 980,989 ----
  {
    do
      {
+       gcc_assert (!current_function_decl);
+       gcc_assert (!cfun);
        if (execute_one_pass (pass) && pass->sub)
! 	do_per_function ((void (*)(void *))execute_pass_list, pass->sub);
        pass = pass->next;
      }
    while (pass);


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