Hello,

This patch splits mips_reorg.c in a pre-dbr_schedule part and a new,
machine specific post-dbr_schedule pass. With this patch,
cleanup_barriers and dbr_schedule can be static functions again.

Cross-built&tested mips-sim. OK for trunk?

Ciao!
Steven
        * 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;

Reply via email to