aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira-costs.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr78580.c18
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;
+}