Remove first_pass_instance from pass_dominator
authorTom de Vries <tom@codesourcery.com>
Mon, 16 Nov 2015 12:40:24 +0000 (12:40 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Mon, 16 Nov 2015 12:40:24 +0000 (12:40 +0000)
2015-11-16  Tom de Vries  <tom@codesourcery.com>

* passes.def: Add arg to pass_dominator pass instantiation.
* tree-pass.h (first_pass_instance): Remove pass_dominator-related bit
of comment.
* tree-ssa-dom.c (pass_dominator::pass_dominator): Initialize
may_peel_loop_headers_p.
(pass_dominator::set_pass_param): New member function.  Set
may_peel_loop_headers_p.
(pass_dominator::may_peel_loop_headers_p): New private member.
(pass_dominator::execute): Use may_peel_loop_headers_p instead of
first_pass_instance.

From-SVN: r230417

gcc/ChangeLog
gcc/passes.def
gcc/tree-pass.h
gcc/tree-ssa-dom.c

index 91bfc8c9a9509e06ead616918f396765713f18c4..3ab8e652cedc75f56ac09c3bee136d43f1a50fe9 100644 (file)
@@ -1,3 +1,16 @@
+2015-11-16  Tom de Vries  <tom@codesourcery.com>
+
+       * passes.def: Add arg to pass_dominator pass instantiation.
+       * tree-pass.h (first_pass_instance): Remove pass_dominator-related bit
+       of comment.
+       * tree-ssa-dom.c (pass_dominator::pass_dominator): Initialize
+       may_peel_loop_headers_p.
+       (pass_dominator::set_pass_param): New member function.  Set
+       may_peel_loop_headers_p.
+       (pass_dominator::may_peel_loop_headers_p): New private member.
+       (pass_dominator::execute): Use may_peel_loop_headers_p instead of
+       first_pass_instance.
+
 2015-11-16  Tom de Vries  <tom@codesourcery.com>
 
        * passes.def: Add arg to pass_reassoc pass instantiation.
index 78fdf0ffc5dd6263e0a6ed9cfc7ffc57cb518283..d274a950d9b3754d23ab0bb3328efa6841954fe5 100644 (file)
@@ -190,7 +190,7 @@ along with GCC; see the file COPYING3.  If not see
         propagations have already run, but before some more dead code
         is removed, and this place fits nicely.  Remember this when
         trying to move or duplicate pass_dominator somewhere earlier.  */
-      NEXT_PASS (pass_dominator);
+      NEXT_PASS (pass_dominator, true /* may_peel_loop_headers_p */);
       /* At this point the majority of const/copy propagations
         are exposed.  Go ahead and identify paths that should never
         be executed in a conforming program and isolate those paths.
@@ -279,7 +279,7 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_reassoc, false /* insert_powi_p */);
       NEXT_PASS (pass_strength_reduction);
       NEXT_PASS (pass_tracer);
-      NEXT_PASS (pass_dominator);
+      NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */);
       NEXT_PASS (pass_strlen);
       NEXT_PASS (pass_vrp, false /* warn_array_bounds_p */);
       /* The only const/copy propagation opportunities left after
index a672d528b0344b076c1e9898af83f0235663d876..d647e730a3e819a8c535e6d0ea3bebaae6faab19 100644 (file)
@@ -631,11 +631,8 @@ extern bool function_called_by_processed_nodes_p (void);
 
 /* Set to true if the pass is called the first time during compilation of the
    current function.  Note that using this information in the optimization
-   passes is considered not to be clean, and it should be avoided if possible.
-   This flag is currently used to prevent loops from being peeled repeatedly
-   in jump threading; it will be removed once we preserve loop structures
-   throughout the compilation -- we will be able to mark the affected loops
-   directly in jump threading, and avoid peeling them next time.  */
+   passes is considered not to be clean, and it should be avoided if
+   possible.  */
 extern bool first_pass_instance;
 
 /* Declare for plugins.  */
index 5cb26441b5153da9a589e189c42489fc9ed0103c..aeb726c9bdbb6883e535694580a3865205cc20cb 100644 (file)
@@ -536,14 +536,26 @@ class pass_dominator : public gimple_opt_pass
 {
 public:
   pass_dominator (gcc::context *ctxt)
-    : gimple_opt_pass (pass_data_dominator, ctxt)
+    : gimple_opt_pass (pass_data_dominator, ctxt),
+      may_peel_loop_headers_p (false)
   {}
 
   /* opt_pass methods: */
   opt_pass * clone () { return new pass_dominator (m_ctxt); }
+  void set_pass_param (unsigned int n, bool param)
+    {
+      gcc_assert (n == 0);
+      may_peel_loop_headers_p = param;
+    }
   virtual bool gate (function *) { return flag_tree_dom != 0; }
   virtual unsigned int execute (function *);
 
+ private:
+  /* This flag is used to prevent loops from being peeled repeatedly in jump
+     threading; it will be removed once we preserve loop structures throughout
+     the compilation -- we will be able to mark the affected loops directly in
+     jump threading, and avoid peeling them next time.  */
+  bool may_peel_loop_headers_p;
 }; // class pass_dominator
 
 unsigned int
@@ -619,7 +631,7 @@ pass_dominator::execute (function *fun)
   free_all_edge_infos ();
 
   /* Thread jumps, creating duplicate blocks as needed.  */
-  cfg_altered |= thread_through_all_blocks (first_pass_instance);
+  cfg_altered |= thread_through_all_blocks (may_peel_loop_headers_p);
 
   if (cfg_altered)
     free_dominance_info (CDI_DOMINATORS);