The following patch fixes https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78580
The patch was successfully tested and bootstrapped on x86-64. Committed to the trunk as rev. 243875.
Index: ChangeLog =================================================================== --- ChangeLog (revision 243873) +++ ChangeLog (working copy) @@ -1,3 +1,9 @@ +2016-12-21 Vladimir Makarov <vmaka...@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 <pthau...@us.ibm.com> PR rtl-optimization/11488 Index: testsuite/ChangeLog =================================================================== --- testsuite/ChangeLog (revision 243873) +++ testsuite/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2016-12-21 Vladimir Makarov <vmaka...@redhat.com> + + PR rtl-optimization/78580 + * gcc.target/i386/pr78580.c: New. + 2016-12-21 Jakub Jelinek <ja...@redhat.com> PR c++/77830 Index: ira-costs.c =================================================================== --- ira-costs.c (revision 243533) +++ ira-costs.c (working copy) @@ -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]]); } Index: testsuite/gcc.target/i386/pr78580.c =================================================================== --- testsuite/gcc.target/i386/pr78580.c (nonexistent) +++ testsuite/gcc.target/i386/pr78580.c (working copy) @@ -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; +}