diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2015-07-09 15:39:53 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2015-07-09 15:39:53 +0000 |
commit | 9d86e84ec0b576bd3586cf05f6605fee316c9cd4 (patch) | |
tree | 29d233e4e61f3cd1493734ba7208f952708bef72 /gcc/lra-constraints.c | |
parent | c551c21da8eca5bbc4798b7db33c8f3c9f39ec06 (diff) | |
download | gcc-9d86e84ec0b576bd3586cf05f6605fee316c9cd4.zip gcc-9d86e84ec0b576bd3586cf05f6605fee316c9cd4.tar.gz gcc-9d86e84ec0b576bd3586cf05f6605fee316c9cd4.tar.bz2 |
re PR rtl-optimization/66782 (Unable to run 64-bit wine after MS->SYSV register changes)
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.
From-SVN: r225618
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index cdb3a97..7d170b6 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -5149,6 +5149,11 @@ update_ebb_live_info (rtx_insn *head, rtx_insn *tail) for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next) if (reg->type == OP_OUT && ! reg->subreg_p) bitmap_clear_bit (&live_regs, reg->regno); + if (curr_id->arg_hard_regs != NULL) + /* Make clobbered argument hard registers die. */ + for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++) + if (regno >= FIRST_PSEUDO_REGISTER) + bitmap_clear_bit (&live_regs, regno - FIRST_PSEUDO_REGISTER); /* Mark each used value as live. */ for (reg = curr_id->regs; reg != NULL; reg = reg->next) if (reg->type != OP_OUT @@ -5159,9 +5164,10 @@ update_ebb_live_info (rtx_insn *head, rtx_insn *tail) && bitmap_bit_p (&check_only_regs, reg->regno)) bitmap_set_bit (&live_regs, reg->regno); if (curr_id->arg_hard_regs != NULL) - /* Make argument hard registers live. */ + /* Make used argument hard registers live. */ for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++) - if (bitmap_bit_p (&check_only_regs, regno)) + if (regno < FIRST_PSEUDO_REGISTER + && bitmap_bit_p (&check_only_regs, regno)) bitmap_set_bit (&live_regs, regno); /* It is quite important to remove dead move insns because it means removing dead store. We don't need to process them for @@ -5471,6 +5477,12 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail) } } } + /* Process clobbered call regs. */ + if (curr_id->arg_hard_regs != NULL) + for (i = 0; (dst_regno = curr_id->arg_hard_regs[i]) >= 0; i++) + if (dst_regno >= FIRST_PSEUDO_REGISTER) + usage_insns[dst_regno - FIRST_PSEUDO_REGISTER].check + = -(int) INSN_UID (curr_insn); if (! JUMP_P (curr_insn)) for (i = 0; i < to_inherit_num; i++) if (inherit_reload_reg (true, to_inherit[i].regno, @@ -5578,7 +5590,7 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail) add_next_usage_insn (src_regno, use_insn, reloads_num); } } - /* Process call args. */ + /* Process used call regs. */ if (curr_id->arg_hard_regs != NULL) for (i = 0; (src_regno = curr_id->arg_hard_regs[i]) >= 0; i++) if (src_regno < FIRST_PSEUDO_REGISTER) |