commit f5d8960c711540d28be2fd923d65838cb88b34f5
Author: David Malcolm <dmalcolm@redhat.com>
Date: Tue Aug 6 12:41:31 2013 -0400
gcc/
* 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.
@@ -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,24 @@ 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 +214,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 +2267,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 ();
}
@@ -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_;
@@ -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 (); }
@@ -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;
@@ -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