diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ira-costs.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr78580.c | 18 |
4 files changed, 39 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e9ce90d..4574360 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 Jakub Jelinek <jakub@redhat.com> PR bootstrap/78817 diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c index bdd5cb5..7b44f5c 100644 --- a/gcc/ira-costs.c +++ b/gcc/ira-costs.c @@ -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]]); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2da0d44..40f671f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.target/i386/pr78580.c b/gcc/testsuite/gcc.target/i386/pr78580.c new file mode 100644 index 0000000..fcf36f1 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr78580.c @@ -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; +} |