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]

[PATCH] pass cleanups


This removes the special dce_loop pass in favor of dealing with
scev and niter estimates in dce generally.  Likewise it makes
copyprop always cleanup after itself, dealing with scev and niter
estimates.  It also makes copyprop not unconditionally schedule
a cfg-cleanup but only do so if copyprop did any transform.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Richard.

2014-06-18  Richard Biener  <rguenther@suse.de>

	* tree-pass.h (make_pass_dce_loop): Remove.
	* passes.def: Replace pass_dce_loop with pass_dce.
	* tree-ssa-dce.c (perform_tree_ssa_dce): If something
	changed free niter estimates and reset the scev cache.
	(tree_ssa_dce_loop, pass_data_dce_loop, pass_dce_loop,
	make_pass_dce_loop): Remove.
	* tree-ssa-copy.c: Include tree-ssa-loop-niter.h.
	(fini_copy_prop): Return whether something changed.  Always
	let substitute_and_fold perform DCE and free niter estimates
	and reset the scev cache if so.
	(execute_copy_prop): If sth changed schedule cleanup-cfg.
	(pass_data_copy_prop): Do not unconditionally schedule
	cleanup-cfg or update-ssa.

Index: gcc/tree-pass.h
===================================================================
*** gcc/tree-pass.h	(revision 211738)
--- gcc/tree-pass.h	(working copy)
*************** extern gimple_opt_pass *make_pass_build_
*** 382,388 ****
  extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
- extern gimple_opt_pass *make_pass_dce_loop (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
--- 382,387 ----
Index: gcc/passes.def
===================================================================
*** gcc/passes.def	(revision 211738)
--- gcc/passes.def	(working copy)
*************** along with GCC; see the file COPYING3.
*** 203,209 ****
  	  NEXT_PASS (pass_tree_loop_init);
  	  NEXT_PASS (pass_lim);
  	  NEXT_PASS (pass_copy_prop);
! 	  NEXT_PASS (pass_dce_loop);
  	  NEXT_PASS (pass_tree_unswitch);
  	  NEXT_PASS (pass_scev_cprop);
  	  NEXT_PASS (pass_record_bounds);
--- 206,212 ----
  	  NEXT_PASS (pass_tree_loop_init);
  	  NEXT_PASS (pass_lim);
  	  NEXT_PASS (pass_copy_prop);
! 	  NEXT_PASS (pass_dce);
  	  NEXT_PASS (pass_tree_unswitch);
  	  NEXT_PASS (pass_scev_cprop);
  	  NEXT_PASS (pass_record_bounds);
*************** along with GCC; see the file COPYING3.
*** 215,221 ****
  	      NEXT_PASS (pass_graphite_transforms);
  	      NEXT_PASS (pass_lim);
  	      NEXT_PASS (pass_copy_prop);
! 	      NEXT_PASS (pass_dce_loop);
  	  POP_INSERT_PASSES ()
  	  NEXT_PASS (pass_iv_canon);
  	  NEXT_PASS (pass_parallelize_loops);
--- 218,224 ----
  	      NEXT_PASS (pass_graphite_transforms);
  	      NEXT_PASS (pass_lim);
  	      NEXT_PASS (pass_copy_prop);
! 	      NEXT_PASS (pass_dce);
  	  POP_INSERT_PASSES ()
  	  NEXT_PASS (pass_iv_canon);
  	  NEXT_PASS (pass_parallelize_loops);
*************** along with GCC; see the file COPYING3.
*** 224,230 ****
  	     Please do not add any other passes in between.  */
  	  NEXT_PASS (pass_vectorize);
            PUSH_INSERT_PASSES_WITHIN (pass_vectorize)
! 	      NEXT_PASS (pass_dce_loop);
            POP_INSERT_PASSES ()
            NEXT_PASS (pass_predcom);
  	  NEXT_PASS (pass_complete_unroll);
--- 227,233 ----
  	     Please do not add any other passes in between.  */
  	  NEXT_PASS (pass_vectorize);
            PUSH_INSERT_PASSES_WITHIN (pass_vectorize)
! 	      NEXT_PASS (pass_dce);
            POP_INSERT_PASSES ()
            NEXT_PASS (pass_predcom);
  	  NEXT_PASS (pass_complete_unroll);
Index: gcc/tree-ssa-dce.c
===================================================================
*** gcc/tree-ssa-dce.c	(revision 211738)
--- gcc/tree-ssa-dce.c	(working copy)
*************** perform_tree_ssa_dce (bool aggressive)
*** 1479,1485 ****
    tree_dce_done (aggressive);
  
    if (something_changed)
!     return TODO_update_ssa | TODO_cleanup_cfg;
    return 0;
  }
  
--- 1479,1490 ----
    tree_dce_done (aggressive);
  
    if (something_changed)
!     {
!       free_numbers_of_iterations_estimates ();
!       if (scev_initialized_p)
! 	scev_reset ();
!       return TODO_update_ssa | TODO_cleanup_cfg;
!     }
    return 0;
  }
  
*************** tree_ssa_dce (void)
*** 1491,1509 ****
  }
  
  static unsigned int
- tree_ssa_dce_loop (void)
- {
-   unsigned int todo;
-   todo = perform_tree_ssa_dce (/*aggressive=*/false);
-   if (todo)
-     {
-       free_numbers_of_iterations_estimates ();
-       scev_reset ();
-     }
-   return todo;
- }
- 
- static unsigned int
  tree_ssa_cd_dce (void)
  {
    return perform_tree_ssa_dce (/*aggressive=*/optimize >= 2);
--- 1496,1501 ----
*************** make_pass_dce (gcc::context *ctxt)
*** 1548,1591 ****
  }
  
  namespace {
- 
- const pass_data pass_data_dce_loop =
- {
-   GIMPLE_PASS, /* type */
-   "dceloop", /* name */
-   OPTGROUP_NONE, /* optinfo_flags */
-   true, /* has_execute */
-   TV_TREE_DCE, /* tv_id */
-   ( PROP_cfg | PROP_ssa ), /* properties_required */
-   0, /* properties_provided */
-   0, /* properties_destroyed */
-   0, /* todo_flags_start */
-   0, /* todo_flags_finish */
- };
- 
- class pass_dce_loop : public gimple_opt_pass
- {
- public:
-   pass_dce_loop (gcc::context *ctxt)
-     : gimple_opt_pass (pass_data_dce_loop, ctxt)
-   {}
- 
-   /* opt_pass methods: */
-   opt_pass * clone () { return new pass_dce_loop (m_ctxt); }
-   virtual bool gate (function *) { return flag_tree_dce != 0; }
-   virtual unsigned int execute (function *) { return tree_ssa_dce_loop (); }
- 
- }; // class pass_dce_loop
- 
- } // anon namespace
- 
- gimple_opt_pass *
- make_pass_dce_loop (gcc::context *ctxt)
- {
-   return new pass_dce_loop (ctxt);
- }
- 
- namespace {
  
  const pass_data pass_data_cd_dce =
  {
--- 1540,1545 ----
Index: gcc/tree-ssa-copy.c
===================================================================
*** gcc/tree-ssa-copy.c	(revision 211738)
--- gcc/tree-ssa-copy.c	(working copy)
*************** along with GCC; see the file COPYING3.
*** 45,50 ****
--- 45,52 ----
  #include "cfgloop.h"
  #include "tree-scalar-evolution.h"
  #include "tree-ssa-dom.h"
+ #include "tree-ssa-loop-niter.h"
+ 
  
  /* This file implements the copy propagation pass and provides a
     handful of interfaces for performing const/copy propagation and
*************** get_value (tree name)
*** 542,548 ****
  /* Deallocate memory used in copy propagation and do final
     substitution.  */
  
! static void
  fini_copy_prop (void)
  {
    unsigned i;
--- 544,550 ----
  /* Deallocate memory used in copy propagation and do final
     substitution.  */
  
! static bool
  fini_copy_prop (void)
  {
    unsigned i;
*************** fini_copy_prop (void)
*** 594,603 ****
  	}
      }
  
!   /* Don't do DCE if SCEV is initialized.  It would destroy the scev cache.  */
!   substitute_and_fold (get_value, NULL, !scev_initialized_p ());
  
    free (copy_of);
  }
  
  
--- 596,612 ----
  	}
      }
  
!   bool changed = substitute_and_fold (get_value, NULL, true);
!   if (changed)
!     {
!       free_numbers_of_iterations_estimates ();
!       if (scev_initialized_p ())
! 	scev_reset ();
!     }
  
    free (copy_of);
+ 
+   return changed;
  }
  
  
*************** execute_copy_prop (void)
*** 639,645 ****
  {
    init_copy_prop ();
    ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
!   fini_copy_prop ();
    return 0;
  }
  
--- 648,655 ----
  {
    init_copy_prop ();
    ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
!   if (fini_copy_prop ())
!     return TODO_cleanup_cfg;
    return 0;
  }
  
*************** const pass_data pass_data_copy_prop =
*** 656,662 ****
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   ( TODO_cleanup_cfg | TODO_update_ssa ), /* todo_flags_finish */
  };
  
  class pass_copy_prop : public gimple_opt_pass
--- 666,672 ----
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   0, /* todo_flags_finish */
  };
  
  class pass_copy_prop : public gimple_opt_pass


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