OSDN Git Service

2010-08-06 Thomas Koenig <tkoenig@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / reload.c
index 30bee6d..98aaa23 100644 (file)
@@ -94,7 +94,7 @@ a register with any other reload.  */
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
-#include "rtl.h"
+#include "rtl-error.h"
 #include "tm_p.h"
 #include "insn-config.h"
 #include "expr.h"
@@ -108,10 +108,10 @@ a register with any other reload.  */
 #include "flags.h"
 #include "output.h"
 #include "function.h"
-#include "toplev.h"
 #include "params.h"
 #include "target.h"
 #include "ira.h"
+#include "toplev.h" /* exact_log2 may be used by targets */
 
 /* True if X is a constant that can be forced into the constant pool.  */
 #define CONST_POOL_OK_P(X)                     \
@@ -363,7 +363,8 @@ push_secondary_reload (int in_p, rtx x, int opnum, int optional,
 
   sri.icode = CODE_FOR_nothing;
   sri.prev_sri = prev_sri;
-  rclass = targetm.secondary_reload (in_p, x, reload_class, reload_mode, &sri);
+  rclass = (enum reg_class) targetm.secondary_reload (in_p, x, reload_class,
+                                                     reload_mode, &sri);
   icode = (enum insn_code) sri.icode;
 
   /* If we don't need any secondary registers, done.  */
@@ -526,7 +527,8 @@ secondary_reload_class (bool in_p, enum reg_class rclass,
 
   sri.icode = CODE_FOR_nothing;
   sri.prev_sri = NULL;
-  rclass = targetm.secondary_reload (in_p, x, rclass, mode, &sri);
+  rclass
+    = (enum reg_class) targetm.secondary_reload (in_p, x, rclass, mode, &sri);
   icode = (enum insn_code) sri.icode;
 
   /* If there are no secondary reloads at all, we return NO_REGS.
@@ -2600,7 +2602,6 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
   char goal_alternative_earlyclobber[MAX_RECOG_OPERANDS];
   int goal_alternative_swapped;
   int best;
-  int best_small_class_operands_num;
   int commutative;
   char operands_match[MAX_RECOG_OPERANDS][MAX_RECOG_OPERANDS];
   rtx substed_operand[MAX_RECOG_OPERANDS];
@@ -2926,7 +2927,6 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
      all the operands together against the register constraints.  */
 
   best = MAX_RECOG_OPERANDS * 2 + 600;
-  best_small_class_operands_num = 0;
 
   swapped = 0;
   goal_alternative_swapped = 0;
@@ -3468,7 +3468,8 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
 
          /* If this operand could be handled with a reg,
             and some reg is allowed, then this operand can be handled.  */
-         if (winreg && this_alternative[i] != NO_REGS)
+         if (winreg && this_alternative[i] != NO_REGS
+             && (win || !class_only_fixed_regs[this_alternative[i]]))
            badop = 0;
 
          /* Record which operands fit this alternative.  */
@@ -3712,27 +3713,7 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
         record it as the chosen goal for reloading.  */
       if (! bad)
        {
-         bool change_p = false;
-         int small_class_operands_num = 0;
-
-         if (best >= losers)
-           {
-             for (i = 0; i < noperands; i++)
-               small_class_operands_num
-                 += SMALL_REGISTER_CLASS_P (this_alternative[i]) ? 1 : 0;
-             if (best > losers
-                 || (best == losers
-                     /* If the cost of the reloads is the same,
-                        prefer alternative which requires minimal
-                        number of small register classes for the
-                        operands.  This improves chances of reloads
-                        for insn requiring small register
-                        classes.  */
-                     && (small_class_operands_num
-                         < best_small_class_operands_num)))
-               change_p = true;
-           }
-         if (change_p)
+         if (best > losers)
            {
              for (i = 0; i < noperands; i++)
                {
@@ -3748,7 +3729,6 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
                }
              goal_alternative_swapped = swapped;
              best = losers;
-             best_small_class_operands_num = small_class_operands_num;
              goal_alternative_number = this_alternative_number;
              goal_earlyclobber = this_earlyclobber;
            }
@@ -5832,8 +5812,7 @@ find_reloads_address_1 (enum machine_mode mode, rtx x, int context,
              rtx equiv = (MEM_P (XEXP (x, 0))
                           ? XEXP (x, 0)
                           : reg_equiv_mem[regno]);
-             int icode
-               = (int) optab_handler (add_optab, GET_MODE (x))->insn_code;
+             int icode = (int) optab_handler (add_optab, GET_MODE (x));
              if (insn && NONJUMP_INSN_P (insn) && equiv
                  && memory_operand (equiv, GET_MODE (equiv))
 #ifdef HAVE_cc0