diff mbox

patch to fix PR59606

Message ID 52D83012.6060904@redhat.com
State New
Headers show

Commit Message

Vladimir Makarov Jan. 16, 2014, 7:16 p.m. UTC
The following patch fixes an arm wrong generation by LRA

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

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

  Committed as rev. 206677.

2014-01-16  Vladimir Makarov  <vmakarov@redhat.com>

        PR middle-end/59609
        * lra-constraints.c (process_alt_operands): Add printing debug
        info.  Check absence of input/output reloads for matched operands
        too.
diff mbox

Patch

Index: lra-constraints.c
===================================================================
--- lra-constraints.c	(revision 206636)
+++ lra-constraints.c	(working copy)
@@ -1710,7 +1710,6 @@  process_alt_operands (int only_alternati
 			    && MEM_P (*curr_id->operand_loc[m])
 			    && curr_alt[m] == NO_REGS && ! curr_alt_win[m])
 			  continue;
-
 		      }
 		    else
 		      {
@@ -2082,7 +2081,8 @@  process_alt_operands (int only_alternati
 		  int i;
 		  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
 		    if (HARD_REGNO_MODE_OK (i, mode)
-			&& in_hard_reg_set_p (reg_class_contents[this_alternative], mode, i))
+			&& in_hard_reg_set_p (reg_class_contents[this_alternative],
+					      mode, i))
 		      break;
 		  if (i == FIRST_PSEUDO_REGISTER)
 		    winreg = false;
@@ -2095,7 +2095,13 @@  process_alt_operands (int only_alternati
 		badop = false;
 
 	      if (badop)
-		goto fail;
+		{
+		  if (lra_dump_file != NULL)
+		    fprintf (lra_dump_file,
+			     "            alt=%d: Bad operand -- refuse\n",
+			     nalt);
+		  goto fail;
+		}
 
 	      this_alternative_offmemok = offmemok;
 	      if (this_costly_alternative != NO_REGS)
@@ -2132,7 +2138,14 @@  process_alt_operands (int only_alternati
 					       [this_alternative][0],
 					       GET_MODE
 					       (*curr_id->operand_loc[nop])))
-		    goto fail;
+		    {
+		      if (lra_dump_file != NULL)
+			fprintf
+			  (lra_dump_file,
+			   "            alt=%d: Strict low subreg reload -- refuse\n",
+			   nalt);
+		      goto fail;
+		    }
 		  losers++;
 		}
 	      if (operand_reg[nop] != NULL_RTX
@@ -2175,8 +2188,17 @@  process_alt_operands (int only_alternati
 		   && no_output_reloads_p
 		   && ! find_reg_note (curr_insn, REG_UNUSED, op))
 		  || (curr_static_id->operand[nop].type != OP_OUT
-		      && no_input_reloads_p && ! const_to_mem))
-		goto fail;
+		      && no_input_reloads_p && ! const_to_mem)
+		  || (this_alternative_matches >= 0
+		      && (no_input_reloads_p || no_output_reloads_p)))
+		{
+		  if (lra_dump_file != NULL)
+		    fprintf
+		      (lra_dump_file,
+		       "            alt=%d: No input/otput reload -- refuse\n",
+		       nalt);
+		  goto fail;
+		}
 
 	      /* Check strong discouragement of reload of non-constant
 		 into class THIS_ALTERNATIVE.  */