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:
parent
e71835fb5b
commit
05555c4ad1
6 changed files with 62 additions and 11 deletions
|
@ -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
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue