[RFA] patch to fix PR56903

Vladimir Makarov vmakarov@redhat.com
Thu Apr 11 01:33:00 GMT 2013


The following patch fixes
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56903

In this test case reload pass gets correct value HARD_REGNO_MODE_OK 
because it can not create pseudos (can_create_pseudo) and this was 
actually used that we are in reload (or after reload).  LRA can create 
pseudos therefore it got the wrong answer.  The patch fixes it.

OK for the trunk?

2013-04-10  Vladimir Makarov  <vmakarov@redhat.com>

         PR tree-optimization/56903
         * config/i386/i386.c (ix86_hard_regno_mode_ok): Add
         lra_in_progress for return.

2013-04-10  Vladimir Makarov  <vmakarov@redhat.com>

         PR tree-optimization/56903
         * gcc.target/i386/pr56903.c: New test.

-------------- next part --------------
Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 197679)
+++ config/i386/i386.c	(working copy)
@@ -33976,7 +33976,9 @@ ix86_hard_regno_mode_ok (int regno, enum
 	return true;
       if (!TARGET_PARTIAL_REG_STALL)
 	return true;
-      return !can_create_pseudo_p ();
+      /* LRA can create pseudos but it does not mean that it does not
+	 need to know that the hard register in given mode is OK.  */
+      return lra_in_progress || !can_create_pseudo_p ();
     }
   /* We handle both integer and floats in the general purpose registers.  */
   else if (VALID_INT_MODE_P (mode))
Index: testsuite/gcc.target/i386/pr56903.c
===================================================================
--- testsuite/gcc.target/i386/pr56903.c	(revision 0)
+++ testsuite/gcc.target/i386/pr56903.c	(working copy)
@@ -0,0 +1,18 @@
+/* PR rtl-optimization/56903 */
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+/* { dg-additional-options "-march=pentium3" { target ia32 } } */
+
+int a, *b, c;
+struct S { int s : 1; } *fn1 (void);
+extern int fn3 (void), fn4 (int *);
+
+void
+fn2 (void)
+{
+  int e = fn3 ();
+  char f = c + fn1 ()->s * 4;
+  if (*b && f == e)
+    a = *b;
+  fn4 (b);
+}


More information about the Gcc-patches mailing list