PR rtl-optimization/63340 (part 2)
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 29 Oct 2014 10:02:33 +0000 (10:02 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 29 Oct 2014 10:02:33 +0000 (10:02 +0000)
gcc/
PR rtl-optimization/63340 (part 2)
* rtl.h (invalid_mode_change_p): Delete.
(valid_mode_changes_for_regno): New function.
* reginfo.c (invalid_mode_change_p): Delete.
(valid_mode_changes_for_regno): New function.
* ira-costs.c (setup_regno_cost_classes_by_aclass): Restrict the
classes to registers that are allowed by valid_mode_changes_for_regno.
(setup_regno_cost_classes_by_mode): Likewise.
(print_allocno_costs): Remove invalid_mode_change_p test.
(print_pseudo_costs, find_costs_and_classes): Likewise.

From-SVN: r216829

gcc/ChangeLog
gcc/ira-costs.c
gcc/reginfo.c
gcc/rtl.h

index 8be1f259da1d713869700dcf21efbbef9362d6e0..c40577b29cee27ad0763e9eadefc656fd9881e27 100644 (file)
@@ -1,3 +1,16 @@
+2014-10-29  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR rtl-optimization/63340 (part 2)
+       * rtl.h (invalid_mode_change_p): Delete.
+       (valid_mode_changes_for_regno): New function.
+       * reginfo.c (invalid_mode_change_p): Delete.
+       (valid_mode_changes_for_regno): New function.
+       * ira-costs.c (setup_regno_cost_classes_by_aclass): Restrict the
+       classes to registers that are allowed by valid_mode_changes_for_regno.
+       (setup_regno_cost_classes_by_mode): Likewise.
+       (print_allocno_costs): Remove invalid_mode_change_p test.
+       (print_pseudo_costs, find_costs_and_classes): Likewise.
+
 2014-10-29  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR rtl-optimization/63340 (part 1)
index dbefaced65773749e439f2b160ce8339ebcc1380..76de59af68bfb89d5ea23ff522116910e9d3ea9f 100644 (file)
@@ -387,12 +387,18 @@ setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass)
       classes_ptr = cost_classes_aclass_cache[aclass] = (cost_classes_t) *slot;
     }
   if (regno_reg_rtx[regno] != NULL_RTX)
-    /* Restrict the classes to those that are valid for REGNO's mode
-       (which might for example exclude singleton classes if the mode requires
-       two registers).  */
-    classes_ptr = restrict_cost_classes (classes_ptr,
-                                        PSEUDO_REGNO_MODE (regno),
-                                        reg_class_contents[ALL_REGS]);
+    {
+      /* Restrict the classes to those that are valid for REGNO's mode
+        (which might for example exclude singleton classes if the mode
+        requires two registers).  Also restrict the classes to those that
+        are valid for subregs of REGNO.  */
+      const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno);
+      if (!valid_regs)
+       valid_regs = &reg_class_contents[ALL_REGS];
+      classes_ptr = restrict_cost_classes (classes_ptr,
+                                          PSEUDO_REGNO_MODE (regno),
+                                          *valid_regs);
+    }
   regno_cost_classes[regno] = classes_ptr;
 }
 
@@ -405,11 +411,17 @@ setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass)
 static void
 setup_regno_cost_classes_by_mode (int regno, enum machine_mode mode)
 {
-  if (cost_classes_mode_cache[mode] == NULL)
-    cost_classes_mode_cache[mode]
-      = restrict_cost_classes (&all_cost_classes, mode,
-                              reg_class_contents[ALL_REGS]);
-  regno_cost_classes[regno] = cost_classes_mode_cache[mode];
+  if (const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno))
+    regno_cost_classes[regno] = restrict_cost_classes (&all_cost_classes,
+                                                      mode, *valid_regs);
+  else
+    {
+      if (cost_classes_mode_cache[mode] == NULL)
+       cost_classes_mode_cache[mode]
+         = restrict_cost_classes (&all_cost_classes, mode,
+                                  reg_class_contents[ALL_REGS]);
+      regno_cost_classes[regno] = cost_classes_mode_cache[mode];
+    }
 }
 
 /* Finalize info about the cost classes for each pseudo.  */
@@ -1536,14 +1548,11 @@ print_allocno_costs (FILE *f)
       for (k = 0; k < cost_classes_ptr->num; k++)
        {
          rclass = cost_classes[k];
-         if (! invalid_mode_change_p (regno, (enum reg_class) rclass))
-           {
-             fprintf (f, " %s:%d", reg_class_names[rclass],
-                      COSTS (costs, i)->cost[k]);
-             if (flag_ira_region == IRA_REGION_ALL
-                 || flag_ira_region == IRA_REGION_MIXED)
-               fprintf (f, ",%d", COSTS (total_allocno_costs, i)->cost[k]);
-           }
+         fprintf (f, " %s:%d", reg_class_names[rclass],
+                  COSTS (costs, i)->cost[k]);
+         if (flag_ira_region == IRA_REGION_ALL
+             || flag_ira_region == IRA_REGION_MIXED)
+           fprintf (f, ",%d", COSTS (total_allocno_costs, i)->cost[k]);
        }
       fprintf (f, " MEM:%i", COSTS (costs, i)->mem_cost);
       if (flag_ira_region == IRA_REGION_ALL
@@ -1574,9 +1583,8 @@ print_pseudo_costs (FILE *f)
       for (k = 0; k < cost_classes_ptr->num; k++)
        {
          rclass = cost_classes[k];
-         if (! invalid_mode_change_p (regno, (enum reg_class) rclass))
-           fprintf (f, " %s:%d", reg_class_names[rclass],
-                    COSTS (costs, regno)->cost[k]);
+         fprintf (f, " %s:%d", reg_class_names[rclass],
+                  COSTS (costs, regno)->cost[k]);
        }
       fprintf (f, " MEM:%i\n", COSTS (costs, regno)->mem_cost);
     }
@@ -1813,10 +1821,6 @@ find_costs_and_classes (FILE *dump_file)
          for (k = 0; k < cost_classes_ptr->num; k++)
            {
              rclass = cost_classes[k];
-             /* Ignore classes that are too small or invalid for this
-                operand.  */
-             if (invalid_mode_change_p (i, (enum reg_class) rclass))
-               continue;
              if (i_costs[k] < best_cost)
                {
                  best_cost = i_costs[k];
@@ -1906,11 +1910,7 @@ find_costs_and_classes (FILE *dump_file)
                      rclass = cost_classes[k];
                      if (! ira_class_subset_p[rclass][aclass])
                        continue;
-                     /* Ignore classes that are too small or invalid
-                        for this operand.  */
-                     if (invalid_mode_change_p (i, (enum reg_class) rclass))
-                       ;
-                     else if (total_a_costs[k] < best_cost)
+                     if (total_a_costs[k] < best_cost)
                        {
                          best_cost = total_a_costs[k];
                          allocno_cost = a_costs[k];
index 45af98a165e03202461507aa218825306e430d00..1c1839352cf142215bcbe2ccc6fee7efcfdf907d 100644 (file)
@@ -1333,14 +1333,10 @@ init_subregs_of_mode (void)
         find_subregs_of_mode (PATTERN (insn));
 }
 
-/* Return 1 if REGNO has had an invalid mode change in CLASS from FROM
-   mode.  */
-bool
-invalid_mode_change_p (unsigned int regno, enum reg_class rclass)
+const HARD_REG_SET *
+valid_mode_changes_for_regno (unsigned int regno)
 {
-  return (valid_mode_changes[regno]
-         && !hard_reg_set_intersect_p (reg_class_contents[rclass],
-                                       *valid_mode_changes[regno]));
+  return valid_mode_changes[regno];
 }
 
 void
index ddd39c920cc8f16e90b4026b2a4598d04f14976d..b3fe680bd90b184553bf026aa10d41279576d633 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3468,7 +3468,9 @@ extern void init_reg_sets (void);
 extern void regclass (rtx, int);
 extern void reg_scan (rtx_insn *, unsigned int);
 extern void fix_register (const char *, int, int);
-extern bool invalid_mode_change_p (unsigned int, enum reg_class);
+#ifdef HARD_CONST
+extern const HARD_REG_SET *valid_mode_changes_for_regno (unsigned int);
+#endif
 
 /* In reload1.c */
 extern int function_invariant_p (const_rtx);