OSDN Git Service

2009-06-23 Li Feng <nemokingdom@gmail.com>
[pf3gnuchains/gcc-fork.git] / gcc / ira-costs.c
index a2df9bd..4dd7003 100644 (file)
@@ -1,5 +1,5 @@
 /* IRA hard register and memory cost calculation for allocnos.
-   Copyright (C) 2006, 2007, 2008
+   Copyright (C) 2006, 2007, 2008, 2009
    Free Software Foundation, Inc.
    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
 
@@ -138,12 +138,13 @@ copy_cost (rtx x, enum machine_mode mode, enum reg_class rclass, bool to_p,
   sri.extra_cost = 0;
   secondary_class = targetm.secondary_reload (to_p, x, rclass, mode, &sri);
 
-  if (ira_register_move_cost[mode] == NULL)
-    ira_init_register_move_cost (mode);
-
   if (secondary_class != NO_REGS)
-    return (move_cost[mode][secondary_class][rclass] + sri.extra_cost
-           + copy_cost (x, mode, secondary_class, to_p, &sri));
+    {
+      if (!move_cost[mode])
+        init_move_cost (mode);
+      return (move_cost[mode][secondary_class][rclass] + sri.extra_cost
+             + copy_cost (x, mode, secondary_class, to_p, &sri));
+    }
 
   /* For memory, use the memory move cost, for (hard) registers, use
      the cost to move between the register classes, and use 2 for
@@ -151,8 +152,11 @@ copy_cost (rtx x, enum machine_mode mode, enum reg_class rclass, bool to_p,
   if (MEM_P (x) || rclass == NO_REGS)
     return sri.extra_cost + ira_memory_move_cost[mode][rclass][to_p != 0];
   else if (REG_P (x))
-    return
-      (sri.extra_cost + move_cost[mode][REGNO_REG_CLASS (REGNO (x))][rclass]);
+    {
+      if (!move_cost[mode])
+        init_move_cost (mode);
+      return (sri.extra_cost + move_cost[mode][REGNO_REG_CLASS (REGNO (x))][rclass]);
+    }
   else
     /* If this is a constant, we may eventually want to call rtx_cost
        here.  */
@@ -201,7 +205,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
     {
       enum reg_class classes[MAX_RECOG_OPERANDS];
       int allows_mem[MAX_RECOG_OPERANDS];
-      int rclass;
+      enum reg_class rclass;
       int alt_fail = 0;
       int alt_cost = 0, op_cost_add;
 
@@ -287,19 +291,17 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
                     needs to do a copy, which is one insn.  */
                  struct costs *pp = this_op_costs[i];
 
-                 if (ira_register_move_cost[mode] == NULL)
-                   ira_init_register_move_cost (mode);
-
                  for (k = 0; k < cost_classes_num; k++)
                    {
                      rclass = cost_classes[k];
                      pp->cost[k]
-                       = ((recog_data.operand_type[i] != OP_OUT
-                           ? ira_may_move_in_cost[mode][rclass]
-                             [classes[i]] * frequency : 0)
-                          + (recog_data.operand_type[i] != OP_IN
-                             ? ira_may_move_out_cost[mode][classes[i]]
-                               [rclass] * frequency : 0));
+                       = (((recog_data.operand_type[i] != OP_OUT
+                            ? ira_get_may_move_cost (mode, rclass,
+                                                     classes[i], true) : 0)
+                           + (recog_data.operand_type[i] != OP_IN
+                              ? ira_get_may_move_cost (mode, classes[i],
+                                                       rclass, false) : 0))
+                          * frequency);
                    }
 
                  /* If the alternative actually allows memory, make
@@ -335,8 +337,9 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
                                 : 0));
                      else if (ira_reg_class_intersect
                               [pref_class][classes[i]] == NO_REGS)
-                       alt_cost += (ira_register_move_cost
-                                    [mode][pref_class][classes[i]]);
+                       alt_cost += ira_get_register_move_cost (mode,
+                                                               pref_class,
+                                                               classes[i]);
                    }
                  if (REGNO (ops[i]) != REGNO (ops[j])
                      && ! find_reg_note (insn, REG_DEAD, op))
@@ -426,7 +429,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
                  break;
 
                case 's':
-                 if (GET_CODE (op) == CONST_INT
+                 if (CONST_INT_P (op)
                      || (GET_CODE (op) == CONST_DOUBLE
                          && GET_MODE (op) == VOIDmode))
                    break;
@@ -438,7 +441,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
                  break;
 
                case 'n':
-                 if (GET_CODE (op) == CONST_INT
+                 if (CONST_INT_P (op)
                      || (GET_CODE (op) == CONST_DOUBLE
                          && GET_MODE (op) == VOIDmode))
                    win = 1;
@@ -452,7 +455,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
                case 'N':
                case 'O':
                case 'P':
-                 if (GET_CODE (op) == CONST_INT
+                 if (CONST_INT_P (op)
                      && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), c, p))
                    win = 1;
                  break;
@@ -533,19 +536,17 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
                {
                  struct costs *pp = this_op_costs[i];
 
-                 if (ira_register_move_cost[mode] == NULL)
-                   ira_init_register_move_cost (mode);
-
                  for (k = 0; k < cost_classes_num; k++)
                    {
                      rclass = cost_classes[k];
                      pp->cost[k]
-                       = ((recog_data.operand_type[i] != OP_OUT
-                           ? ira_may_move_in_cost[mode][rclass]
-                             [classes[i]] * frequency : 0)
-                          + (recog_data.operand_type[i] != OP_IN
-                             ? ira_may_move_out_cost[mode][classes[i]]
-                               [rclass] * frequency : 0));
+                       = (((recog_data.operand_type[i] != OP_OUT
+                            ? ira_get_may_move_cost (mode, rclass,
+                                                     classes[i], true) : 0)
+                           + (recog_data.operand_type[i] != OP_IN
+                              ? ira_get_may_move_cost (mode, classes[i],
+                                                       rclass, false) : 0))
+                          * frequency);
                    }
 
                  /* If the alternative actually allows memory, make
@@ -580,8 +581,9 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
                                 : 0));
                      else if (ira_reg_class_intersect[pref_class][classes[i]]
                               == NO_REGS)
-                       alt_cost += (ira_register_move_cost
-                                    [mode][pref_class][classes[i]]);
+                       alt_cost += ira_get_register_move_cost (mode,
+                                                               pref_class,
+                                                               classes[i]);
                    }
                }
            }
@@ -670,7 +672,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
        {
          unsigned int regno = REGNO (ops[!i]);
          enum machine_mode mode = GET_MODE (ops[!i]);
-         int rclass;
+         enum reg_class rclass;
          unsigned int nr;
 
          if (regno < FIRST_PSEUDO_REGISTER)
@@ -884,7 +886,8 @@ record_address_regs (enum machine_mode mode, rtx x, int context,
     case REG:
       {
        struct costs *pp;
-       int i, k;
+       enum reg_class i;
+       int k;
 
        if (REGNO (x) < FIRST_PSEUDO_REGISTER)
          break;
@@ -894,13 +897,11 @@ record_address_regs (enum machine_mode mode, rtx x, int context,
                               ALLOCNO_NUM (ira_curr_regno_allocno_map
                                            [REGNO (x)]));
        pp->mem_cost += (ira_memory_move_cost[Pmode][rclass][1] * scale) / 2;
-       if (ira_register_move_cost[Pmode] == NULL)
-         ira_init_register_move_cost (Pmode);
        for (k = 0; k < cost_classes_num; k++)
          {
            i = cost_classes[k];
            pp->cost[k]
-             += (ira_may_move_in_cost[Pmode][i][rclass] * scale) / 2;
+             += (ira_get_may_move_cost (Pmode, i, rclass, true) * scale) / 2;
          }
       }
       break;
@@ -1418,8 +1419,9 @@ process_bb_node_for_hard_reg_moves (ira_loop_tree_node_t loop_tree_node)
        continue;
       mode = ALLOCNO_MODE (a);
       hard_reg_class = REGNO_REG_CLASS (hard_regno);
-      cost = (to_p ? ira_register_move_cost[mode][hard_reg_class][rclass]
-             : ira_register_move_cost[mode][rclass][hard_reg_class]) * freq;
+      cost
+       = (to_p ? ira_get_register_move_cost (mode, hard_reg_class, rclass)
+          : ira_get_register_move_cost (mode, rclass, hard_reg_class)) * freq;
       ira_allocate_and_set_costs (&ALLOCNO_HARD_REG_COSTS (a), rclass,
                                  ALLOCNO_COVER_CLASS_COST (a));
       ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
@@ -1572,9 +1574,6 @@ ira_finish_costs_once (void)
 void
 ira_costs (void)
 {
-  ira_allocno_t a;
-  ira_allocno_iterator ai;
-
   allocno_costs = (struct costs *) ira_allocate (max_struct_costs_size
                                               * ira_allocnos_num);
   total_costs = (struct costs *) ira_allocate (max_struct_costs_size
@@ -1587,12 +1586,6 @@ ira_costs (void)
                                       * max_reg_num ());
   find_allocno_class_costs ();
   setup_allocno_cover_class_and_costs ();
-  /* Because we could process operands only as subregs, check mode of
-     the registers themselves too.  */
-  FOR_EACH_ALLOCNO (a, ai)
-    if (ira_register_move_cost[ALLOCNO_MODE (a)] == NULL
-       && have_regs_of_mode[ALLOCNO_MODE (a)])
-      ira_init_register_move_cost (ALLOCNO_MODE (a));
   ira_free (common_classes);
   ira_free (allocno_pref_buffer);
   ira_free (total_costs);