diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2015-04-07 15:01:07 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2015-04-07 15:01:07 +0000 |
commit | 218823d74ed3928ed6a53f357c5fa9a793d74f00 (patch) | |
tree | 8c7efaba76a58e97e8ad07567a1339e65d02b602 /gcc | |
parent | e488c24ec0923d150df9bd41005aa34ce37245ff (diff) | |
download | gcc-218823d74ed3928ed6a53f357c5fa9a793d74f00.zip gcc-218823d74ed3928ed6a53f357c5fa9a793d74f00.tar.gz gcc-218823d74ed3928ed6a53f357c5fa9a793d74f00.tar.bz2 |
re PR debug/65678 (internal compiler error: in gen_rtx_SUBREG, at emit-rtl.c:909)
2015-04-07 Vladimir Makarov <vmakarov@redhat.com>
PR target/65678
* lra-remat.c (do_remat): Process input and non-input insn
registers separately.
From-SVN: r221901
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lra-remat.c | 21 |
2 files changed, 18 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d4bf73a..9e9c7a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-04-07 Vladimir Makarov <vmakarov@redhat.com> + + PR target/65678 + * lra-remat.c (do_remat): Process input and non-input insn + registers separately. + 2015-04-07 Jakub Jelinek <jakub@redhat.com> PR debug/65678 diff --git a/gcc/lra-remat.c b/gcc/lra-remat.c index 36ea792..a23cb5b 100644 --- a/gcc/lra-remat.c +++ b/gcc/lra-remat.c @@ -1234,22 +1234,25 @@ do_remat (void) for (i = 0; i < nregs; i++) CLEAR_HARD_REG_BIT (live_hard_regs, hard_regno + i); } - else if (reg->type != OP_IN - && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL) + /* Process also hard regs (e.g. CC register) which are part + of insn definition. */ + for (reg = static_id->hard_regs; reg != NULL; reg = reg->next) + if (reg->type == OP_IN + && find_regno_note (insn, REG_DEAD, reg->regno) != NULL) + CLEAR_HARD_REG_BIT (live_hard_regs, reg->regno); + /* Inputs have been processed, now process outputs. */ + for (reg = id->regs; reg != NULL; reg = reg->next) + if (reg->type != OP_IN + && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL) { if ((hard_regno = get_hard_regs (reg, nregs)) < 0) continue; for (i = 0; i < nregs; i++) SET_HARD_REG_BIT (live_hard_regs, hard_regno + i); } - /* Process also hard regs (e.g. CC register) which are part - of insn definition. */ for (reg = static_id->hard_regs; reg != NULL; reg = reg->next) - if (reg->type == OP_IN - && find_regno_note (insn, REG_DEAD, reg->regno) != NULL) - CLEAR_HARD_REG_BIT (live_hard_regs, reg->regno); - else if (reg->type != OP_IN - && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL) + if (reg->type != OP_IN + && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL) SET_HARD_REG_BIT (live_hard_regs, reg->regno); } } |