diff mbox

[committed,gomp4,3/6] Add pass_dominator::sese_mode_p ()

Message ID 561BCC1D.50103@mentor.com
State New
Headers show

Commit Message

Tom de Vries Oct. 12, 2015, 3:05 p.m. UTC
On 12/10/15 16:49, Tom de Vries wrote:
> Hi,
>
> I've committed the following patch series to the gomp-4_0-branch.
>
>       1    Add pass_dominator::jump_threading_p ()
>       2    Add dom_walker::walk_until
>       3    Add pass_dominator::sese_mode_p ()
>       4    Add skip_stmt parm to pass_dominator::get_sese ()
>       5    Add oacc kernels related infra functions
>       6    Add pass_dominator_oacc_kernels
>
> The patch series adds a pass pass_dominator_oacc_kernels, which does the
> pass_dominator optimizations (with the exception of jump threading) on
> each oacc kernels region rather than on the whole function.
>
> Bootstrapped and reg-tested on x86_64.
>
> I'll post the patches individually, in reply to this email.

This patch adds the ability to pass_dominator to work on a series of 
sese regions rather than on the entire function.

Thanks,
- Tom
diff mbox

Patch

Add pass_dominator::sese_mode_p ()

2015-10-12  Tom de Vries  <tom@codesourcery.com>

	* tree-ssa-dom.c (pass_dominator::jump_threading_p): Handle sese_mode_p.
	(pass_dominator::sese_mode_p, pass_dominator::get_sese): New protected
	virtual function.
	(pass_dominator::execute): Handle sese_mode_p.
---
 gcc/tree-ssa-dom.c | 49 +++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 43 insertions(+), 6 deletions(-)

diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 162d9ed..7a1250e 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -44,6 +44,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "tree-ssa-dom.h"
 #include "gimplify.h"
 #include "tree-cfgcleanup.h"
+#include "cfgcleanup.h"
 
 /* This file implements optimizations on the dominator tree.  */
 
@@ -550,7 +551,17 @@  public:
 
  protected:
   /* Return true if pass should perform jump threading.  */
-  virtual bool jump_threading_p (void) { return true; }
+  virtual bool jump_threading_p (void) { return !sese_mode_p (); }
+
+  /* Return true if pass should visit a series of seses rather than the whole
+     dominator tree.  */
+  virtual bool sese_mode_p (void) { return false; }
+
+  /* In sese mode, return true if there's another sese to visit.  Return the
+     sese to visit in SESE_ENTRY and SESE_EXIT.  */
+  virtual bool get_sese (basic_block *sese_entry ATTRIBUTE_UNUSED,
+			 basic_block *sese_exit ATTRIBUTE_UNUSED)
+    { gcc_unreachable (); }
 
 }; // class pass_dominator
 
@@ -583,11 +594,14 @@  pass_dominator::execute (function *fun)
      LOOPS_HAVE_PREHEADERS won't be needed here.  */
   loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES);
 
-  /* Initialize the value-handle array.  */
-  threadedge_initialize_values ();
+  if (!sese_mode_p ())
+    /* Initialize the value-handle array.  */
+    threadedge_initialize_values ();
 
   if (jump_threading_p ())
     {
+      gcc_assert (!sese_mode_p ());
+
       /* We need accurate information regarding back edges in the CFG
 	 for jump threading; this may include back edges that are not part of
 	 a single loop.  */
@@ -609,7 +623,29 @@  pass_dominator::execute (function *fun)
 			     const_and_copies,
 			     avail_exprs_stack,
 			     jump_threading_p ());
-  walker.walk (fun->cfg->x_entry_block_ptr);
+  if (!sese_mode_p ())
+    walker.walk (fun->cfg->x_entry_block_ptr);
+  else
+    {
+      basic_block sese_entry, sese_exit;
+      while (get_sese (&sese_entry, &sese_exit))
+	{
+	  threadedge_initialize_values ();
+	  avail_exprs_stack->push_marker ();
+	  const_and_copies->push_marker ();
+
+	  walker.walk_until (sese_entry, sese_exit, true);
+
+	  avail_exprs_stack->pop_to_marker ();
+	  const_and_copies->pop_to_marker ();
+	  threadedge_finalize_values ();
+
+	  /* KLUDGE: The dom_walker does not allow unreachable blocks when
+	     starting the walk, and during the dom_opt_dom_walker walk we may
+	     produce unreachable blocks, so we need to clean them up here.  */
+	  delete_unreachable_blocks ();
+	}
+    }
 
   {
     gimple_stmt_iterator gsi;
@@ -709,8 +745,9 @@  pass_dominator::execute (function *fun)
   delete avail_exprs_stack;
   delete const_and_copies;
 
-  /* Free the value-handle array.  */
-  threadedge_finalize_values ();
+  if (!sese_mode_p ())
+    /* Free the value-handle array.  */
+    threadedge_finalize_values ();
 
   return 0;
 }
-- 
1.9.1