aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-10-31 16:00:38 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-10-31 16:00:38 +0000
commit7214306b3e376bff94b20e468018fb356264b33a (patch)
tree1df522176b3ea2c9f93e301107111dccb047243b
parentc1c2162eadef6e5101855bfd130e9aae154210a7 (diff)
downloadgcc-7214306b3e376bff94b20e468018fb356264b33a.zip
gcc-7214306b3e376bff94b20e468018fb356264b33a.tar.gz
gcc-7214306b3e376bff94b20e468018fb356264b33a.tar.bz2
lra-constraints (process_alt_operands): Use the result elimination register for operand when matching constraints.
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lra-constraints.c27
2 files changed, 23 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 99a5034..3da5361 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index a2d348d..ee82c6f 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -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