diff options
author | Alan Modra <amodra@gmail.com> | 2016-05-04 00:13:35 +0930 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2016-05-04 00:13:35 +0930 |
commit | fcc861d975cf423c23c1eb62508afffb7d9e2221 (patch) | |
tree | b7e5fae121b10c3ecaa3f41fe7e34024ab63a9f2 /gcc | |
parent | f3d9004571a9fa52f2aa2cbbee82a4e4c1e9e65b (diff) | |
download | gcc-fcc861d975cf423c23c1eb62508afffb7d9e2221.zip gcc-fcc861d975cf423c23c1eb62508afffb7d9e2221.tar.gz gcc-fcc861d975cf423c23c1eb62508afffb7d9e2221.tar.bz2 |
PR70890, stage2 miscompilation
PR rtl-optimization/70890
* ira.c (combine_and_move_insns): When moving def_insn, remove
equivs on use_insn.
From-SVN: r235825
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ira.c | 16 |
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 095e502..7cd0bd4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-03 Alan Modra <amodra@gmail.com> + + PR rtl-optimization/70890 + * ira.c (combine_and_move_insns): When moving def_insn, remove + equivs on use_insn. + 2016-05-03 Dominik Vogt <vogt@linux.vnet.ibm.com> * config/s390/s390.md ("*r<noxa>sbg_<mode>_sll") @@ -3742,6 +3742,22 @@ combine_and_move_insns (void) if (use_insn == BB_HEAD (use_bb)) BB_HEAD (use_bb) = new_insn; + /* We know regno dies in use_insn, but inside a loop + REG_DEAD notes might be missing when def_insn was in + another basic block. However, when we move def_insn into + this bb we'll definitely get a REG_DEAD note and reload + will see the death. It's possible that update_equiv_regs + set up an equivalence referencing regno for a reg set by + use_insn, when regno was seen as non-local. Now that + regno is local to this block, and dies, such an + equivalence is invalid. */ + if (find_reg_note (use_insn, REG_EQUIV, NULL_RTX)) + { + rtx set = single_set (use_insn); + if (set && REG_P (SET_DEST (set))) + no_equiv (SET_DEST (set), set, NULL); + } + ira_reg_equiv[regno].init_insns = gen_rtx_INSN_LIST (VOIDmode, new_insn, NULL_RTX); bitmap_set_bit (cleared_regs, regno); |