aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-lives.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2015-09-01 19:37:52 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2015-09-01 19:37:52 +0000
commit3363daad0cbf860eebb516030084723ce73eb1e5 (patch)
tree2d86073d67af59894d4756cb8103bb1ed6470ca9 /gcc/lra-lives.c
parentaef90c1d3dd67054bf1f0ca854b14dcdef5745b8 (diff)
downloadgcc-3363daad0cbf860eebb516030084723ce73eb1e5.zip
gcc-3363daad0cbf860eebb516030084723ce73eb1e5.tar.gz
gcc-3363daad0cbf860eebb516030084723ce73eb1e5.tar.bz2
re PR target/61578 (Code size increase for ARM thumb compared to 4.8.x when compiling with -Os)
2015-09-01 Vladimir Makarov <vmakarov@redhat.com> PR target/61578 * lra-lives.c (process_bb_lives): Process move pseudos with the same value for copies and preferences * lra-constraints.c (match_reload): Create match reload pseudo with the same value from single dying input pseudo. From-SVN: r227382
Diffstat (limited to 'gcc/lra-lives.c')
-rw-r--r--gcc/lra-lives.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/gcc/lra-lives.c b/gcc/lra-lives.c
index e139846..1da5204 100644
--- a/gcc/lra-lives.c
+++ b/gcc/lra-lives.c
@@ -726,28 +726,33 @@ process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p)
lra_hard_reg_usage[reg->regno] += freq;
call_p = CALL_P (curr_insn);
+ src_regno = (set != NULL_RTX && REG_P (SET_SRC (set))
+ ? REGNO (SET_SRC (set)) : -1);
+ dst_regno = (set != NULL_RTX && REG_P (SET_DEST (set))
+ ? REGNO (SET_DEST (set)) : -1);
if (complete_info_p
- && set != NULL_RTX
- && REG_P (SET_DEST (set)) && REG_P (SET_SRC (set))
+ && src_regno >= 0 && dst_regno >= 0
/* Check that source regno does not conflict with
destination regno to exclude most impossible
preferences. */
- && ((((src_regno = REGNO (SET_SRC (set))) >= FIRST_PSEUDO_REGISTER
- && ! sparseset_bit_p (pseudos_live, src_regno))
+ && (((src_regno >= FIRST_PSEUDO_REGISTER
+ && (! sparseset_bit_p (pseudos_live, src_regno)
+ || (dst_regno >= FIRST_PSEUDO_REGISTER
+ && lra_reg_val_equal_p (src_regno,
+ lra_reg_info[dst_regno].val,
+ lra_reg_info[dst_regno].offset))))
|| (src_regno < FIRST_PSEUDO_REGISTER
&& ! TEST_HARD_REG_BIT (hard_regs_live, src_regno)))
/* It might be 'inheritance pseudo <- reload pseudo'. */
|| (src_regno >= lra_constraint_new_regno_start
- && ((int) REGNO (SET_DEST (set))
- >= lra_constraint_new_regno_start)
+ && dst_regno >= lra_constraint_new_regno_start
/* Remember to skip special cases where src/dest regnos are
the same, e.g. insn SET pattern has matching constraints
like =r,0. */
- && src_regno != (int) REGNO (SET_DEST (set)))))
+ && src_regno != dst_regno)))
{
int hard_regno = -1, regno = -1;
- dst_regno = REGNO (SET_DEST (set));
if (dst_regno >= lra_constraint_new_regno_start
&& src_regno >= lra_constraint_new_regno_start)
{