From: Vladimir Makarov Date: Wed, 21 Dec 2016 22:20:11 +0000 (+0000) Subject: re PR rtl-optimization/78580 (Segfault in gcc with multilib (-m32) and -ffixed-*) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bc13623efe35128a825396636f727e342a1847d4;p=gcc.git re PR rtl-optimization/78580 (Segfault in gcc with multilib (-m32) and -ffixed-*) 2016-12-21 Vladimir Makarov PR rtl-optimization/78580 * ira-costs.c (find_costs_and_classes): Make regno_aclass translated into an allocno class. 2016-12-21 Vladimir Makarov PR rtl-optimization/78580 * gcc.target/i386/pr78580.c: New. From-SVN: r243875 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e9ce90d530c..45743607cdb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-12-21 Vladimir Makarov + + PR rtl-optimization/78580 + * ira-costs.c (find_costs_and_classes): Make regno_aclass + translated into an allocno class. + 2016-12-21 Jakub Jelinek PR bootstrap/78817 diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c index bdd5cb5ceb6..7b44f5ce40e 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 2da0d44dfb7..40f671fee28 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-12-21 Vladimir Makarov + + PR rtl-optimization/78580 + * gcc.target/i386/pr78580.c: New. + 2016-12-21 Jakub Jelinek 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 00000000000..fcf36f1be84 --- /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; +}