===================================================================
@@ -1,3 +1,9 @@
+2016-12-21 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/78580
+ * ira-costs.c (find_costs_and_classes): Make regno_aclass
+ translated into an allocno class.
+
2016-12-21 Pat Haugen <pthaugen@us.ibm.com>
PR rtl-optimization/11488
===================================================================
@@ -1,3 +1,8 @@
+2016-12-21 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/78580
+ * gcc.target/i386/pr78580.c: New.
+
2016-12-21 Jakub Jelinek <jakub@redhat.com>
PR c++/77830
===================================================================
@@ -1846,14 +1846,19 @@ find_costs_and_classes (FILE *dump_file)
short in -O0 code and so register pressure tends to be low.
Avoid that by ignoring the alternative class if the best
- class has plenty of registers. */
- regno_aclass[i] = best;
+ class has plenty of registers.
+
+ The union class arrays give important classes and only
+ part of it are allocno classes. So translate them into
+ allocno classes. */
+ regno_aclass[i] = ira_allocno_class_translate[best];
else
{
/* Make the common class the biggest class of best and
- alt_class. */
- regno_aclass[i]
- = ira_reg_class_superunion[best][alt_class];
+ alt_class. Translate the common class into an
+ allocno class too. */
+ regno_aclass[i] = (ira_allocno_class_translate
+ [ira_reg_class_superunion[best][alt_class]]);
ira_assert (regno_aclass[i] != NO_REGS
&& ira_reg_allocno_class_p[regno_aclass[i]]);
}
===================================================================
@@ -0,0 +1,18 @@
+/* PR rtl-optimization/78580 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -ffixed-ebx" } */
+
+extern const signed char a;
+
+int
+foo (signed char x)
+{
+ return x;
+}
+
+int
+main ()
+{
+ foo (a);
+ return 0;
+}