diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2013-10-31 16:00:38 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2013-10-31 16:00:38 +0000 |
commit | 7214306b3e376bff94b20e468018fb356264b33a (patch) | |
tree | 1df522176b3ea2c9f93e301107111dccb047243b | |
parent | c1c2162eadef6e5101855bfd130e9aae154210a7 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 27 |
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 |