2016-03-31 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Mar 2016 17:51:13 +0000 (17:51 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Mar 2016 17:51:13 +0000 (17:51 +0000)
PR rtl-optimization/70461
* ira-color.c (allocno_copy_cost_saving): Use allocno class if it
is necessary.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234649 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ira-color.c

index dac7727..123987e 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-31  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/70461
+       * ira-color.c (allocno_copy_cost_saving): Use allocno class if it
+       is necessary.
+
 2016-03-31  Martin Liska  <mliska@suse.cz>
 
        PR hsa/70399
index fba8da4..8433479 100644 (file)
@@ -2734,10 +2734,16 @@ static int
 allocno_copy_cost_saving (ira_allocno_t allocno, int hard_regno)
 {
   int cost = 0;
+  enum machine_mode allocno_mode = ALLOCNO_MODE (allocno);
   enum reg_class rclass;
   ira_copy_t cp, next_cp;
 
   rclass = REGNO_REG_CLASS (hard_regno);
+  if (ira_reg_class_max_nregs[rclass][allocno_mode]
+      > ira_class_hard_regs_num[rclass])
+    /* For the above condition the cost can be wrong.  Use the allocno
+       class in this case.  */
+    rclass = ALLOCNO_CLASS (allocno);
   for (cp = ALLOCNO_COPIES (allocno); cp != NULL; cp = next_cp)
     {
       if (cp->first == allocno)
@@ -2754,7 +2760,7 @@ allocno_copy_cost_saving (ira_allocno_t allocno, int hard_regno)
        }
       else
        gcc_unreachable ();
-      cost += cp->freq * ira_register_move_cost[ALLOCNO_MODE (allocno)][rclass][rclass];
+      cost += cp->freq * ira_register_move_cost[allocno_mode][rclass][rclass];
     }
   return cost;
 }