Hi.

  This patch removes obsolete REGISTER_MOVE_COST macro from MMIX back end in 
the GCC and introduces equivalent TARGET_REGISTER_MOVE_COST target hook.

  Regression tested on mmix-knuth-mmixware.

  OK to install?

        * config/mmix/mmix.h (REGISTER_MOVE_COST): Remove macro.
        * config/mmix/mmix-protos.h (mmix_register_move_cost): Remove.
        * config/mmix/mmix.c (mmix_register_move_cost): Make static.
        Change 'from' and 'to' arguments type to reg_class_t.
        (TARGET_REGISTER_MOVE_COST): Define.

Index: gcc/config/mmix/mmix.h
===================================================================
--- gcc/config/mmix/mmix.h      (revision 177573)
+++ gcc/config/mmix/mmix.h      (working copy)
@@ -628,23 +617,6 @@
 
 /* Node: Costs */
 
-/* The special registers can only move to and from general regs, and we
-   need to check that their constraints match, so say 3 for them.  */
-/* WARNING: gcc-2.7.2.2 i686-pc-linux-gnulibc1 (as shipped with RH 4.2)
-   miscompiles reload1.c:reload_cse_simplify_set; a call to
-   reload_cse_regno_equal_p is missing when checking if a substitution of
-   a register setting is valid if this is defined to just the expression
-   in mmix_register_move_cost.
-
-   Symptom: a (all?) register setting is optimized away for e.g.
-   "char *p1(char *p) { return p+1; }" and the value of register zero ($0)
-   is returned.
-
-   We can workaround by making this a function call - unknown if this
-   causes dire speed effects.  */
-#define REGISTER_MOVE_COST(MODE, FROM, TO) \
- mmix_register_move_cost (MODE, FROM, TO)
-
 #define SLOW_BYTE_ACCESS 0
 
 
Index: gcc/config/mmix/mmix-protos.h
===================================================================
--- gcc/config/mmix/mmix-protos.h       (revision 177573)
+++ gcc/config/mmix/mmix-protos.h       (working copy)
@@ -26,8 +26,6 @@
 extern int mmix_function_arg_regno_p (int, int);
 extern void mmix_function_profiler (FILE *, int);
 extern int mmix_reversible_cc_mode (enum machine_mode);
-extern int mmix_register_move_cost
-  (enum machine_mode, enum reg_class, enum reg_class);
 extern const char *mmix_text_section_asm_op (void);
 extern const char *mmix_data_section_asm_op (void);
 extern void mmix_output_quoted_string (FILE *, const char *, int);
Index: gcc/config/mmix/mmix.c
===================================================================
--- gcc/config/mmix/mmix.c      (revision 177573)
+++ gcc/config/mmix/mmix.c      (working copy)
@@ -141,6 +141,8 @@
 static void mmix_file_start (void);
 static void mmix_file_end (void);
 static bool mmix_rtx_costs (rtx, int, int, int *, bool);
+static int mmix_register_move_cost (enum machine_mode,
+                                   reg_class_t, reg_class_t);
 static rtx mmix_struct_value_rtx (tree, int);
 static enum machine_mode mmix_promote_function_mode (const_tree,
                                                     enum machine_mode,
@@ -224,6 +226,9 @@
 #undef TARGET_ADDRESS_COST
 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
 
+#undef TARGET_REGISTER_MOVE_COST
+#define TARGET_REGISTER_MOVE_COST mmix_register_move_cost
+
 #undef TARGET_MACHINE_DEPENDENT_REORG
 #define TARGET_MACHINE_DEPENDENT_REORG mmix_reorg
 
@@ -1233,12 +1238,15 @@
   return false;
 }
 
-/* REGISTER_MOVE_COST.  */
+/* TARGET_REGISTER_MOVE_COST.
 
-int
+   The special registers can only move to and from general regs, and we
+   need to check that their constraints match, so say 3 for them.  */
+
+static int
 mmix_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
-                        enum reg_class from,
-                        enum reg_class to)
+                        reg_class_t from,
+                        reg_class_t to)
 {
   return (from == GENERAL_REGS && from == to) ? 2 : 3;
 }


Anatoly.

Reply via email to