aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2012-11-07 22:11:08 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2012-11-07 22:11:08 +0000
commit350c0fe7ea7052ed84d47bbb12ead214e6c8a726 (patch)
tree6e701ababc34944ad9493d12f7ada4597675a768 /gcc/lra-constraints.c
parent49f20f70ef24b60ceb25ac915e902700e55b9d00 (diff)
downloadgcc-350c0fe7ea7052ed84d47bbb12ead214e6c8a726.zip
gcc-350c0fe7ea7052ed84d47bbb12ead214e6c8a726.tar.gz
gcc-350c0fe7ea7052ed84d47bbb12ead214e6c8a726.tar.bz2
re PR rtl-optimization/55122 (ICE: maximum number of LRA constraint passes is achieved (15))
2012-11-07 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/55122 * lra-constraints.c (match_reload): Sync values for dead input pseudos. 2012-11-07 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/55122 * gcc.dg/pr55122.c: New test. From-SVN: r193310
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index ae8b834..bcba590 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -682,6 +682,11 @@ match_reload (signed char out, signed char *ins, enum reg_class goal_class,
new_out_reg = gen_lowpart_SUBREG (outmode, reg);
else
new_out_reg = gen_rtx_SUBREG (outmode, reg, 0);
+ /* If the input reg is dying here, we can use the same hard
+ register for REG and IN_RTX. */
+ if (REG_P (in_rtx)
+ && find_regno_note (curr_insn, REG_DEAD, REGNO (in_rtx)))
+ lra_reg_info[REGNO (reg)].val = lra_reg_info[REGNO (in_rtx)].val;
}
else
{
@@ -698,6 +703,19 @@ match_reload (signed char out, signed char *ins, enum reg_class goal_class,
it at the end of LRA work. */
clobber = emit_clobber (new_out_reg);
LRA_TEMP_CLOBBER_P (PATTERN (clobber)) = 1;
+ if (GET_CODE (in_rtx) == SUBREG)
+ {
+ rtx subreg_reg = SUBREG_REG (in_rtx);
+
+ /* If SUBREG_REG is dying here and sub-registers IN_RTX
+ and NEW_IN_REG are similar, we can use the same hard
+ register for REG and SUBREG_REG. */
+ if (REG_P (subreg_reg) && GET_MODE (subreg_reg) == outmode
+ && SUBREG_BYTE (in_rtx) == SUBREG_BYTE (new_in_reg)
+ && find_regno_note (curr_insn, REG_DEAD, REGNO (subreg_reg)))
+ lra_reg_info[REGNO (reg)].val
+ = lra_reg_info[REGNO (subreg_reg)].val;
+ }
}
}
else