coretypes.h (rtl_opt_pass): Add.

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.

From-SVN: r201549
This commit is contained in:
David Malcolm 2013-08-07 01:14:39 +00:00 committed by David Malcolm
parent e71835fb5b
commit 05555c4ad1
6 changed files with 62 additions and 11 deletions

View 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

View 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 ();
}

View 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_;

View 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 (); }

View 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;

View 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