lra-constraints (process_alt_operands): Use the result elimination register for opera...
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 31 Oct 2013 16:00:38 +0000 (16:00 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 31 Oct 2013 16:00:38 +0000 (16:00 +0000)
2013-10-31  Vladimir Makarov  <vmakarov@redhat.com>

* lra-constraints (process_alt_operands): Use the result
elimination register for operand when matching constraints.

From-SVN: r204267

gcc/ChangeLog
gcc/lra-constraints.c

index 99a5034689791ff9a7e11368c4744eef537d3b22..3da5361978f45de65bc13df572a83d8ff7f2eff2 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-31  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * lra-constraints (process_alt_operands): Use the result
+       elimination register for operand when matching constraints.
+
 2013-10-31  Jakub Jelinek  <jakub@redhat.com>
 
        * tree-vrp.c (maybe_set_nonzero_bits): New function.
index a2d348d8dfe8c55072ff87e8a7bdbeeaed7bfa21..ee82c6f496c0be229c4f3dd4bee6b02ed55017e5 100644 (file)
@@ -1466,23 +1466,32 @@ process_alt_operands (int only_alternative)
      function. */
   for (nop = 0; nop < n_operands; nop++)
     {
+      rtx reg;
+
       op = no_subreg_reg_operand[nop] = *curr_id->operand_loc[nop];
       /* The real hard regno of the operand after the allocation.  */
       hard_regno[nop] = get_hard_regno (op);
 
-      operand_reg[nop] = op;
-      biggest_mode[nop] = GET_MODE (operand_reg[nop]);
-      if (GET_CODE (operand_reg[nop]) == SUBREG)
+      operand_reg[nop] = reg = op;
+      biggest_mode[nop] = GET_MODE (op);
+      if (GET_CODE (op) == SUBREG)
        {
-         operand_reg[nop] = SUBREG_REG (operand_reg[nop]);
+         operand_reg[nop] = reg = SUBREG_REG (op);
          if (GET_MODE_SIZE (biggest_mode[nop])
-             < GET_MODE_SIZE (GET_MODE (operand_reg[nop])))
-           biggest_mode[nop] = GET_MODE (operand_reg[nop]);
+             < GET_MODE_SIZE (GET_MODE (reg)))
+           biggest_mode[nop] = GET_MODE (reg);
        }
-      if (REG_P (operand_reg[nop]))
-       no_subreg_reg_operand[nop] = operand_reg[nop];
-      else
+      if (! REG_P (reg))
        operand_reg[nop] = NULL_RTX;
+      else if (REGNO (reg) >= FIRST_PSEUDO_REGISTER
+              || ((int) REGNO (reg)
+                  == lra_get_elimination_hard_regno (REGNO (reg))))
+       no_subreg_reg_operand[nop] = reg;
+      else
+       operand_reg[nop] = no_subreg_reg_operand[nop]
+         /* Just use natural mode for elimination result.  It should
+            be enough for extra constraints hooks.  */
+         = regno_reg_rtx[hard_regno[nop]];
     }
 
   /* The constraints are made of several alternatives. Each operand's