diff mbox

patch to fix PR78580

Message ID 0293497d-9b1a-b8e3-b3df-f5ee0dbf37e6@redhat.com
State New
Headers show

Commit Message

Vladimir Makarov Dec. 21, 2016, 10:25 p.m. UTC
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.
diff mbox

Patch

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 243873)
+++ ChangeLog	(working copy)
@@ -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
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(revision 243873)
+++ testsuite/ChangeLog	(working copy)
@@ -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
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;
+}