re PR rtl-optimization/63210 (ira does not select the best register compared with...
authorZhenqiang Chen <zhenqiang.chen@arm.com>
Wed, 24 Sep 2014 07:00:55 +0000 (07:00 +0000)
committerZhenqiang Chen <zqchen@gcc.gnu.org>
Wed, 24 Sep 2014 07:00:55 +0000 (07:00 +0000)
ChangeLog:
2014-09-24  Zhenqiang Chen  <zhenqiang.chen@arm.com>

PR rtl-optimization/63210
* ira-color.c (assign_hard_reg): Ignore conflict cost if the
HARD_REGNO is not availabe for CONFLICT_A.

testsuite/ChangeLog:
2014-09-24  Zhenqiang Chen  <zhenqiang.chen@arm.com>

* gcc.target/arm/pr63210.c: New test.

From-SVN: r215540

gcc/ChangeLog
gcc/ira-color.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr63210.c [new file with mode: 0644]

index a0de60bbc534fd0ee44e722070a59320361970a6..10dbc523fb4c227af6d02b03ee1666f09aba89ab 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-24  Zhenqiang Chen  <zhenqiang.chen@arm.com>
+
+       PR rtl-optimization/63210
+       * ira-color.c (assign_hard_reg): Ignore conflict cost if the
+       HARD_REGNO is not available for CONFLICT_A.
+
 2014-09-23  Andi Kleen  <ak@linux.intel.com>
 
        * cgraph.h (symtab_node): Add no_reorder attribute.
index 1042eaab48fd5936212383dbf2ff326cab75bccc..841d0d155a936c7778bd0a44ea685bcffc444c10 100644 (file)
@@ -1709,6 +1709,7 @@ assign_hard_reg (ira_allocno_t a, bool retry_p)
         {
          ira_allocno_t conflict_a = OBJECT_ALLOCNO (conflict_obj);
          enum reg_class conflict_aclass;
+         allocno_color_data_t data = ALLOCNO_COLOR_DATA (conflict_a);
 
          /* Reload can give another class so we need to check all
             allocnos.  */
@@ -1780,7 +1781,12 @@ assign_hard_reg (ira_allocno_t a, bool retry_p)
                    hard_regno = ira_class_hard_regs[aclass][j];
                    ira_assert (hard_regno >= 0);
                    k = ira_class_hard_reg_index[conflict_aclass][hard_regno];
-                   if (k < 0)
+                   if (k < 0
+                          /* If HARD_REGNO is not available for CONFLICT_A,
+                             the conflict would be ignored, since HARD_REGNO
+                             will never be assigned to CONFLICT_A.  */
+                       || !TEST_HARD_REG_BIT (data->profitable_hard_regs,
+                                              hard_regno))
                      continue;
                    full_costs[j] -= conflict_costs[k];
                  }
index 2fb28b9f4c00027762e2457f1e6cbaeb281fb62b..a3f51b36d7e1e97eddbd19ae7e44e8e6de8ab36b 100644 (file)
@@ -1,3 +1,7 @@
+2014-09-24  Zhenqiang Chen  <zhenqiang.chen@arm.com>
+
+       * gcc.target/arm/pr63210.c: New test.
+
 2014-09-23  Andi Kleen  <ak@linux.intel.com>
 
        * gcc.dg/noreorder.c: New test.
diff --git a/gcc/testsuite/gcc.target/arm/pr63210.c b/gcc/testsuite/gcc.target/arm/pr63210.c
new file mode 100644 (file)
index 0000000..c3ae928
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do assemble } */
+/* { dg-options "-mthumb -Os " }  */
+/* { dg-require-effective-target arm_thumb1_ok } */
+
+int foo1 (int c);
+int foo2 (int c);
+
+int test (int c)
+{
+  return (foo1 (c) || foo2 (c));
+}
+/* { dg-final { object-size text <= 28 } } */