diff mbox

patch to fix PR55512

Message ID 50B64D33.3040505@redhat.com
State New
Headers show

Commit Message

Vladimir Makarov Nov. 28, 2012, 5:43 p.m. UTC
The following patch fixes

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55512

   The patch was successfully tested and bootstrapped on x86/x86-64.

   Committed as rev. 193901.

2012-11-28  Vladimir Makarov  <vmakarov@redhat.com>

         PR rtl-optimization/55512
         * lra-assigns.c (assign_by_spills): Assigned arbitrary hard regs
         to failed reload pseudos instead of changing asm pattern.
         * lra-constraints.c (MAX_CONSTRAINT_ITERATION_NUMBER): Increase
         value.

2012-11-28  Vladimir Makarov  <vmakarov@redhat.com>

         PR rtl-optimization/55512
         * gcc.target/i386/pr55512-[1234].c: New tests.
diff mbox

Patch

Index: lra-assigns.c
===================================================================
--- lra-assigns.c	(revision 193871)
+++ lra-assigns.c	(working copy)
@@ -1220,8 +1220,17 @@  assign_by_spills (void)
 
 	  bitmap_initialize (&failed_reload_insns, &reg_obstack);
 	  for (i = 0; i < nfails; i++)
-	    bitmap_ior_into (&failed_reload_insns,
-			     &lra_reg_info[sorted_pseudos[i]].insn_bitmap);
+	    {
+	      regno = sorted_pseudos[i];
+	      bitmap_ior_into (&failed_reload_insns,
+			       &lra_reg_info[regno].insn_bitmap);
+	      /* Assign an arbitrary hard register of regno class to
+		 avoid further trouble with the asm insns.  */
+	      bitmap_clear_bit (&all_spilled_pseudos, regno);
+	      assign_hard_regno
+		(ira_class_hard_regs[regno_allocno_class_array[regno]][0],
+		 regno);
+	    }
 	  EXECUTE_IF_SET_IN_BITMAP (&failed_reload_insns, 0, u, bi)
 	    {
 	      insn = lra_insn_recog_data[u]->insn;
@@ -1230,9 +1239,6 @@  assign_by_spills (void)
 		  asm_p = true;
 		  error_for_asm (insn,
 				 "%<asm%> operand has impossible constraints");
-		  /* Avoid further trouble with this insn.	*/
-		  PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
-		  lra_invalidate_insn_data (insn);
 		}
 	    }
 	  lra_assert (asm_p);
Index: lra-constraints.c
===================================================================
--- lra-constraints.c	(revision 193870)
+++ lra-constraints.c	(working copy)
@@ -3184,7 +3184,7 @@  loc_equivalence_change_p (rtx *loc)
 
 /* Maximum allowed number of constraint pass iterations after the last
    spill pass.	It is for preventing LRA cycling in a bug case.	 */
-#define MAX_CONSTRAINT_ITERATION_NUMBER 15
+#define MAX_CONSTRAINT_ITERATION_NUMBER 30
 
 /* Maximum number of generated reload insns per an insn.  It is for
    preventing this pass cycling in a bug case.	*/
Index: testsuite/gcc.target/i386/pr55512-1.c
===================================================================
--- testsuite/gcc.target/i386/pr55512-1.c	(revision 0)
+++ testsuite/gcc.target/i386/pr55512-1.c	(working copy)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+foo (int x)
+{
+  asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+	    "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+	    "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+	    "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15) : : lab);
+  __builtin_unreachable ();
+ lab:
+  return 0;
+}
Index: testsuite/gcc.target/i386/pr55512-2.c
===================================================================
--- testsuite/gcc.target/i386/pr55512-2.c	(revision 0)
+++ testsuite/gcc.target/i386/pr55512-2.c	(working copy)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#define __builtin_unreachable() do { } while (0)
+
+int
+foo (int x)
+{
+  asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+	    "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+	    "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+	    "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15) : : lab);
+  __builtin_unreachable ();
+ lab:
+  return 0;
+}
Index: testsuite/gcc.target/i386/pr55512-3.c
===================================================================
--- testsuite/gcc.target/i386/pr55512-3.c	(revision 0)
+++ testsuite/gcc.target/i386/pr55512-3.c	(working copy)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+bar (int x)
+{
+  asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+	    "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+	    "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+	    "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15),
+	    "r" (x + 16) : : lab);
+  __builtin_unreachable ();
+ lab:
+  return 0;
+}
Index: testsuite/gcc.target/i386/pr55512-4.c
===================================================================
--- testsuite/gcc.target/i386/pr55512-4.c	(revision 0)
+++ testsuite/gcc.target/i386/pr55512-4.c	(working copy)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#define __builtin_unreachable() do { } while (0)
+
+int
+bar (int x)
+{
+  asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+	    "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+	    "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+	    "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15),
+	    "r" (x + 16) : : lab);
+  __builtin_unreachable ();
+ lab:
+  return 0;
+}