]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2013-08-07 David Malcolm <dmalcolm@redhat.com>
authordmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Aug 2013 01:14:39 +0000 (01:14 +0000)
committerdmalcolm <dmalcolm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Aug 2013 01:14:39 +0000 (01:14 +0000)
* coretypes.h (rtl_opt_pass): Add.
(gcc::context): Add.
* config/epiphany/epiphany.c (pass_mode_switch_use): New.
(epiphany_init): Port to new C++ pass API.
(epiphany_optimize_mode_switching): Likewise.
* pass_manager.h (pass_manager::get_pass_split_all_insns): New.
(pass_manager::get_pass_mode_switching): New.
(pass_manager::get_pass_peephole2): New.
* mode-switching.c (pass_mode_switching): Add clone method.
* recog.c (pass_peephole2): Add clone method.
(pass_split_all_insns): Add clone method.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201549 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/epiphany/epiphany.c
gcc/coretypes.h
gcc/mode-switching.c
gcc/pass_manager.h
gcc/recog.c

index 66ce8528f6c8292d8e5c29f1c0501a42d95e8409..f89f5eba9d737d9bc25a19234e9293a0bb75ca88 100644 (file)
@@ -1,3 +1,17 @@
+2013-08-07  David Malcolm  <dmalcolm@redhat.com>
+
+       * coretypes.h (rtl_opt_pass): Add.
+       (gcc::context): Add.
+       * config/epiphany/epiphany.c (pass_mode_switch_use): New.
+       (epiphany_init): Port to new C++ pass API.
+       (epiphany_optimize_mode_switching): Likewise.
+       * pass_manager.h (pass_manager::get_pass_split_all_insns): New.
+       (pass_manager::get_pass_mode_switching): New.
+       (pass_manager::get_pass_peephole2): New.
+       * mode-switching.c (pass_mode_switching): Add clone method.
+       * recog.c (pass_peephole2): Add clone method.
+       (pass_split_all_insns): Add clone method.
+
 2013-08-06  David Malcolm  <dmalcolm@redhat.com>
 
        * config/mips/mips.c (insert_pass_mips_machine_reorg2): Move
index 1dcdc4b380852d4d41ab0340068f6e55117fb562..fd4c01c49a4f970c83d12d8113840316184be19e 100644 (file)
@@ -45,6 +45,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "ggc.h"
 #include "tm-constrs.h"
 #include "tree-pass.h" /* for current_pass */
+#include "context.h"
+#include "pass_manager.h"
 
 /* Which cpu we're compiling for.  */
 int epiphany_cpu_type;
@@ -59,6 +61,9 @@ char epiphany_punct_chars[256];
 /* The rounding mode that we generally use for floating point.  */
 int epiphany_normal_fp_rounding;
 
+/* The pass instance, for use in epiphany_optimize_mode_switching. */
+static opt_pass *pass_mode_switch_use;
+
 static void epiphany_init_reg_tables (void);
 static int get_epiphany_condition_code (rtx);
 static tree epiphany_handle_interrupt_attribute (tree *, tree, tree, int, bool *);
@@ -165,20 +170,26 @@ epiphany_init (void)
      pass because of the side offect of epiphany_mode_needed on
      MACHINE_FUNCTION(cfun)->unknown_mode_uses.  But it must run before
      pass_resolve_sw_modes.  */
-  static struct register_pass_info insert_use_info
-    = { &pass_mode_switch_use.pass, "mode_sw",
+  pass_mode_switch_use = make_pass_mode_switch_use (g);
+  struct register_pass_info insert_use_info
+    = { pass_mode_switch_use, "mode_sw",
        1, PASS_POS_INSERT_AFTER
       };
-  static struct register_pass_info mode_sw2_info
-    = { &pass_mode_switching.pass, "mode_sw",
+  opt_pass *mode_sw2
+    = g->get_passes()->get_pass_mode_switching ()->clone ();
+  struct register_pass_info mode_sw2_info
+    = { mode_sw2, "mode_sw",
        1, PASS_POS_INSERT_AFTER
       };
-  static struct register_pass_info mode_sw3_info
-    = { &pass_resolve_sw_modes.pass, "mode_sw",
+  opt_pass *mode_sw3 = make_pass_resolve_sw_modes (g);
+  struct register_pass_info mode_sw3_info
+    = { mode_sw3, "mode_sw",
        1, PASS_POS_INSERT_AFTER
       };
-  static struct register_pass_info mode_sw4_info
-    = { &pass_split_all_insns.pass, "mode_sw",
+  opt_pass *mode_sw4
+    = g->get_passes()->get_pass_split_all_insns ()->clone ();
+  struct register_pass_info mode_sw4_info
+    = { mode_sw4, "mode_sw",
        1, PASS_POS_INSERT_AFTER
       };
   static const int num_modes[] = NUM_MODES_FOR_MODE_SWITCHING;
@@ -205,8 +216,10 @@ epiphany_init (void)
          (see http://gcc.gnu.org/ml/gcc-patches/2011-10/msg02819.html,)
          we need a second peephole2 pass to get reasonable code.  */
   {
-    static struct register_pass_info peep2_2_info
-      = { &pass_peephole2.pass, "peephole2",
+    opt_pass *extra_peephole2
+      = g->get_passes ()->get_pass_peephole2 ()->clone ();
+    struct register_pass_info peep2_2_info
+      = { extra_peephole2, "peephole2",
          1, PASS_POS_INSERT_AFTER
        };
 
@@ -2256,7 +2269,7 @@ epiphany_optimize_mode_switching (int entity)
       return (MACHINE_FUNCTION (cfun)->sw_entities_processed
              & (1 << EPIPHANY_MSW_ENTITY_ROUND_UNKNOWN)) != 0;
     case EPIPHANY_MSW_ENTITY_FPU_OMNIBUS:
-      return optimize == 0 || current_pass == &pass_mode_switch_use.pass;
+      return optimize == 0 || current_pass == pass_mode_switch_use;
     }
   gcc_unreachable ();
 }
index edb9c8c8477abd38d664606907da41b128521b0a..54bfe7f8654707a9b51186933708db68fd84fae3 100644 (file)
@@ -169,6 +169,12 @@ typedef const struct basic_block_def *const_basic_block;
    in target.h.  */
 typedef int reg_class_t;
 
+class rtl_opt_pass;
+
+namespace gcc {
+  class context;
+}
+
 #else
 
 struct _dont_use_rtx_here_;
index c941eb11672dec619845814bc719c5092d213e0b..56c4d0fef9a4dfcf40878034b8d825deef425d47 100644 (file)
@@ -809,6 +809,9 @@ public:
   {}
 
   /* opt_pass methods: */
+  /* The epiphany backend creates a second instance of this pass, so we need
+     a clone method.  */
+  opt_pass * clone () { return new pass_mode_switching (ctxt_); }
   bool gate () { return gate_mode_switching (); }
   unsigned int execute () { return rest_of_handle_mode_switching (); }
 
index 00f0b1c50f4f53b094ee7f39a057b4279dc9d942..41d2c7605d24e08dd4341b0649f4f03e4c1129c9 100644 (file)
@@ -66,6 +66,15 @@ public:
   void execute_early_local_passes ();
   unsigned int execute_pass_mode_switching ();
 
+  /* Various passes are manually cloned by epiphany. */
+  opt_pass *get_pass_split_all_insns () const {
+    return pass_split_all_insns_1;
+  }
+  opt_pass *get_pass_mode_switching () const {
+    return pass_mode_switching_1;
+  }
+  opt_pass *get_pass_peephole2 () const { return pass_peephole2_1; }
+
 public:
   /* The root of the compilation pass tree, once constructed.  */
   opt_pass *all_passes;
index 352fbac896dc39afc4cbf4e40036e843a4867663..2d44416892efa49f902ea2ab45c0f0debe35ce5e 100644 (file)
@@ -3803,6 +3803,9 @@ public:
   {}
 
   /* opt_pass methods: */
+  /* The epiphany backend creates a second instance of this pass, so we need
+     a clone method.  */
+  opt_pass * clone () { return new pass_peephole2 (ctxt_); }
   bool gate () { return gate_handle_peephole2 (); }
   unsigned int execute () { return rest_of_handle_peephole2 (); }
 
@@ -3848,6 +3851,9 @@ public:
   {}
 
   /* opt_pass methods: */
+  /* The epiphany backend creates a second instance of this pass, so
+     we need a clone method.  */
+  opt_pass * clone () { return new pass_split_all_insns (ctxt_); }
   unsigned int execute () { return rest_of_handle_split_all_insns (); }
 
 }; // class pass_split_all_insns