summaryrefslogtreecommitdiff
path: root/gcc/lra-lives.c
diff options
context:
space:
mode:
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2015-07-09 15:39:53 +0000
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2015-07-09 15:39:53 +0000
commit853a01d6a12b1772a57775b64e7ee06bc02678ef (patch)
tree29d233e4e61f3cd1493734ba7208f952708bef72 /gcc/lra-lives.c
parent75c3f230cd53f464ed35a069842447d577167969 (diff)
downloadgcc-853a01d6a12b1772a57775b64e7ee06bc02678ef.tar.gz
2015-07-09 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/66782 * lra-int.h (struct lra_insn_recog_data): Add comment about clobbered hard regs for arg_hard_regs. * lra.c (lra_set_insn_recog_data): Add clobbered hard regs. * lra-lives.c (process_bb_lives): Process clobbered hard regs. Add condition for processing used hard regs. * lra-constraints.c (update_ebb_live_info, inherit_in_ebb): Process clobbered hard regs. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@225618 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra-lives.c')
-rw-r--r--gcc/lra-lives.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/lra-lives.c b/gcc/lra-lives.c
index edf4a91028e..78f16531559 100644
--- a/gcc/lra-lives.c
+++ b/gcc/lra-lives.c
@@ -814,6 +814,12 @@ process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p)
if (reg->type != OP_IN)
make_hard_regno_born (reg->regno, false);
+ if (curr_id->arg_hard_regs != NULL)
+ for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
+ if (regno >= FIRST_PSEUDO_REGISTER)
+ /* It is a clobber. */
+ make_hard_regno_born (regno - FIRST_PSEUDO_REGISTER, false);
+
sparseset_copy (unused_set, start_living);
sparseset_clear (start_dying);
@@ -829,6 +835,12 @@ process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p)
if (reg->type == OP_OUT && ! reg->early_clobber && ! reg->subreg_p)
make_hard_regno_dead (reg->regno);
+ if (curr_id->arg_hard_regs != NULL)
+ for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
+ if (regno >= FIRST_PSEUDO_REGISTER)
+ /* It is a clobber. */
+ make_hard_regno_dead (regno - FIRST_PSEUDO_REGISTER);
+
if (call_p)
{
if (flag_ipa_ra)
@@ -877,7 +889,8 @@ process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p)
/* Make argument hard registers live. Don't create conflict
of used REAL_PIC_OFFSET_TABLE_REGNUM and the pic pseudo. */
for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
- make_hard_regno_born (regno, true);
+ if (regno < FIRST_PSEUDO_REGISTER)
+ make_hard_regno_born (regno, true);
sparseset_and_compl (dead_set, start_living, start_dying);