* config/mips/mips.c: Include tree-pass.h. (mips_reorg): Split in pre- and post-dbr_schedule parts. (mips_machine_reorg2): Move mips_reorg post-dbr_schedule parts here. (pass_mips_machine_reorg2): New machine specific pass. (insert_pass_mips_machine_reorg2): New pass plugin definition. (mips_option_override): Register the new pass. * rtl.h (cleanup_barriers): Remove prototype. (dbr_schedule): Likewise. * jump.c (cleanup_barriers): Make static. * reorg.c (dbr_schedule): Likewise. Index: config/mips/mips.c =================================================================== --- config/mips/mips.c (revision 197944) +++ config/mips/mips.c (working copy) @@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic.h" #include "target-globals.h" #include "opts.h" +#include "tree-pass.h" /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF. */ #define UNSPEC_ADDRESS_P(X) \ @@ -16356,12 +16357,14 @@ mips_reorg (void) mips_df_reorg (); free_bb_for_insn (); } +} - if (optimize > 0 && flag_delayed_branch) - { - cleanup_barriers (); - dbr_schedule (get_insns ()); - } +/* We use a machine specific pass to do a second machine dependent reorg + pass after delay branch scheduling. */ + +static unsigned int +mips_machine_reorg2 (void) +{ mips_reorg_process_insns (); if (!TARGET_MIPS16 && TARGET_EXPLICIT_RELOCS @@ -16374,6 +16377,34 @@ mips_reorg (void) mips_reorg_process_insns (); mips16_split_long_branches (); } + +struct rtl_opt_pass pass_mips_machine_reorg2 = +{ + { + RTL_PASS, + "mach2", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + NULL, /* gate */ + mips_machine_reorg2, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_MACH_DEP, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_verify_rtl_sharing, /* todo_flags_finish */ + } +}; + +struct register_pass_info insert_pass_mips_machine_reorg2 = +{ + &pass_mips_machine_reorg2.pass, /* pass */ + "dbr", /* reference_pass_name */ + 1, /* ref_pass_instance_number */ + PASS_POS_INSERT_AFTER /* po_op */ +}; /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text in order to avoid duplicating too much logic from elsewhere. */ @@ -17149,6 +17180,11 @@ mips_option_override (void) Do all CPP-sensitive stuff in uncompressed mode; we'll switch modes later if required. */ mips_set_compression_mode (0); + + /* We register a second machine specific reorg pass after delay slot + filling. Registering the pass must be done at start up. It's + convenient to do it here. */ + register_pass (&insert_pass_mips_machine_reorg2); } /* Swap the register information for registers I and I + 1, which Index: rtl.h =================================================================== --- rtl.h (revision 197944) +++ rtl.h (working copy) @@ -1924,7 +1924,6 @@ extern enum rtx_code swap_condition (enum rtx_code extern enum rtx_code unsigned_condition (enum rtx_code); extern enum rtx_code signed_condition (enum rtx_code); extern void mark_jump_label (rtx, rtx, int); -extern unsigned int cleanup_barriers (void); /* In jump.c */ extern rtx delete_related_insns (rtx); @@ -2668,9 +2667,6 @@ extern void reg_scan (rtx, unsigned int); extern void fix_register (const char *, int, int); extern bool invalid_mode_change_p (unsigned int, enum reg_class); -/* In reorg.c */ -extern void dbr_schedule (rtx); - /* In reload1.c */ extern int function_invariant_p (const_rtx); Index: jump.c =================================================================== --- jump.c (revision 197944) +++ jump.c (working copy) @@ -118,7 +118,7 @@ rebuild_jump_labels_chain (rtx chain) This simple pass moves barriers and removes duplicates so that the old code is happy. */ -unsigned int +static unsigned int cleanup_barriers (void) { rtx insn, next, prev; Index: reorg.c =================================================================== --- reorg.c (revision 197944) +++ reorg.c (working copy) @@ -3641,7 +3641,7 @@ make_return_insns (rtx first) /* Try to find insns to place in delay slots. */ -void +static void dbr_schedule (rtx first) { rtx insn, next, epilogue_insn = 0;